我一直在尝试制作一个预推钩,它将从STDIN中读取远程引用,修改它,并让Git接受被推送的修订集,并使用修改后的名称创建远程引用。例如,我想要做的是,
git push origin foo
,foo
更改为refs/heads/foo:refs/heads/foobar
,foobar
的分支(而不是foo
)。 这种方法可行吗?如果是这样,我如何在钩子中修改客户端的分支参数并将其重定向到不同的分支名称?如果我可以添加任何信息,请告诉我。感谢。
答案 0 :(得分:1)
你不能在pre-push hook中做到这一点,这已经太晚了:此时git已经连接到遥控器,并为它提供了它(你的git)打算给它的引用名称(远程git)更新,并将这些名称转换为SHA-1(远程git执行此转换,您的本地git只保存结果,然后将它们传递给您的钩子)。如果你允许的话,你当地的git会继续前进,并带有这些名字。
你可以做什么,虽然我会建议反对,因为它过于复杂,因此可能会破坏,是你的预推钩拒绝特别推动,但也(首先)运行自己的< em> new git push
带有一些其他名称,如果需要的话,会导致你的预推钩不能再做所有这些。
例如,考虑以下伪代码(Python和shell任意混合):
if ${PUSH_HOOK_RUNNING:-false}; then exit 0; fi # don't recurse
accepted=[]
replaced=[]
while read line; do
lref, lsha1, rref, rsha1 = line.split()
if lref == "refs/heads/foo" && rref == "refs/heads/foo"; then
replaced.append("refs/heads/foo:refs/heads/foobar")
else
accepted.append("$lref:$rref")
fi
done
if empty(replaced); then
exit 0 # let this git push run
else
# run a substitute git push as part of the hook
PUSH_HOOK_RUNNING=true git push $accepted $replaced
exit 1 # prevent this git push entirely
fi
以上内容存在许多缺陷,并且可以通过检查本地和远程引用名称以及SHA-1来解决一系列可以修复的问题。 (特别是,考虑如果本地名称xyz
最初引用提交df08eb357dd7f432c3dcbe0ef4b3212a38b4aeff
会发生什么,但是当调用“内部”git push
时,它会引用其他一些SHA-1完全是由于执行git update-ref
或git branch -m
或其他任何事情的单独流程。)
所有这一切,更简单的方法是使用而不是 git push
拥有自己的前端命令喜欢发生,然后为你运行git push
。