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

lec*_*eco 18 git

我想知道是否有一种有效的方法来检索给定提交的子节点.尽管在Git引用提交的子进程中讨论了一种方法,但效率非常低.

我认为这将是一个在Git中完成的直接事情,但显然,事实并非如此.

问候.

Lil*_*ard 18

git rev-list可以向孩子们展示,但是这些孩子必须能够从你提供的服务中获得.假设你想要显示你的仓库中所有分支都可以到达的所有孩子,你可以使用类似的东西

git rev-list --all --not $COMMIT^@ --children | grep "^$COMMIT"
Run Code Online (Sandbox Code Playgroud)

这应该输出一个看起来像的行

$COMMIT $child1 $child2 $child3 ...
Run Code Online (Sandbox Code Playgroud)

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

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

语法$COMMIT^@可能会令人困惑,所以我会解释它.希望$COMMIT是不言自明的.然后是^@,它会扩展到所引用提交的所有父项.所以$COMMIT^@意味着"所有的父母$COMMIT".因为这跟在--not标志rev-list之后,所以它指示在它击中任何父级之后停止处理$COMMIT.这基本上只是一种优化,因为任何可以访问的提交$COMMIT都不可能是子代.


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

  • @HelloGoodbye因为那不是"可达"的意思.此外,父母与子女没有任何直接联系.每次提交都将其父项的SHA嵌入到commit对象中,该对象用于计算提交的SHA.根据定义,提交不能嵌入其子级,并且父级无法访问子级. (2认同)