有没有git hook可以拉取?

问题描述 投票:0回答:5

每次运行

git pull
时,我都需要在我的项目上执行一些操作(准备 gettext *.mo 消息文件)。有没有合适的 git hook,我可以用它来实现这个目的?

git hook gettext
5个回答
230
投票

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

也就是说,有 is 一个 post-merge hook,所有拉取都包含合并,尽管并非所有合并都是拉取。它在合并后运行,不会影响结果。如果存在冲突,它永远不会被执行;如果确实重要的话,您必须使用提交后挂钩来选择它,或者手动调用它。


20
投票

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


3
投票

这个方法对我有用。

首先,将名为

post-merge
的文件添加到
/path/to/your_project/.git/hooks/

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

然后,将其所有权更改为与 文件夹相同(这与

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/

在your_project文件夹下运行

git pull
,记住你必须以root或sudo运行(我记得sudo)

sudo git pull

现在检查从远程存储库拉取的新文件,看看其所有权是否已更改为

www:www
(如果符合预期,则新拉取的文件的所有权应更改为
www:www
)。

这种方法比

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


1
投票
正如其他答案所指出的那样,

post-merge
最接近真正的
post-pull
钩子,但是 如果您想捕获合并后未命中的更改,请考虑添加
post-checkout
钩子。

来自文档:

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

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

行为不同的一个实际示例是,当您跳回到过去(查看提交)时,

post-merge
不会触发(因为没有合并)


0
投票

迟到参与讨论。我想要类似的东西,对我有用的钩子是:

  pre-merge-commit

只是想提一下,以防它可以帮助其他人解决这些问题。

© www.soinside.com 2019 - 2024. All rights reserved.