在钩子的文档中,它说
它也是在git-clone[1]之后运行的,除非使用了
--no-checkout(-n)选项。给钩子的第一个参数是null- ref,第二个参数是新头和标志的引用总是1。同样,对于git worktree add,除非使用--no-checkout。
这里的"null-ref“指的是什么?
发布于 2022-07-15 22:35:48
它是由所有零组成的提交ID。
我在~/.config/git/template/hooks/post-checkout中添加了下面一行
echo "post-checkout" "$@" 1>&2然后克隆一个新的存储库,得到以下输出:
post-checkout 0000000000000000000000000000000000000000 4abcac4ddfb69f6dfde1af0164f2f0ee0e230336 1因此,看起来post-checkout脚本中的"null-ref“是0000000000000000000000000000000000000000。
这个问题背后的背景是,只有当我从工作的Gitlab服务器克隆存储库时,我才希望设置一个特殊的per配置user.email值。现在,我可以在结帐后脚本中添加以下内容来修改它:
# This value of `$1` is the null-ref from githooks(5) - see
# https://stackoverflow.com/a/73000183/207384.
# for sed trick see torek's answer
if [[ "$1" = "$(git rev-parse HEAD | sed s/./0/g)" ]]; then
# Set user.email specially for work repositories.
if [[ "$(git config remote."$(git config branch."$(git branch --show-current)".remote)".url)" =~ "gitlab.example.com" ]]; then
git config user.name "John Doe"
git config user.email "John Doe@example.com"
fi
fi发布于 2022-07-16 04:32:02
这个文档可能应该更新一点,因为null-ref这个词是误导性的,但是您是正确的,它是一个全零的散列ID,Git在其他地方使用"null ID“这个短语,特别是在函数is_null_oid的内部。由于"OID“是一个首字母缩略词,它通常在英文文本中是大写字母,而"null”有时也会出现:例如,参见2.18发行说明书,vs 文档,其中拼写为"null OID“。
我个人认为git rev-parse应该可以选择吐出(以及空树的散列ID ),因为SHA-256 OID是64字节长,而不是40字节长。然而,作为一种权宜之计,人们可以使用:
null_oid=$(git rev-parse HEAD | sed s/./0/g)或者,将hash-object的技巧做得更深一点:
empty_tree=$(git hash-object -t tree --stdin </dev/null)
null_oid=$(echo $empty_tree | sed s/./0/g)这会让你们两人都满意,并将继续在一些未来的Git中工作,这些Git有更长的OID。
发布于 2022-07-16 20:33:40
文档指出,对于正常的git checkout情况,前两个参数是
给出了钩子的三个参数:前一个头的参考值,新头的参考值(可能已经改变了,也可能没有改变),.“
但在git clone的情况下,显然没有先前的参考资料。因此,必须给出某种“空”参数。在git中,提供了所有零的“空引用”。
https://stackoverflow.com/questions/73000182
复制相似问题