git difftool, otwórz wszystkie pliki diff natychmiast, nie szeregowo


240

Domyślnym zachowaniem git diff jest otwieranie każdego pliku diff szeregowo (poczekaj na zamknięcie poprzedniego pliku przed otwarciem następnego pliku).

Szukam sposobu na otwarcie wszystkich plików naraz - na przykład w BeyondCompare otworzy to wszystkie pliki na kartach w tym samym oknie BC.

Ułatwiłoby to przeglądanie złożonego zestawu zmian; przewijaj do tyłu i do przodu między plikami diff i ignoruj ​​nieistotne pliki.


„git diff” czy „git difftool”? Możesz chcieć wysłać zapytanie na (otwarta dla wszystkich, z różnorodnym interfejsem internetowym) listą dyskusyjną git: git@vger.kernel.org
Jakub Narębski

Używam „git difftool”, aby uruchomić zewnętrzną aplikację diff. Dzięki za pomysł na listę mailingową.
Seba Illingworth,

Przydałaby się znajomość platformy. Na platformie uniksowej napisałbym skrypt, aby wykonać różnicę i poinstruowałbym git, aby używał tego skryptu. W skrypcie po prostu uruchomiłbym różnicę w tle, a następnie pozwoliłbym skryptowi umrzeć.
Chris Cleeland,

Platforma Windows, ale dziękuję za pomysły Chris.
Seba Illingworth,

Odpowiedzi:


214

Począwszy od wersji git1.7.11, można użyć git difftool --dir-diffdo wykonania różnic katalogu.

Ta funkcja działa dobrze na przykład w Meld 3.14.2 i umożliwia przeglądanie wszystkich zmodyfikowanych plików:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Jest to przydatna funkcja Bash:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

Poniższa odpowiedź dotyczy gitinstalacji starszych niż 1.7.7.


To samo pytanie zostało zadane na liście mailowej git .

Złożyłem skrypt powłoki oparty na tym wątku e-mail, który wykonuje różnicę katalogów między dowolnymi zatwierdzeniami.

Począwszy od git 1.7.7, git-diffallskrypt jest dołączony contribdo standardowej instalacji git.

W przypadku wersji wcześniejszych niż 1.7.7 można zainstalować z git-diffallprojektu na GitHub .

Oto opis projektu:

Skrypt git-diffall udostępnia oparty na katalogu mechanizm różnic dla git. Skrypt korzysta z opcji konfiguracyjnej diff.tool, aby określić, która przeglądarka różnic jest używana.

Ten skrypt jest zgodny ze wszystkimi formularzami używanymi do określania zakresu poprawek do różnic:

1) git diffall: pokazuje różnicę między działającym drzewem a zmianami etapowymi
2) git diffall --cached [<commit>]: pokazuje różnicę między etapowymi zmianami i HEAD (lub innym nazwanym zatwierdzeniem)
3) git diffall <commit>: pokazuje różnicę między działającym drzewem a nazwanym zatwierdzeniem
4) git diffall <commit> <commit>: pokazuje różnicę między dwoma nazwanymi zatwierdzeniami
5) git diffall <commit>..<commit>: to samo jak powyżej
6) git diffall <commit>...<commit>: pokaż zmiany w gałęzi zawierającej i do drugiej, zaczynając od wspólnego przodka obu<commit>

Uwaga: wszystkie formularze mają opcjonalny ogranicznik ścieżki [--] [<path>]

Ten skrypt jest oparty na przykładzie podanym przez Thomasa Rasta na liście Git .


Jaka jest różnica między git-diffall a github.com/wmanley/git-meld ? Próbowałem obu i na pierwszy rzut oka wydają się one zapewniać identyczną funkcjonalność.
kynan

5
Bardzo doceniam twój scenariusz. Szczerze mówiąc, nie mogę pojąć, dlaczego Git nie zachowuje się w tym względzie we właściwy sposób (Mercurial robi to i robił to od lat), ani nie mogę pojąć braku zainteresowania ze strony społeczności Git.
Douglas,

6
Aktualizacja (dotyczy git difftool --dir-diffi Beyond Compare): Skontaktowałem się z oprogramowaniem Scooter (autorzy Beyond Compare) i twierdzą, że bcompare.exenie jest to obsługiwane rozwiązanie i może powodować problemy, jeśli więcej niż jeden różnic jest otwarty na raz. Planują dodać obsługę różnic folderów bcomp.exew przyszłej wersji (w międzyczasie będę nadal używać bcompare.exejako nieobsługiwanego obejścia).
Peter Rust

4
@coin Właśnie testowałem z Beyond Compare 4 i --dir-diff wydaje się działać z obsługiwanym bcomp.exe.
Peter Rust

5
Tylko komentowanie, by powiedzieć, że --dir-diffdziała idealnie z Meld. Stamtąd pozwoli ci wybierać i wyświetlać różnice dla poszczególnych plików.
mkasberg

61

Oto, na czym się zdecydowałem ...

Skopiuj następujący kod do pliku o nazwie git-diffall(bez rozszerzenia):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Umieść plik w cmdfolderze katalogu instalacyjnego git (np. C:\Program Files (x86)\Git\cmd)

I używaj tak, jakbyś git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Uwagi: Kluczem do tego jest & param, który mówi zewnętrznemu poleceniu diff, aby uruchomiło się w zadaniu w tle, dzięki czemu pliki są przetwarzane natychmiast. W przypadku BeyondCompare otwiera się jeden ekran z każdym plikiem na osobnej karcie.


Dzięki za wysłanie. Niestety, nie działa z opcją -S WinMerge. Wszystkie pliki tymczasowe oprócz pierwszego zostaną usunięte, zanim WinMerge będzie mógł je obejrzeć.
Carlos Rendon

Carlos: Używam WinMerge z Git. Moje podejście polegało na dodaniu „sleep 1” po uruchomieniu WinMerge (który w moim przypadku wydaje się już uruchamiać „w tle” - nie ma potrzeby &). W ten sposób plik tymczasowy żyje wystarczająco długo, aby WinMerge mógł go raz pobrać (z wyjątkiem dziwnych przypadków). Oznacza to również, że otwarcie ich wszystkich zajmuje 1 sekundę na plik. To paskudny hack (nigdy nie przedstawiłbym go jako „odpowiedź”!), Ale łatwy, dość skuteczny.
Woody Zenfell III,

2
Do użytku w Linuksie z Git 2.x musiałem wprowadzić niewielką modyfikację: zmienić "$filename"na "../$filename". Potem działało idealnie z Beyond Compare
Dave C

1
@DaveC w oryginalnym wątku mówi „zapisać plik w folderze cmd instalacji git” i przechodzi do przykładu w systemie Windows. Gdzie przechowujesz plik „git-diffall” w systemie Linux?
m4l490n

2
Czy musimy ponownie uruchomić system Windows po dodaniu git-diffallpliku do C:\Program Files\Git\cmdfolderu? Zrobiłem dokładnie zgodnie z instrukcją, ale po zrobieniu tego $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld ma ciekawą funkcję, że jeśli podasz mu katalog pod kontrolą źródła (Git, Mercurial, Subversion, Bazaar i prawdopodobnie inne), automatycznie wyświetli listę wszystkich zmienionych plików i możesz kliknąć dwukrotnie, aby zobaczyć poszczególne różnice.

IMO jest o wiele łatwiejsze do pisania meld . i wykrycia VCS niż skonfigurowania VCS do uruchomienia meld. Ponadto możesz używać tego samego polecenia bez względu na to, jakiego VCS używa Twój projekt, co jest świetne, jeśli często się między nimi przełączasz.

Jedynym minusem jest to, że meld wolniej skanuje zmiany niż przekazuje zmiany z git / hg / svn, choć to, czy jest wystarczająco wolne, by stanowić problem, zależy od tego, jak go używasz.


4
Dla mnie główną wadą jest to, że meld (z jakiegokolwiek powodu) otwiera różnicę w nowym oknie zamiast nowej zakładki, a po zamknięciu różnicy plik w katalogu roboczym otwiera się w nowej zakładce z irytującym komunikatem wyskakującym wcześniej.
kynan

fajne narzędzie, ale straszna instalacja systemu Windows (na początku 2012 r.).
Wernight

@kynan To wydaje się być idealnym rozwiązaniem dla agnostycznego sposobu różnicowania VCS, jeśli nie dla tego irytującego podwójnego okna wyskakującego. Szkoda. :(
PKKid

Świetną cechą meld są filtry różnicowe: ignoruj ​​zmiany np. W komentarzach lub dodawaj / usuwaj puste linie, co git diffnie jest możliwe.
kynan

1
Stosowałem to podejście od około roku; działa dobrze w przypadku mniejszych projektów, ale gdy masz duży projekt (np. wiele plików), jest to zabronione powolne, ponieważ ręcznie „skanuje” w poszukiwaniu git diffs (nie jestem pewien, dlaczego przyjmuje to podejście, skoro git wyraźnie może dostarczyć mu listę pliki bezpośrednio ...)
namuol

3

Znalazłem tę metodę (GitDiff.bat i GitDiff.rb), która kopiuje pliki do starych / nowych katalogów tymczasowych, a następnie porównuje na nich folder.

Ale wolę przeglądać działające pliki bezpośrednio (z działającego katalogu), ponieważ BeyondCompare ma przydatną funkcję edytowania pliku z poziomu okna różnicowego, co jest idealne do szybkich porządków.

Edytuj: podobna metoda tutaj w odpowiedzi na moje pytanie na liście mailowej git.



2

Zauważyłem tutaj, że Araxis Merge ma opcję polecenia „-nowait”:

-nowait Zapobiega oczekiwaniu porównania na zamknięcie porównania

Może to zwraca kod natychmiastowego wyjścia i działałoby, ktoś tego doświadczył? Nie można znaleźć podobnej opcji dla BeyondCompare ...


2

Diffuse ma również integrację z VCS. Współpracuje z wieloma innymi VCS, w tym SVN, Mercurial, Bazaar, ... W przypadku Gita pokażą nawet trzy panele, jeśli zostaną wprowadzone niektóre, ale nie wszystkie zmiany. W przypadku konfliktu będą nawet cztery panele.

Zrzut ekranu przedstawiający rozproszone i pomostowe zmiany

Wywołaj to za pomocą

diffuse -m

w kopii roboczej Git.

Jeśli mnie zapytasz, najlepsza grafika różni się od dekady. (I też próbowałem połączyć).


Czy potrafisz powiedzieć, która część rozproszenia Ci się spodobała, zwłaszcza po połączeniu?
musiphil

@musiphil: Podoba mi się jego prostota - wydaje się, że ma dokładny zestaw funkcji wymaganych do rozwiązania zadania, nie więcej, ale także nie mniej. (Jak wyrównanie różnic i szerokość rozmiaru tabulatora). Nie pamiętam, dlaczego przełączyłem się z meld i od tego czasu nie używałem meldu, więc nie mogę teraz tak naprawdę ich porównać.
krlmlr

1
Diffuse pracował z git bez żadnej konfiguracji. Diffuse -m otwiera pojedyncze okno z git diffs w różnych zakładkach; podczas gdy inne inne narzędzia wymagają zbyt dużej konfiguracji, aby zacząć.
mosh

1

Jeśli wszystko, co chcesz zrobić, to otworzyć wszystkie pliki, które są obecnie modyfikowane, spróbuj czegoś takiego:

vi $ (git status | sed -n '/.*modified: * / s /// p')

Jeśli zatwierdzasz „złożone zestawy zmian”, możesz zechcieć ponownie rozważyć swój przepływ pracy. Jedną z naprawdę fajnych cech git jest to, że ułatwia programistom redukowanie złożonych zestawów zmian do serii prostych łatek. Zamiast próbować edytować wszystkie pliki, które są obecnie modyfikowane, warto zajrzeć

git dodaj --patch
co pozwoli ci selektywnie wystawiać przystojniaków.


1

Napisałem skrypt PowerShell, który skopiuje dwa działające drzewa i porówna z DiffMerge. Możesz więc zrobić:

GitNdiff master~3 .

Na przykład, aby porównać gałąź master trzy meldunki temu z bieżącym działającym drzewem.

Jest błyszczący i nowy i prawdopodobnie pełen błędów. Wadą jest to, że pliki w twoim drzewie roboczym, które nie zostały jeszcze dodane, są kopiowane do obu drzew roboczych. Może być również powolny.

http://github.com/fschwiet/GitNdiff


1

Dla osób zainteresowanych używaniem git-diffall w Mac OS X z Araxis rozwidliłem projekt git-diffall na github i dodałem AppleScript, który otacza polecenie Scal Araxis. Uwaga: jest to nieco zmodyfikowany klon araxisgitdiffpliku dostarczanego z Araxis Merge dla Mac OS X.

https://github.com/sorens/git-diffall


1

Poniższe działa z meld i kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

Otwiera wszystkie pliki w oknie, które można łatwo przeglądać. Może być używany z zestawami zmian zamiast miejsca pochodzenia / nazwy oddziału

na przykład: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

Możesz użyć gitk i zobaczyć wszystkie różnice w tym samym czasie


3
Tak, uważam gitk za użyteczny, ale jeśli chodzi o różnicowanie BC, to chcę zobaczyć :)
Seba Illingworth
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.