我需要执行一些操作(准备 gettext *)。每次我运行 git pull时,在我的项目上。有没有合适的 Git 钩子,我可以用来做这个?
git pull
githooks手册页是一个完整的挂钩列表。如果它不在那里,它就不存在。
githooks
也就是说,有 是一个 合并后的钩子,和所有的拉包括一个合并,虽然不是所有的合并是拉。合并后才能运行,不能影响结果。如果存在冲突,它永远不会被执行; 如果它真的很重要,那么您必须使用 post-commit 钩子来获取它,或者手动调用它。
有关如何使用它的更多细节,请参见 https://git-scm.com/docs/githooks#_post_merge。
首先,将一个名为 post-merge的文件添加到 /path/to/your_project/.git/hooks/
post-merge
/path/to/your_project/.git/hooks/
cd /path/to/your_project/.git/hooks/ touch post-merge
然后,将其所有权更改为与 < your _ project > 文件夹相同(这与 nginx和 php-fpm运行程序相同) ,在我的例子中,我使用 www:www
nginx
php-fpm
www:www
sudo chown www:www post-merge
然后将其文件模式改为775(这样就可以执行了)
sudo chmod 775 post-merge
然后将下面的代码片段放到 post-merge中。要理解代码片段,请参阅 给你(实际上就是我)。
#!/bin/sh # default owner user OWNER="www:www" # changed file permission PERMISSION="664" # web repository directory REPO_DIR="/www/wwwroot/your_project/" # remote repository REMOTE_REPO="origin" # public branch of the remote repository REMOTE_REPO_BRANCH="master" cd $REPO_DIR || exit unset GIT_DIR files="$(git diff-tree -r --name-only --no-commit-id HEAD@{1} HEAD)" for file in $files do sudo chown $OWNER $file sudo chmod $PERMISSION $file done exec git-update-server-info
现在,一切都完成了,回到您的 _ project 文件夹
cd /path/to/your_project/
在您的 _ project 文件夹下运行 git pull,请记住您必须以 root 或 sudo 身份运行(我记得 sudo)
sudo git pull
现在检查从远程存储库提取的新文件,看看它的所有权是否已经更改为 www:www(如果正如预期的那样,新提取文件的所有权应该更改为 www:www)。
这种方法比 sudo chown -R www:www /www/wwwroot/your_project/好得多,因为它只改变了新文件的所有权,而不是全部!假设我刚刚提取了2个新文件,如果你改变了整个文件夹的所有权,这将花费更多的时间和服务器资源(CPU 使用量,内存使用量...) ,这是完全没有必要的。
sudo chown -R www:www /www/wwwroot/your_project/
正如其他答案所指出的,post-merge是最接近真正的 post-pull钩子的,但是 考虑添加一个 post-checkout钩子,如果你想赶上变化后合并失败。
post-pull
post-checkout
来自文件:
当更新工作树之后运行 git-checkout 或 git-switch 时,将调用此钩子。
因此,任何时候你的工作副本发生变化,因为你正在“切换你正在进行的工作”/你的团队中的任何人已经工作,钩运行。
行为不同的一个实际例子是,当您跳回到过去(检查一个提交)时(因为没有合并) ,post-merge不会触发