[开始时,我研究了这个问题,它似乎是与此主题相关的唯一问题:
但是我不明白这是什么钩子或如何使用它。我只是想运行一个小脚本,如果我git pull
和新标签被接收。
我尝试将其放入:.git/hooks/update
,.git/hooks/post-receive
#!/bin/bash
exec < /dev/tty
CURRENT_TAG=$(git tag --contains)
echo Test Test
echo "LATEST_TAG: \"${CURRENT_TAG}"\" > "config/latest_tag.yml"
如果可能,我想使用Git钩子。我当时想做alias "git pull"="git pull && ./update_script.sh
,但我不能给空格加上别名,也不能给某些东西加上别名并让团队的其他成员记住它。
作为the documentation says,接收后和更新钩子是“服务器”侧钩子,即它们响应客户端的推送而在服务器上运行。您想要的是相反的,不幸的是,没有钩。
由于您提到对命令进行别名操作不起作用,因此可以将函数用作下一个最佳选择。它将接收然后可以检查的参数。
git() { env git $* && [ "$1" = "fetch" -o "$1" = "pull" ] && ./update_script.sh; }
当屏蔽这样的命令时,必须小心,以免引起无限递归。在函数体内,您绝不能直接调用git
,因为那样会重新运行该函数,而不是git
命令。我已经使用env
来解析实际的git
二进制文件,但使用绝对路径也可以。
请注意,实际上是git fetch
将获得新标签,并且git pull
只是在内部调用git fetch
。因此,我包括了对fetch
和pull
的处理。另请注意,它将在所有存储库中隐藏git命令,因此,如果仅对特定存储库应用特殊处理,则需要对其进行扩展。
如果在存储库本身中跟踪了您的update_script.sh
,则至少要注意两件事:
pull
或fetch
命令可以在工作树中的任何位置运行,而不仅仅是在顶层,因此应首先使用[env] git rev-parse --show-toplevel
来解析路径。