我正在编写一个预接收挂钩,在接受推送提交之前进行一些验证。 它适用于现有分支,因为我使用以下git命令来获取列表 传入提交:
git rev-list $old_sha1..$new_sha1
但是,如果用户将新分支推送到共享存储库,则上述命令会失败,因为
old_sha1全为零。所以问题是如何获取a的传入提交列表
新创建的分支。执行git rev-list $new_sha1
不起作用,因为它直到开始时才提供所有修订。有没有办法指定这样的东西:
git rev-list $branching_sha1..$new_sha1
答案 0 :(得分:11)
试试这个:
git rev-list $new_sha1 $(git for-each-ref --format '^%(refname:short)' refs/heads/)
这使用git for-each-ref
来打印已知的引用;在--format
中指定短名称与前一个插入符号一起输出;并refs/heads/
说要选择当地的负责人。你最终会运行这样的东西:
git rev-list $new_sha1 ^master ^foo ^bar ^baz
插入符号表示“排除从此处可以访问的提交”。因此,这将为您提供从$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[@]}"
答案 1 :(得分:2)
更简单地说,你可以使用它:
git rev-list $new_sha1 --not --all
这与Aristotle Pagaltzis' answer中的原理完全相同,但它只使用了rev-list
的内置options(我猜这个问题得到解答之后就加了......) 。
--all
参数等同于for-each-ref
部分:它将所有已知的引用添加到命令args。 --not
参数<在此特定情况下为 就像将^
前缀添加到由--all
添加的所有引用中。
因此,该命令将打印从新SHA1可到达的提交,除了从已知(即已经推送)的refs可以访问的所有提交。
答案 2 :(得分:1)
以下情况对我有帮助。我个人认为这很简单。
@media only screen and (min-width: 700px) {
#footer_nav {
float:right;
}
}