如何通过提交钩子控制自动推送到git目标仓库的文件的所有权?

8 git deployment permissions

我创建了一个简单的回购@

/srv/repos/test
Run Code Online (Sandbox Code Playgroud)

我将所有权设置为wwwrun:www设置了SUID + GUID位

chown -R wwwrun:www /srv/repos/hub
chmod ug+s          /srv/repos/hub
ls -ald /srv/repos/test
    drwsrws---+ 10 wwwrun www 4.0K Mar  7 21:28 /srv/repos/hub/
Run Code Online (Sandbox Code Playgroud)

我将回购克隆克隆到了一个webroot,并改变了它的所有权,

git clone /srv/repos/hub /srv/www/siteA
chown -R wwwrun:www      /srv/www/siteA
Run Code Online (Sandbox Code Playgroud)

为方便起见,我定义了一个遥控器

cd /srv/www/siteA
git remote add HUB /srv/repos/hub
Run Code Online (Sandbox Code Playgroud)

然后创建post-commit和post-update挂钩以保持同步,

vi /srv/www/siteA/.git/hooks/post-commit
    #!/bin/sh
    git push HUB

vi /srv/repos/hub/hooks/post-update
    #!/bin/sh
    cd /srv/www/siteA || exit
    unset GIT_DIR
    git pull HUB master
    exec git-update-server-info
Run Code Online (Sandbox Code Playgroud)

作为我的普通用户,我结账HUB

whoami
    locuse
cd ~
git clone /srv/repos/hub WORK
ls -ald WORK
    drwxr-xr-x 10 locuse users 4.0K Mar  7 21:44 WORK/
Run Code Online (Sandbox Code Playgroud)

做出改变,承诺和推动,

cd WORK
touch touch_file
ls -al touch_file
    -rw-r--r-- 1 locuse users 0 Mar  7 21:44 touch_file
git add -A
git commit -m "add test"
git push
Run Code Online (Sandbox Code Playgroud)

然后检查钩子是否被触发并且更新被推送到webroot,

ls -al /srv/www/siteA/touch_file
    -rw-rw----+ 1 locuse www 0 Mar  7 21:45 /srv/www/siteA/touch_file
Run Code Online (Sandbox Code Playgroud)

文件就在那里 - 正如预期的那样.

但是,它不是我想要的用户所有权,即它的用户='locuse'而不是user ='wwwrun'.

在这个特定的用例中,什么是确保i,INSTEAD始终自动结束的正确方法,

ls -al /srv/www/siteA/touch_file
    -rw-rw----+ 1 wwwrun www 0 Mar  7 21:45 /srv/www/siteA/touch_file
Run Code Online (Sandbox Code Playgroud)

?即,所有内容总是被提升为/ srv/www/siteA 作为wwwrun:www.

钩子里的东西,我猜?

我知道我可以添加

chown -R wwwrun:www /srv/www/siteA
Run Code Online (Sandbox Code Playgroud)

post-commit hook,对小树很好用,但是如果它很大(它会是),每次提交/更新都会出现问题.

也许如果我能够有效地只是当前的提交...?

小智 6

这工作,

vi /srv/repos/hub/hooks/post-update
    #!/bin/sh
    cd /srv/www/siteA || exit
    unset GIT_DIR
-   git pull HUB master
+   git fetch HUB master
+   files=`git diff ..FETCH_HEAD --name-only --diff-filter=ACMRTUXB`
+   git merge FETCH_HEAD
+   for file in $files
+   do
+       sudo chown wwwrun:www $file
+   done
    exec git-update-server-info
Run Code Online (Sandbox Code Playgroud)

chown只对标识为在提交集中的文件执行 - 小而快.