どのコミットがファイルを導入したかを知りたいです。私は現在やっています:
git log --reverse --pretty="%h" <filename> | head -n 1
しかし、これは非常に高価であることに気づきました。(より安価なplubmingコマンドを使用して)それをより速く行う方法はありますか?おそらく歴史を二等分することによって?
どのコミットがファイルを導入したかを知りたいです。私は現在やっています:
git log --reverse --pretty="%h" <filename> | head -n 1
しかし、これは非常に高価であることに気づきました。(より安価なplubmingコマンドを使用して)それをより速く行う方法はありますか?おそらく歴史を二等分することによって?
これでうまくいくはずです:
git log --oneline <filename> | tail -1
おそらくあなたは必要ありませんがgit log
、ただgit rev-list
:
git rev-list HEAD -- <filename> | tail -n 1
また
git rev-list --reverse HEAD -- <filename> | head -n 1
基本的にはと同じコマンドgit log
ですが、コミットのSHA-1のみが返されるため、ログメッセージのフォーマットのオーバーヘッドが失われます。そのオーバーヘッドが歴史を歩くことに比べて重要であるかどうかは別の問題です。
独自のバイナリ検索を実装するために使用することは可能git rev-list --bisect
ですが、必要なものへの繰り返しの呼び出しは、またはのいずれかgit rev-list
に単一の呼び出しをパイプするよりもほぼ確実に遅くなります。head
tail
ファイルをいつ追加したかについて大まかな考えがある場合は、試してみることができます
git log --reverse --until 2012-06-01 -n 1 -- <filename>
2012年6月1日以降にファイルが導入されなかったと確信している場合。との組み合わせは、指定された日付より前の最初のコミットのみ--reverse
を表示します。-n 1
結果が得られない場合は、見積もりが早すぎるため、後日試す必要があります。
git
(有向非巡回グラフを使用して)履歴を保存する方法を考えると、git log
低レベルの配管コマンドをつなぎ合わせることによって必要となるよりも大幅に多くの作業を行っているとは思いません。
diff-filter=Aを使用します
git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2
ファイルの数に関係なく、1回のトラバーサルで必要な順序を取得できます。