24

特定のコミットの子を取得する効率的な方法があるかどうか疑問に思っていました。Git でコミットの子を参照するでメソッドについて説明しましたが、非常に非効率的です。

これは Git で簡単にできると思っていましたが、どうやらそうではないようです。

4

2 に答える 2

29

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です。この後に が続き^@、参照されたコミットのすべての親に展開されます。So$COMMIT^@は「のすべての親」を意味し$COMMITます。これは--notフラグに続くため、 のrev-listいずれかの親にヒットしたら処理を停止するように指示し$COMMITます。$COMMITから到達可能なコミットは子になることはできないため、これは基本的に単なる最適化です。


注:この回答の以前のバージョンでは、tail -1代わりにgrep "^$COMMIT". $COMMITこれは単純なテスト リポジトリで機能する可能性があります (これが最初に述べた理由です) が、 を含まないブランチがある場合、git rev-list が最後に発行されるという保証はありません$COMMIT

于 2013-01-09T22:38:55.363 に答える