Während the answer given by GoZoner Werke für einige (? Hundert) Dateien, führt er git diff
mehrere Male (im Falle von xargs
) oder nicht (im Falle von git diff … -- `find …`
) wenn es eine große Anzahl von Dateien zu Diff gibt. Dies kann ein Problem sein oder nicht, abhängig von Ihrem Anwendungsfall.
Eine mögliche Lösung besteht darin, ein Commit zu erstellen, das nur Änderungen an interessanten Dateien enthält und die Commits unterscheidet. Basierend auf an answer on unstaging files matching some pattern kam ich mit dieser Lösung:
git co <new_branch> --detach
git reset --soft <old_branch>
Jetzt git status --porcelain | grep <pattern>
alle Dateien angezeigt, die verglichen werden sollen. Alle anderen Dateien können aufgelistet werden, indem -v
an grep
übergeben wird, d. H. git status --porcelain | grep -v <pattern>
. Diese Dateien müssen auf den Zustand der <old_branch>
zurückgesetzt werden:
# Remove the destination of renamed and copied files not matching <pattern>
git status --porcelain | grep -v <pattern> | grep '^R \|^C ' | sed 's/.* -> //' | xargs git rm -f --
# Remove added files not matching <pattern>
git status --porcelain | grep -v <pattern> | grep '^A ' | cut -c 4- | xargs git rm -f --
# Restore deleted files not matching <pattern>
git status --porcelain | grep -v <pattern> | grep '^M \|^D ' | cut -c 4- | xargs git checkout HEAD --
(. Beachten Sie, dass xargs
verwendet, ist kein Problem in diesem Fall, wie der Aufruf von git rm
und git checkout
mehrere Male ist ok)
nun der Index (und Arbeitskopie) enthält nur Änderungen an den Dateien, die von <pattern>
übereinstimmen. Als nächstes müssen Sie diese Änderungen übernehmen:
git commit -m "Changes between <old_branch> and <new_branch> in files matching <pattern>"
Das war's! Jetzt können wir git diff
wie gewohnt verwenden:
git diff HEAD^..HEAD
Sie alle Optionen verwenden können, oder Argumente, die Sie mögen.
Hinweis: Diese Lösung wird nicht umfassend getestet und kann z.auf Dateien mit Sonderzeichen oder anderen Sonderfällen ... Vorschläge, die Lösung zu verbessern, sind willkommen ;-)
Dies scheint das gleiche zu tun wie 'git diff', lässt aber die letzte Datei aus. – Zantier
Vielleicht hat sich die letzte Datei nicht geändert. Bitte debugge mit meinen obigen Vorschlägen. Wenn es noch unklar ist, posten Sie die Ausgabe meiner Debug-Vorschläge in Ihrer ursprünglichen Frage. – GoZoner
'git diff - Nur-Name | grep AssemblyInfo.cs' gibt tatsächlich die korrekten Dateinamen, wie ich es erwarte, aber ich brauche volle diff-Ausgabe. Beide finden. -name AssemblyInfo.cs | xargs git diff - 'und' finden. -name AssemblyInfo.cs | xargs git diff --name-status - "gibt Dateien, die nicht" AssemblyInfo.cs "sind (wie .sql-Dateien). – Zantier