[[https://pctresearch.com/|{{:wiki_banner.jpg?nolink&800|}}]] ===== Manage Configuration Files with Git ===== ex) ^username|pctr| ^mail address|pctresearch@pctresearch.com| ==== Case1: user home directory ==== $ cd ~/ # /home/pctr $ cat .gitconfig [user] name = pctr email = pctresearch@pctresearch.com [core] editor = code [merge] tool = meld [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED" [mergetool "meld"] trustExitCode = false [difftool] Prompt = false [difftool "meld"] cmd = meld "$LOCAL" "$REMOTE" $ cat .gitignore # Ignore all * # Unignore all start with dot files #!.* # Unignore specific start with dot dirs !.ssh/ .ssh/* # Unignore specific files !.bash_logout !.bashrc !.gitconfig !.gitignore !.profile !.vimrc !.ssh/config === Initializes a new Git repository in the current directory. === $ git init === Shows the current state of your repository === $ git status You can view tracked files in specific directories with: ex) $ git status .ssh/* === stage the modified and new files. === $ git add -A === Creates a new commit with the changes in the staging area and specifies the commit message inline.=== $ git commit -m “ done. === To list all files currently being tracked under the branch master, use ls-tree:=== $ git ls-tree -r master --name-only .bash_logout .bashrc .gitconfig .gitignore .motd_shown .profile .ssh/config .sudo_as_admin_successful .vimrc ==== Backup configure files in home directory ==== If you want to make backup in /backup/home: $ sudo mkdir -p /backup/home $ sudo chown pctr:pctr /backup/home $ cd /backup/home $ git clone /home/pctr And you can update backup with: $ cd /backup/home/pctr $ git remote -v # For confirmation origin /home/pctr (fetch) origin /home/pctr (push) $ git fetch $ git pull /home/pctr master From /home/pctr * branch master -> FETCH_HEAD Already up to date. ==== Case2: under certain root owner directories (E.g. /etc ==== This time we are going to make git repository in "/etc". You can do this in other directories like "/usr". fundamentally, same as ''**Case1**'' .gitconfig is same. $ cat /.gitconfig [user] name = pctr email = pctresearch@pctresearch.com [core] editor = code [merge] tool = meld [mergetool "meld"] cmd = meld "$LOCAL" "$MERGED" "$REMOTE" --output "$MERGED" [mergetool "meld"] trustExitCode = false [difftool] Prompt = false [difftool "meld"] cmd = meld "$LOCAL" "$REMOTE" If you have apache2, ssh and ufw installed and configured, the .gitignore will look like this. $ cat /.gitignore # .gitignore for /etc # Ignore all * # ssh !ssh/ ssh/* # ufw !ufw/ ufw/* !ufw/applications.d/ ufw/applications.d/* !ufw/applications.d/apache2/ # apache2 !apache2/ apache2/* !apache2/sites-available/ apache2/sites-available/* !apache2/sites-enabled/ apache2/sites-enabled/* !apache2/mods-enabled/ apache2/mods-enabled/* !apache2/conf-available/ apache2/conf-available/* # apache2 config !apache2/sites-available/wweb.conf !apache2/sites-enabled/wweb_ssl.conf !apache2/apache2.conf !apache2/envvars !apache2/mods-enabled/dir.conf !apache2/conf-available/serve-cgi-bin.conf !apache2/sites-available/default-ssl.conf !apache2/sites-available/wweb_ssl.conf # Unignore specific files !.gitignore !.gitconfig # ssh config !ssh/ssh_config # ufw config !ufw/ufw.conf !ufw/applications.d/apache2-utils.ufw.profile !ufw/applications.d/openssh-server === Initializes a new Git repository in the current directory. === $ cd /etc $ sudo git init === Shows the current state of your repository === $ git status On branch master No commits yet Untracked files: (use "git add ..." to include in what will be committed) .gitconfig .gitignore apache2/ ssh/ ufw/ You can view tracked files in specific directories with: ex) $ git status apache2/* On branch master No commits yet Untracked files: (use "git add ..." to include in what will be committed) apache2/apache2.conf apache2/conf-available/ apache2/envvars apache2/mods-enabled/ apache2/sites-available/ apache2/sites-enabled/ nothing added to commit but untracked files present (use "git add" to track) $ git status apache2/conf-available/* On branch master No commits yet Untracked files: (use "git add ..." to include in what will be committed) apache2/conf-available/serve-cgi-bin.conf nothing added to commit but untracked files present (use "git add" to track) === stage the modified and new files. === $ sudo git add -A Check git status. $ git status On branch master No commits yet Changes to be committed: (use "git rm --cached ..." to unstage) new file: .gitconfig new file: .gitignore new file: apache2/apache2.conf new file: apache2/conf-available/serve-cgi-bin.conf new file: apache2/envvars new file: apache2/mods-enabled/dir.conf new file: apache2/sites-available/default-ssl.conf new file: apache2/sites-available/wweb.conf new file: apache2/sites-available/wweb_ssl.conf new file: apache2/sites-enabled/wweb_ssl.conf new file: ssh/ssh_config new file: ufw/applications.d/apache2-utils.ufw.profile new file: ufw/applications.d/openssh-server new file: ufw/ufw.conf === Creates a new commit with the changes in the staging area and specifies the commit message inline.=== $ sudo git commit -m "apache2 ssh ufw" $ sudo git commit -m "apache2 ssh ufw" [master (root-commit) 44f6c7b] apache2 ssh ufw .... 14 files changed, 656 insertions(+) create mode 100644 .gitconfig create mode 100644 .gitignore create mode 100644 apache2/apache2.conf create mode 100644 apache2/conf-available/serve-cgi-bin.conf create mode 100644 apache2/envvars create mode 120000 apache2/mods-enabled/dir.conf create mode 100644 apache2/sites-available/default-ssl.conf create mode 100644 apache2/sites-available/wweb.conf create mode 100644 apache2/sites-available/wweb_ssl.conf create mode 120000 apache2/sites-enabled/wweb_ssl.conf create mode 100644 ssh/ssh_config create mode 100644 ufw/applications.d/apache2-utils.ufw.profile create mode 100644 ufw/applications.d/openssh-server create mode 100644 ufw/ufw.conf done. === To list all files currently being tracked under the branch master, use ls-tree:=== $ git ls-tree -r master --name-only .gitconfig .gitignore apache2/apache2.conf apache2/conf-available/serve-cgi-bin.conf apache2/envvars apache2/mods-enabled/dir.conf apache2/sites-available/default-ssl.conf apache2/sites-available/wweb.conf apache2/sites-available/wweb_ssl.conf apache2/sites-enabled/wweb_ssl.conf ssh/ssh_config ufw/applications.d/apache2-utils.ufw.profile ufw/applications.d/openssh-server ufw/ufw.conf ==== Backup configure files in /etc directory ==== If you want to make backup in /backup/etc : $ sudo mkdir -p /backup $ cd /backup $ sudo git clone /etc This will allow you to run "git status" without sudo: $ git config --global --add safe.directory /backup/etc $ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean You can update backup with: $ cd /backup/etc $ git remote -v # For confirmation origin /etc (fetch) origin /etc (push) $ sudo git fetch $ git pull /etc master From /etc * branch master -> FETCH_HEAD Already up to date. ==== For reference ==== Sample of ''**/usr/.gitignore**'' $ cat /usr/.gitignore # .gitignore file for /usr # Ignore all * # Unignore specific dirs !local/ local/* !local/bin/ local/bin/* # ssl certificate !/usr/share/ /usr/share/* !/usr/share/ssl-cert/ /usr/share/ssl-cert/* # ssl certificate config !/usr/share/ssl-cert/ssleay.cnf !/usr/share/ssl-cert/ssleay_wweb.cnf # /usr/loval/bin # your original shell !local/bin/ialert.sh !local/bin/inwatch.sh # Unignore specific files !.gitignore !.gitconfig Another sample of ''**/etc/.gitignore**'' $ cat /etc/.gitignore # Ignore all * # Unignore all start with dot files !.* # ignore all start with dot dirs #.*/ # Unignore specific dirs !apache2/ !ssh/ !ufw/ !samba/ !gdm3/ !timeshift/ !postfix/ !dovecot/ !cron.d/ !pam.d/ # Unignore .json files !*.json # Unignore .conf files !*.conf # Unignore specific files !authorized_keys !id_rsa.pub !known_hosts !profile !hostname !hosts !hosts.allow !hosts.deny !aliases # pam.d !pam.d/atd !pam.d/common-session !pam.d/gdm-launch-environment !pam.d/newusers !pam.d/smtp !pam.d/chfn !pam.d/common-session-noninteractive !pam.d/gdm-password !pam.d/other !pam.d/sshd !pam.d/chpasswd !pam.d/cron !pam.d/gdm-smartcard !pam.d/passwd !pam.d/su !pam.d/chsh !pam.d/cups !pam.d/gdm-smartcard-pkcs11-exclusive !pam.d/ppp !pam.d/sudo !pam.d/common-account !pam.d/dovecot !pam.d/gdm-smartcard-sssd-exclusive !pam.d/runuser !pam.d/sudo-i !pam.d/common-auth !pam.d/gdm-autologin !pam.d/gdm-smartcard-sssd-or-password !pam.d/runuser-l !pam.d/sudo.org !pam.d/common-password !pam.d/gdm-fingerprint !pam.d/login !pam.d/samba !pam.d/su-l # apache2 !apache2/envvars !apache2/conf-available !apache2/conf-enabled !apache2/sites-available !apache2/sites-enabled # ssh !ssh/ssh_config !ssh/sshd_config !ssh/ssh_host_rsa_key.pub # ufw !ufw/ufw.conf !ufw/applications.d/ ufw/applications.d/* !ufw/applications.d/apache2-utils.ufw.profile !ufw/applications.d/cups !ufw/applications.d/dovecot-imapd !ufw/applications.d/dovecot-pop3d !ufw/applications.d/openssh-server !ufw/applications.d/postfix !ufw/applications.d/samba # postfix postfix/* !postfix/main.cf # dovecot dovecot/* !dovecot/conf.d/ dovecot/conf.d/* !dovecot/dovecot.conf !dovecot/conf.d/10-ssl.conf # cron.d !cron.d/anacron !cron.d/clamscan !cron.d/dokuwiki !cron.d/e2scrub_all !cron.d/php !cron.d/.placeholder !cron.d/sysstat !cron.d/timeshift-hourly # ignore .tmp .org files *.tmp *.org .bash_history .lesshst # definisions hereunder are not necessary. #ignore .git/ .git/ # Prerequisites #*.d # Compiled Object files *.slo *.lo *.o *.obj # Precompiled Headers *.gch *.pch # Compiled Dynamic libraries *.so *.dylib *.dll # Fortran module files *.mod *.smod # Compiled Static libraries *.lai *.la *.a *.lib # Executables *.exe *.out *.app ===== Usefull Command ===== ==== Restore an Unintentionally Modified Config File ==== $ git status On branch master Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git restore ..." to discard changes in working directory) modified: $ git restore or $ sudo git restore ==== Check Modified History ==== $ git log commit d66c386b161b6c6447aa8f6a2845cdfe23d94f45 (HEAD -> master) Author: pctr Date: Thu Feb 27 08:09:26 2025 +0900 .gitignore commit e22036cf2557d4ab99095ede6e1c293787f9d152 Author: pctr Date: Thu Feb 20 04:28:24 2025 +0900 add ssh setting commit d474b84927877651e3b8725c6c7d1d3780c4b6c4 Author: pctr Date: Wed Feb 19 20:02:35 2025 +0900 Customize some configuration files commit 8175285fb6420ddd2bd23df18e7f8c9c74e9e830 Author: pctr Date: Wed Feb 19 19:54:01 2025 +0900 initial status $ cgit diff 8175285fb6420ddd2bd23df18e7f8c9c74e9e830..HEAD .bashrc diff --git a/.bashrc b/.bashrc index b488fcc..a369f62 100644 --- a/.bashrc +++ b/.bashrc @@ -8,6 +8,16 @@ case $- in *) return;; esac +blk='\[\033[01;30m\]' # Black +red='\[\033[01;31m\]' # Red +grn='\[\033[01;32m\]' # Green +ylw='\[\033[01;33m\]' # Yellow +blu='\[\033[01;34m\]' # Blue +pur='\[\033[01;35m\]' # Purple +cyn='\[\033[01;36m\]' # Cyan +wht='\[\033[01;37m\]' # White +clr='\[\033[00m\]' # Reset + # don't put duplicate lines or lines starting with space in the history. # See bash(1) for more options HISTCONTROL=ignoreboth @@ -57,7 +67,8 @@ if [ -n "$force_color_prompt" ]; then fi if [ "$color_prompt" = yes ]; then - PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +# PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' + PS1='${debian_chroot:+($debian_chroot)}'${grn}'\u@\h'${clr}':'${blu}'\w\n'${clr} else PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' fi @@ -115,3 +126,23 @@ if ! shopt -oq posix; then . /etc/bash_completion fi fi +alias sudo='sudo ' +alias cpu10='ps -L aux | sort -nr -k 3 | head -10' +alias mem10='ps -L aux | sort -nr -k 4 | head -10' +alias lsmount='mount |column -t' +alias sshk='ssh -p 65342 kan@win10kan2' +alias sshuk='ssh -p 65342 kan@ubuntukan' +alias vimn='vim.nox -u ~/.vimrc ' +alias ggit='export GIT_EXTERNAL_DIFF=git-meld-diff && git ' +alias cgit='unset GIT_EXTERNAL_DIFF && git ' + +function git_branch() { + if [ -d .git ] ; then + printf "%s" "($(git branch 2> /dev/null | awk '/\*/{print $2}'))"; + fi +} + +PS_GIT='$(git_branch)' +#PS1=${cyn}${PS_GIT}${clr}${PS1}${pur}'\n'${clr}'\$ ' +PS1=${cyn}${PS_GIT}${clr}${PS1}${pur}''${clr}'\$ ' + (END) ==== Restore a Specific Historical Revision of a Specific Config File ==== $ git restore --source d474b84927877651e3b8725c6c7d1d3780c4b6c4 .gitignore $ git restore is equal to : $ git restore --source HEAD