在Git中签出一个新分支后,有没有方法触发钩子?
有没有办法在Git中签出新分支后触发钩子?如果这些钩子中的一个不能触发钩子,我会感到惊讶: 也许: 结账后 当 git签出是在 更新了工作树。钩子是 给定三个参数: 前一个头部,新头部的参考 (可能改变,也可能没有改变), 以及一个标志,指示 结帐是一个分支结帐 (更改分支,标志=1)或文件 签出(从数据库中检索文件) 索引,标志=0)。这个钩子不行 影响git签出的结果在Git中签出一个新分支后,有没有方法触发钩子?,git,githooks,Git,Githooks,有没有办法在Git中签出新分支后触发钩子?如果这些钩子中的一个不能触发钩子,我会感到惊讶: 也许: 结账后 当 git签出是在 更新了工作树。钩子是 给定三个参数: 前一个头部,新头部的参考 (可能改变,也可能没有改变), 以及一个标志,指示 结帐是一个分支结帐 (更改分支,标志=1)或文件 签出(从数据库中检索文件) 索引,标志=0)。这个钩子不行 影响git签出的结果 git钩子是放置在存储库特定位置的脚本,该位置是: .git/hooks 脚本可以是您可以在环境中执行的任何类型,即bas
git钩子是放置在存储库特定位置的脚本,该位置是: .git/hooks 脚本可以是您可以在环境中执行的任何类型,即bash、python、ruby等 签出后执行的钩子是。从文档中: …吊钩有三个参数 示例:
#/bin/bash
set-e
printf'\n后台签出钩子\n\n'
prevHEAD=$1
newHEAD=$2
签出类型=$3
[[$checkoutType==1]]&&checkoutType='branch'||
checkoutType='file';
回显“签出类型:”$checkoutType
echo“prev HEAD:”`git name rev--name only$prevHEAD`
echo'newHEAD:''git name rev--name only$newHEAD`
注意:第一行的shebang表示脚本的类型
此脚本(git hook)将仅捕获传递的三个参数,并以人性化的格式打印它们。签出后
接收三个参数:
前一标题的参考号
新总目编号
这是文件签出(0
)还是分支签出(1
)
您可以使用这样一个事实,即从当前标头创建的分支对于参数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
cat>.git/hooks/post checkout与其他类似,但验证分支是否已签出一次
#!/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
你知道有什么方法可以判断这是否是分支创建签出(除了查看新主管的reflog之外)?似乎你最好问一个全新的问题。如果你愿意,把链接发给我,我会看看是否能帮上忙。您试图解决的问题是什么?如果提交是几个分支的顶部,name rev
只给出按字母顺序排列的名称。因此,在签出名称按字母顺序位于原始分支名称之前的分支后,prev HEAD
行将给出新分支的名称。解决方法:thisBranchName=$(git rev parse--abbrev ref HEAD);对于$中的分支(git branch--color=never--包含$1 | sed-e's/^../');如果[“$(git show ref-s$branch)”==1]&&&[“$branch”!=“$thisBranchName”];然后parentBranchName=$branch;打破fi;完成
谢谢,chmod u+x.git/hooks/post checkout
部分让我走上了正确的道路,非常感谢!由于这是一个grepping reflog来计数签出,我相信一个问题是,如果以前存在一个分支,并且创建了一个同名的新分支,那么该分支将不会被识别为新分支。这可能是期望的行为,也可能是一个问题,这取决于用例,但我只是想提一下。请注意,post-checkout
hook也适用于git-switch
,而没有post-switch
hook(从git 2.25开始)。
#!/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