特定のコミットの子を取得する効率的な方法があるかどうか疑問に思っていました。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
です。この後に が続き^@
、参照されたコミットのすべての親に展開されます。So$COMMIT^@
は「のすべての親」を意味し$COMMIT
ます。これは--not
フラグに続くため、 のrev-list
いずれかの親にヒットしたら処理を停止するように指示し$COMMIT
ます。$COMMIT
から到達可能なコミットは子になることはできないため、これは基本的に単なる最適化です。
注:この回答の以前のバージョンでは、tail -1
代わりにgrep "^$COMMIT"
. $COMMIT
これは単純なテスト リポジトリで機能する可能性があります (これが最初に述べた理由です) が、 を含まないブランチがある場合、git rev-list が最後に発行されるという保証はありません$COMMIT
。