繁体   English   中英

有拉钩用的git吗?

[英]Is there any git hook for pull?

每次运行git pull时,我都需要对我的项目执行一些操作(准备 gettext *.mo 消息文件)。 有没有合适的 git 挂钩,我可以使用它吗?

githooks手册页是完整的钩子列表。 如果它不在那里,它就不存在。

这就是说,一个后合并挂钩,所有的拉包括合并,虽然不是所有的合并是拉。 它在合并后运行,不会影响结果。 如果有冲突,它永远不会被执行; 如果真的很重要,您必须使用 post-commit 挂钩来选择它,或者手动调用它。

post-merge - 有关如何使用它的更多详细信息,请参阅https://git-scm.com/docs/githooks#_post_merge

这种方法对我有用。

首先,添加一个名为post-merge的文件到/path/to/your_project/.git/hooks/

cd /path/to/your_project/.git/hooks/
touch post-merge

然后,将其所有权更改为与 <your_project> 文件夹相同(这与nginxphp-fpm runner 相同),就我而言,我使用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

一切都完成了,现在,go 回到 your_project 文件夹

cd /path/to/your_project/

运行git pull your_project 文件夹下,记住你必须以 root 或 sudo 运行(我记得 sudo)

sudo git pull

现在检查从远程存储库中提取的新文件,查看其所有权是否已更改为www:www (如果符合预期,则新拉取文件的所有权应更改为www:www )。

这种方法比sudo chown -R www:www /www/wwwroot/your_project/好得多,因为它只更改新文件的所有权,而不是全部,假设我只是拉了 2 个新文件,如果你改变了整个文件夹的所有权,它会花费更多的时间和服务器资源(cpu 使用率。memory 使用率..,)。 这是完全没有必要的。

正如其他答案所指出的那样, post-merge最接近真正post-pull hook,但可以考虑使用post-checkout hook 作为替代方案。

从文档:

在更新工作树后运行 git-checkout 或 git-switch 时会调用此挂钩。

因此,只要您的工作副本发生更改,因为您正在“切换您正在处理的内容”/您团队中的任何人都在处理,那么钩子就会运行。

行为不同的一个实际示例是,当您跳回(检查提交)过去时, post-merge不会触发(因为没有合并)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM