在 Git 中签出新分支后,有没有办法触发挂钩?
问问题
30262 次
4 回答
52
git hook 是放置在存储库的特殊位置的脚本,该位置是:
.git/钩子
该脚本可以是您可以在您的环境中执行的任何类型,例如 bash、python、ruby 等。
结帐后执行的钩子是post-checkout。从文档:
...钩子有三个参数...
例子:
创建钩子(脚本):
touch .git/hooks/post-checkout chmod u+x .git/hooks/post-checkout
挂钩示例内容:
#!/bin/bash
set -e
printf '\npost-checkout hook\n\n'
prevHEAD=$1
newHEAD=$2
checkoutType=$3
[[ $checkoutType == 1 ]] && checkoutType='branch' ||
checkoutType='file' ;
echo 'Checkout type: '$checkoutType
echo ' prev HEAD: '`git name-rev --name-only $prevHEAD`
echo ' new HEAD: '`git name-rev --name-only $newHEAD`
注意:第一行的 shebang 表示脚本的类型。
这个脚本(git hook)只会捕获传递的三个参数,并以人性化的格式打印出来。
于 2014-01-02T22:18:21.423 回答
40
如果这些钩子中的一个不能做到这一点,我会感到惊讶:
https://schacon.github.io/git/githooks.html
也许这个:
结帐后
在更新工作树后运行 git-checkout 时会调用此挂钩。钩子被赋予了三个参数:前一个 HEAD 的 ref,新 HEAD 的 ref(可能已经改变也可能没有改变),以及一个指示检出是否是分支检出的标志(改变分支,标志 = 1)或文件检出(从索引中检索文件,标志=0)。这个钩子不会影响 git-checkout 的结果。
于 2009-06-18T09:33:55.253 回答
11
与其他类似,但验证分支已被检出一次。
#!/bin/bash
# this is a file checkout – do nothing
if [ "$3" == "0" ]; then exit; fi
BRANCH_NAME=$(git symbolic-ref --short -q HEAD)
NUM_CHECKOUTS=`git reflog --date=local | grep -o ${BRANCH_NAME} | wc -l`
#if the refs of the previous and new heads are the same
#AND the number of checkouts equals one, a new branch has been created
if [ "$1" == "$2" ] && [ ${NUM_CHECKOUTS} -eq 1 ]; then
git push origin ${BRANCH_NAME}
fi
于 2016-02-03T16:09:55.197 回答
8
post-checkout
钩子接收三个参数:
- 前 HEAD 的参考
- 新 HEAD 的参考
- 这是文件检出 (
0
) 还是分支检出 (1
)
您可以使用从当前 HEAD 创建的分支对于参数 1 和 2 具有相同值的事实。
cat > .git/hooks/post-checkout <<"EOF"
if [ "$3" == "0" ]; then exit; fi
if [ "$1" == "$2" ]; then
echo "New branch created. (Probably)."
fi
EOF
chmod u+x .git/hooks/post-checkout
限制:
- 检查一个恰好与当前 HEAD 位于同一个 HEAD 的现有分支会欺骗它。
- 不会检测到不是从当前 HEAD创建新分支。
于 2016-01-22T00:26:08.980 回答