====== Git ====== ===== Test Scenarios ===== Summary: * When cloning from remote to local or pushing from local to remote, ''www-data'' group ownership and ''770'' permissions are not preserved. * When pushing local changes to remote, the remote master can't be checkout out. References: * [[https://stackoverflow.com/questions/3207728/retaining-file-permissions-with-git |stackoverflow]] question about permissions. * Using [[https://githooks.com/ |git hooks]] to run pre- and post- scripts to fix permissions. ==== Initial Cloning ==== * Create two files in a ''remote'' folder to simulate the wiki install on the server. * Change their permissions and ownership to match what's on the server: ~/gittest/remote$ ls -l total 24 -rwxrwx--- 1 ptruchon www-data 26 Dec 26 10:20 file1.txt -rwxrwx--- 1 ptruchon www-data 26 Dec 26 10:20 file2.txt * Initialize git: git init git add . git commit -m 'initial commit on remote' git log commit 0e5ccdedd1c9188996aadad3a8e2be5a319ab789 (HEAD -> master) Author: Patrick Truchon Date: Sun Dec 26 10:21:24 2021 -0800 initial commit on remote * Create a local folder and clone from remote: git clone ~/gittest/remote/ ~/gittest/local/ * The log on the local copy looks good: ~/gittest/local$ git log commit 0e5ccdedd1c9188996aadad3a8e2be5a319ab789 (HEAD -> master, origin/master, origin/HEAD) Author: Patrick Truchon Date: Sun Dec 26 10:21:24 2021 -0800 initial commit on remote * But the ''www-data'' group ownership and the 770 permissions weren't preserved: ~/gittest/local$ ls -l total 24 -rwxrwxr-x 1 ptruchon ptruchon 26 Dec 26 10:24 file1.txt -rwxrwxr-x 1 ptruchon ptruchon 26 Dec 26 10:24 file2.txt * Change the group back to ''www-data'' and permissions back to 770: sudo chgrp www-data *; chmod 770 * ls -l total 24 -rwxrwx--- 1 ptruchon www-data 26 Dec 26 10:24 file1.txt -rwxrwx--- 1 ptruchon www-data 26 Dec 26 10:24 file2.txt ==== Making Local Changes ==== * Edit ''file1.txt'' from the local directory. ~/gittest/local$ git status On branch master Your branch is up to date with 'origin/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: file1.txt no changes added to commit (use "git add" and/or "git commit -a") * Commit changes in git: git add . git commit -m 'changed file1.txt from local' git status On branch master Your branch is ahead of 'origin/master' by 1 commit. (use "git push" to publish your local commits) nothing to commit, working tree clean git log commit b7d91058fed9fe64c96525a3d0bef56c682ade68 (HEAD -> master) Author: Patrick Truchon Date: Sun Dec 26 10:45:41 2021 -0800 changed file1.txt from local commit 0e5ccdedd1c9188996aadad3a8e2be5a319ab789 (origin/master, origin/HEAD) Author: Patrick Truchon Date: Sun Dec 26 10:21:24 2021 -0800 initial commit on remote ==== Push Changes to Remote ==== * Attempting to push changes to remote while master is still checked out on remote doesn't work: ~/gittest/local$ git push origin master Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 329 bytes | 329.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: error: refusing to update checked out branch: refs/heads/master remote: error: By default, updating the current branch in a non-bare repository remote: is denied, because it will make the index and work tree inconsistent remote: with what you pushed, and will require 'git reset --hard' to match remote: the work tree to HEAD. remote: remote: You can set the 'receive.denyCurrentBranch' configuration variable remote: to 'ignore' or 'warn' in the remote repository to allow pushing into remote: its current branch; however, this is not recommended unless you remote: arranged to update its work tree to match what you pushed in some remote: other way. remote: remote: To squelch this message and still keep the default behaviour, set remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'. To /home/ptruchon/gittest/remote/ ! [remote rejected] master -> master (branch is currently checked out) error: failed to push some refs to '/home/ptruchon/gittest/remote/' * Workaround is to checkout a temporary branch on remote: ~/gittest/remote$ git checkout -b tmp Switched to a new branch 'tmp' * Then push the local changes to remote: ~/gittest/local$ git push origin master Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Delta compression using up to 4 threads Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 329 bytes | 329.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) To /home/ptruchon/gittest/remote/ 0e5ccde..b7d9105 master -> master * Check status and log from local: ~/gittest/local$ git status On branch master Your branch is up to date with 'origin/master'. nothing to commit, working tree clean ~/gittest/local$ git log commit b7d91058fed9fe64c96525a3d0bef56c682ade68 (HEAD -> master, origin/master, origin/HEAD) Author: Patrick Truchon Date: Sun Dec 26 10:45:41 2021 -0800 changed file1.txt from local commit 0e5ccdedd1c9188996aadad3a8e2be5a319ab789 Author: Patrick Truchon Date: Sun Dec 26 10:21:24 2021 -0800 initial commit on remote * On remote, checkout master and delete the temporary branch ~/gittest/remote$ git checkout master; git branch -d tmp Switched to branch 'master' Deleted branch tmp (was 0e5ccde). * Status and log both look good: git status On branch master nothing to commit, working tree clean git log commit b7d91058fed9fe64c96525a3d0bef56c682ade68 (HEAD -> master) Author: Patrick Truchon Date: Sun Dec 26 10:45:41 2021 -0800 changed file1.txt from local commit 0e5ccdedd1c9188996aadad3a8e2be5a319ab789 Author: Patrick Truchon Date: Sun Dec 26 10:21:24 2021 -0800 initial commit on remote * But group ownership of the modified file wasn't preserved ~/gittest/remote$ ls -l total 24 -rwxrwxr-x 1 ptruchon ptruchon 50 Dec 26 12:01 file1.txt -rwxrwx--- 1 ptruchon www-data 26 Dec 26 10:20 file2.txt