我正在编写一个预接收挂钩,在接受推送提交之前进行一些验证.它适用于现有分支,因为我使用以下git命令来获取传入提交的列表:
git rev-list $old_sha1..$new_sha1
Run Code Online (Sandbox Code Playgroud)
但是,如果用户将新分支推送到共享存储库,则上述命令将失败,因为old_sha1全为零.所以问题是我如何获得新创建的分支的传入提交列表.做git rev-list $new_sha1不起作用,因为它直到开始时才进行所有修改.有没有办法指定这样的东西:
git rev-list $branching_sha1..$new_sha1
Run Code Online (Sandbox Code Playgroud)
Ari*_*zis 11
试试这个:
git rev-list $new_sha1 $(git for-each-ref --format '^%(refname:short)' refs/heads/)
Run Code Online (Sandbox Code Playgroud)
这用于git for-each-ref打印已知的参考; 指定--format短名称与前一个插入符号一起输出; 并说refs/heads/选择当地的负责人.你最终运行这样的东西:
git rev-list $new_sha1 ^master ^foo ^bar ^baz
Run Code Online (Sandbox Code Playgroud)
插入符号表示"排除从此处可到达的提交".因此,这将为您提供所有可以从任何现有引用访问的提交$new_sha1,但不是来自任何现有引用.
要一次处理new-ref和existing-ref案例,您可以使用bash的数组支持:
if ! [ $old_sha1 = 0000000000000000000000000000000000000000 ] ; then
excludes=( ^$old_sha1 )
else
excludes=( $(git for-each-ref --format '^%(refname:short)' refs/heads/) )
fi
git rev-list $new_sha1 "${excludes[@]}"
Run Code Online (Sandbox Code Playgroud)