检索Git中特定提交的子提交列表

时间:2013-01-09 22:33:46

标签: git

我想知道是否有一种有效的方法来检索给定提交的子节点。 虽然在Referencing the child of a commit in Git中讨论了一种方法,但效率非常低。

我认为这在Git中是一件很简单的事情,但显然,事实并非如此。

问候。

2 个答案:

答案 0 :(得分:17)

git rev-list可以显示孩子,但这些孩子必须可以从您提供的提交中获得。假设您想要显示您的仓库中所有分支都可以访问的所有子项,您可以使用类似

的内容
git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT"

这应该输出一个看起来像

的行
$COMMIT $child1 $child2 $child3 ...

为方便起见,您可以将命令添加到git别名:

children = "!f() { git rev-list --all --not $1^@ --children | grep $(git rev-parse $1); }; f" # reachable children of a ref

语法$COMMIT^@可能令人困惑,所以我会解释一下。希望$COMMIT不言自明。然后是^@,它会扩展到所引用提交的所有父项。因此$COMMIT^@表示“$COMMIT的所有父母”。由于这会在--not标记之后,因此指示rev-list在遇到$COMMIT的任何父级后停止处理。这基本上只是一种优化,因为从$COMMIT可以访问的任何提交都不可能是孩子。


注意:此答案的先前版本说tail -1而不是grep "^$COMMIT"。这可能在一个简单的测试仓库中工作(这就是我最初说的原因),但是如果你有任何不包含$COMMIT的分支,那么无法保证git rev-list最后会发出$COMMIT

答案 1 :(得分:1)

我使用以下别名(基于@Kevin Ballard's answer

# Get all children of current or specified commit-ish
children = "!bash -c 'c=${1:-HEAD}; set -- $(git rev-list --all --not \"$c\"^@ --children | grep $(git rev-parse \"$c\") ); shift; echo $*' -"
  • 没有参数 - 给所有HEAD
  • 的孩子
  • 使用commit-ish - 为该对象的所有孩子提供