使用git post-merge修复权限问题

9
在我工作的某个服务器上,由于某些原因我们必须以root身份登录。我们设置了一个用于Web服务器的git仓库,但是由于文件是以root身份创建的,因此被git修改的文件权限不正确。
我创建了一个非常简单的post-merge钩子,我认为这可以解决问题。
#!/bin/bash
. git-sh-setup
chown -R www-data:www-data $GIT_DIR

我将这个文件放入了.git/hooks/post-merge,给予了执行权限,但这个文件似乎从来没有运行过。这是我第一次尝试设置钩子,所以也许我漏掉了一些显而易见的东西。
有一件事情我注意到了,大多数钩子都有一个.sample文件,而后置合并没有。(git版本1.7.4)
提前感谢!

你尝试过添加echo或编写tmp文件以确保它没有运行吗?为什么是post-merge(在git pull上)而不是post-receive(在git push上)?如果您不直接在服务器上执行git pull,那么特定的钩子(post-merge)将不会运行。. git-sh-setup这一行的作用是什么? - VonC
我尝试编写了一个临时文件。看起来它没有被执行。而且我直接在服务器上拉取。我的理解是git-sh-setup准备必要的环境变量。 - Michael Mior
你能否发布你在执行pull命令时使用的实际命令(并期望脚本被运行)? - Bjarke Freund-Hansen
不是在我拉取代码时,而是在我合并代码时触发。例如:git merge origin/feature-branch。理想情况下,我也希望这个钩子可以在 git reset 时运行。实际上,只要 git 操作了该目录中的任何文件,我都希望运行这个钩子。 - Michael Mior
嘿,我知道这是一个旧的帖子,但你最终解决了吗?我希望将chgrp -R group_name $GIT_DIR添加为文件post-merge。下面没有看到任何好的答案... :q - Jennings
@ Jennings 我接受了解决我的问题的答案。如果你有不同的问题,我建议你提出一个新的问题。 - Michael Mior
4个回答

2
你可能已经知道了,但你可能需要检查下你的合并后钩子中的EOL字符(CRs)。这可能会解释为什么你的钩子没有执行(就像在这个问题中提到的那样)。
如果这不是解决方案,你还可以尝试另一种方法来解决你的问题。当服务器上的存储库中的文件更改时,你可以创建一个任务来执行目录的所有者更改。 Cron任务本身不会根据文件系统更改而做出反应,但你可以尝试使用类似inotify的东西来响应服务器的git存储库上的任何更改。
我希望这两条信息可以解决你的问题或至少让你更接近解决。祝你好运。

没错,inotify可以工作。看起来没有更好的方法。 - Michael Mior

0

请确保将脚本添加到超级用户组所有权。


脚本是以root用户创建的。 - Michael Mior

-1

看一下 "git achievements" 的工作方式。将 git 包装在脚本中并在任何命令中执行所需的操作会更容易。钩子主要设计用于远程存储库而非本地。合并是在本地完成的,因此您不会从挂钩机制中得到太多帮助。

链接:

http://benjamin-meyer.blogspot.com/2010/03/git-achievements.html

希望这能有所帮助。

为什么这很混乱?Git是为脚本编写而设计的。实际上,你使用的大多数git命令都是bash脚本。不要试图通过钩子来修复这个圆形钉子放入方形孔的问题。合并是将工作重点放在工作树中的事情。脚本是你的救星。 - Adam Dymitruk
1
如果钩子按照我的预期工作,我的解决方案可能只需要两三行shell脚本。编写git的包装器,虽然可能仍然相对简单,但至少复杂度增加了一个数量级。 - Michael Mior

-1
也许你正在寻找 post-receive hook,如果你希望脚本在远程仓库被推送时执行。

不,我想使用 post-merge 钩子。 - Michael Mior

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接