1

revs-fileの引数の形式は何git blame -Sですか?

次の出力で実行しようとしましたgit rev-listが、非難はすべての行をHEADコミットに属性付けます。

git blame -S <(git rev-list HEAD~50 HEAD) $file

それが問題だった場合に備えて、<(git rev-list ... | tac)逆に実行しようとしましたが、同じ出力が生成されるようです。revs-file

目標は、 の各行を と の間のコミットのせいに$fileすることです。デフォルトは、同じ行がすべてのコミットに存在する場合です。HEAD~50HEADHEAD~50

4

1 に答える 1

1

すべての行が最新のコミットに起因する場合、それはすべての行が実際に最新のコミットで変更されたことを意味します。

通常、この種のことは、誰かがすべての行末を 1 つの改行から CR/LF のペアに、またはその逆に変更したときに発生します。

ああ、上記は がなく ても当てはまりますが、 for が意味する-Sことは、グラフトをコミット グラフに挿入することです。-Sgit blame

これは (コメントによると) cvsserver で動作することを意図した特別な機能ですが、使用している方法では動作しません。

フォーマットは単なる一連の<commit-ID> <parent-ID> ...\n行です。git blameこの場合、 で開始しHEADて で停止したいので、次のようHEAD~50にできます。

git rev-parse HEAD~50 | git blame -S /dev/stdin $file

commitのgit rev-parseSHA-1 をHEAD~50追加行なしで出力します。これにより、そのコミットには親コミットがなくなりgit blame、その時点で履歴トラバーサルが停止します。

-S(入力をフィードするために使用したコマンド は、 から、またはから到達可能なすべてgit rev-list HEAD~50 HEADのコミットを、親を省略した単一のコミット ID としてリストします。これは と同じです。これは、自体が から到達可能であるためです。これは、親のないすべてのコミットをリストするためです。 ID, これにより、各コミットがルート コミットとして扱われるようになりました. 次に、コミットから開始し、その親を見つけようとし、ルート コミットと見なされ、そこで停止しました。コミット ID をリストすることで、そこで停止する必要があります。そのため、代わりに をリストする必要があります。)HEAD~50 HEADgit rev-list HEADHEAD~50HEADgit blameHEADHEADHEADgit blameHEAD~50

于 2015-09-24T18:14:57.447 に答える