如何在git中获取传入提交的列表,以便在钩子中获取新分支

时间:2010-12-24 01:23:35

标签: git hook

我正在编写一个预接收挂钩,在接受推送提交之前进行一些验证。 它适用于现有分支,因为我使用以下git命令来获取列表 传入提交:

git rev-list $old_sha1..$new_sha1

但是,如果用户将新分支推送到共享存储库,则上述命令会失败,因为 old_sha1全为零。所以问题是如何获取a的传入提交列表 新创建的分支。执行git rev-list $new_sha1不起作用,因为它直到开始时才提供所有修订。有没有办法指定这样的东西:

git rev-list $branching_sha1..$new_sha1

3 个答案:

答案 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;
    }
}