While the answer given by GoZoner prace dla niektórych (? sto) plików, wykonuje git diff
wiele razy (w przypadku xargs
) lub nie (w przypadku git diff … -- `find …`
), jeśli istnieje duża liczba plików do odfiltrowania. Może to stanowić problem, w zależności od przypadku użycia.
Możliwe rozwiązanie to utworzenie zatwierdzenia zawierającego tylko zmiany interesujących plików i porównanie zatwierdzeń. Na podstawie an answer on unstaging files matching some pattern wymyśliłem tego rozwiązania:
git co <new_branch> --detach
git reset --soft <old_branch>
Teraz git status --porcelain | grep <pattern>
pokazuje wszystkie pliki, które powinny być porównywane. Wszystkie inne pliki można wyświetlić, przekazując -v
do grep
, tj. git status --porcelain | grep -v <pattern>
. Te pliki muszą być przywrócone do stanu <old_branch>
:
# 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 --
(. Należy pamiętać, że stosując xargs
nie jest problemem w tym przypadku, jak dzwoni git rm
i git checkout
wielokrotnie jest ok)
teraz indeksu (i kopia robocza) zawiera tylko zmiany w plikach dopasowanych przez <pattern>
. Następną rzeczą do zrobienia jest zatwierdzenie tych zmian:
git commit -m "Changes between <old_branch> and <new_branch> in files matching <pattern>"
To wszystko! Teraz możemy użyć git diff
jak zwykle:
git diff HEAD^..HEAD
Można użyć wszystkich opcji i argumentów, które lubisz.
Uwaga: to rozwiązanie nie jest szeroko testowane i może się nie udać, np.na plikach ze znaków specjalnych lub innych szczególnych przypadkach ... Propozycje poprawy rozwiązania są mile widziane ;-)
Wydaje się to robić tak samo jak 'git diff', ale pozostawia ostatni plik. – Zantier
Być może ostatni plik się nie zmienił. Proszę debugować z moimi sugestiami powyżej. Jeśli nadal nie jest jasne, opublikuj wyniki moich sugestii debugowania w oryginalnym pytaniu. – GoZoner
'git diff - only-only | grep AssemblyInfo.cs' rzeczywiście podaje poprawne nazwy plików, jak przypuszczam, ale potrzebuję pełnego wyjścia diff. Zarówno 'find. -name AssemblyInfo.cs | xargs git diff - 'and' find. -name AssemblyInfo.cs | xargs git diff --name-status - 'daje pliki, które nie są" AssemblyInfo.cs "(takie jak pliki .sql). – Zantier