我想知道是否有一种有效的方法来检索给定提交的孩子。尽管在 Git 中引用提交的子项中讨论了一种方法,但它的效率非常低。
我认为这将是在 Git 中完成的一件简单的事情,但显然,事实并非如此。
我想知道是否有一种有效的方法来检索给定提交的孩子。尽管在 Git 中引用提交的子项中讨论了一种方法,但它的效率非常低。
我认为这将是在 Git 中完成的一件简单的事情,但显然,事实并非如此。
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
如果您有任何不包含$COMMIT
.
我使用以下别名(基于@Lily Ballard 的回答:
# 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
- 给出该对象的所有子对象