web-dev-qa-db-ja.com

著者フィルター付きのgitdiff

さまざまな作成者による一連のコミットがあり、2つのコミット間のgit dff出力を確認したいのですが、gitlogの--authorのような作成者の1人によるコミットのみを考慮しています。

個々のコミットの差分ではなく、最終的な要約の差分に関心があります。

そのためのgitトリックはありますか?

35
Samer Buna

ここでの問題は、一般的なケースではこれを実行できないことです。アリスが特定のファイルを変更し、次にボブがそのファイルを変更し(アリスが変更した部分を含む)、最後にアリスが再び変更するとします。アリスの2つの差分を1つの差分にどのように組み合わせるのですか?それらを2つのパッチと見なすと、ボブのパッチが最初に適用されない限り、2番目のパッチは適用されません。ただし、ボブの変更が含まれるため、最終状態を元の状態と単純に比較することもできません。

Git操作の例を好む場合、これはインタラクティブなリベースを実行し、ランダムなコミットを削除するようなものです。もちろん、うまくいくこともありますが、完全に失敗することもあります。これらのコミットの1つは、取り出したコミットの1つに依存しているためです。

だから、私はあなたが個々のコミット差分を望まないと言ったことを知っています、しかしそれはあなたが本当に望むことができるすべてです:

git log -p --author=Alice

または、単一の差分が本当に必要な場合は、これで問題が解決しますが、上記のようなパッチの相互作用がない場合に限ります。

git checkout -b temp first_commit
git log --pretty=%H --author=Alice first_commit..second_commit |
while read commit; do
    git cherry-pick $commit || exit
done
# or if you have a new version of git, cherry-pick works with multiple arguments:
# git cherry-pick $(git log --pretty=%H --author=Alice first_commit..second_commit)
git diff first_commit temp

コミットがスキップされた後、パッチが適用される保証はまったくないため、これには実際に作業ツリーでの操作が必要です。あなたはただ試してみなければなりません。

29
Cascabel

diff-tree のフォーマット機能を使用できるかもしれません

format:<string>

format:<string>形式では、表示する情報を指定できます。
これはprintf形式と少し似ていますが、%nではなく\nで改行を取得するという注目すべき例外があります。

例えば、

format:"The author of %h was %an, %ar%nThe title was >>%s<<%n" 

次のようなものが表示されます:

The author of fe6e0ee was Junio C Hamano, 23 hours ago
The title was >>t4119: test autocomputing -p<n> for traditional diff input.<<

次に、関連する作成者をgrepできます。

1
VonC