2009-08-03 6 views
190

Domyślnym ustawieniem diff git jest otwieranie każdego pliku diff w trybie szeregowym (oczekiwanie na zamknięcie poprzedniego pliku przed otwarciem następnego pliku).git difftool, natychmiast otwórz wszystkie pliki diff, nie w seryjnym

Szukam sposobu na otwarcie wszystkich plików naraz - w BeyondCompare na przykład otwierałoby to wszystkie pliki w zakładkach w tym samym oknie BC.

Ułatwiłoby to przegląd złożonego zestawu zmian; przesuń w tył i do przodu między plikami diff i zignoruj ​​nieistotne pliki.

+0

"git diff" lub "git difftool"? Możesz wysłać wiadomość do ([email protected]vger.kernel.org): [email protected] –

+0

Używam "git difftool", aby wyzwolić zewnętrzną aplikację diff. Dzięki za pomysł listy mailingowej. –

+0

Przydałaby się znajomość platformy. Na platformie opartej na Uniksie, napiszę skrypt, aby wykonać różnicę i polecam git, aby używał tego skryptu. W skrypcie po prostu uruchomiłbym różnicę w tle, a następnie pozwoliłbym skryptowi umrzeć. –

Odpowiedz

53

Oto co zdecydowałem się na ...

Skopiuj poniższy kod do pliku o nazwie git-diffall (bez rozszerzenia):

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

Umieść plik w folderze cmd swojej git zainstalować dir (np C:\Program Files (x86)\Git\cmd)

I używać jak chcesz git diff:

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

Uwagi: Kluczem do tego jest parametr określający zewnętrzne polecenie diff do uruchomienia w zadaniu tła, aby pliki były przetwarzane natychmiast. W przypadku BeyondCompare otwiera się jeden ekran z każdym plikiem w jego własnej zakładce.

+0

Dzięki za wysyłkę. Niestety, nie działa z opcją WinMerge -s. Wszystkie pliki tymczasowe, z wyjątkiem pierwszego, zostaną usunięte, zanim WinMerge je obejrzy. –

+0

Carlos: Używam WinMerge z Git. Moje podejście polegało na dodaniu "snu 1" po uruchomieniu WinMerge (które w moim przypadku zdaje się już uruchamiać "w tle" - bez potrzeby &). W ten sposób plik tymczasowy działa wystarczająco długo, aby WinMerge mógł go pobrać raz (z wyjątkiem dziwnych przypadków). Oznacza to również, że każda selekcja zajmuje 1 sekundę, aby je wszystkie otworzyć. To paskudny hack (nigdy nie przedstawiłbym go jako "odpowiedzi"!), Ale łatwy, dość skuteczny. –

+0

Dzięki za scenariusz!Działa dobrze z Araxis Merge na komputerze Mac z niewielką regulacją, aby otworzyć Araxis, a następnie spać na sekundę. Araxis musi również zostać skonfigurowany, aby otwierać nowe połączenia w zakładce. – Shane

3

Znalazłem this method (GitDiff.bat i GitDiff.rb), który kopiuje pliki do starych/nowych katalogów tymczasowych, a następnie porównuje je z folderem.

Ale wolałbym przeglądać pliki robocze bezpośrednio (z działającego katalogu), ponieważ BeyondCompare ma przydatną funkcję edycji pliku w oknie różnic, co jest świetne do szybkiego czyszczenia.

Edytuj: a similar method here w odpowiedzi na moje pytanie na liście dyskusyjnej git.

1

Noticed here że Araxis Merge ma „-nowait” opcję polecenia:

-nowait Zapobiega porównania z czekając na porównanie zostać zamknięte

Może to zwraca kod wyjścia i natychmiastowe będzie pracy, ktoś to doświadczył? Nie można znaleźć podobną opcję BeyondCompare ...

0

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

+3

Tak, uważam, że gitk jest użyteczny, ale jeśli chodzi o różnicę BC, to właśnie chcę zobaczyć :) –

1

Jeśli wszystko, co chcesz zrobić, to otworzyć wszystkie pliki, które są aktualnie modyfikowane, spróbować czegoś jak:

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

Jeśli dokonujesz zobowiązuje o „złożonych zestawów zmian”, warto przemyśleć swoją pracę. Jedną z naprawdę fajnych funkcji git jest to, że ułatwia to programistom zredukowanie złożonych zestawów zmian do serii prostych łatek. Zamiast próbować edytować wszystkie pliki, które są obecnie modyfikowane, możesz zajrzeć do

git add --patch
, która pozwoli ci selektywnie realizować porcje.

152

Począwszy od git v1.7.11, możesz użyć git difftool --dir-diff, aby wykonać różnicę katalogów.

Poniższa odpowiedź dotyczy instalacji starszych niż 01.11.11.84.


To samo pytanie zadano na git mail list.

Przygotowałem skrypt powłoki oparty na tym wątku wiadomości e-mail, który wykonuje różnicę katalogów między arbitralnymi zatwierdzeniami.

Począwszy od git v1.7.10, skrypt git-diffall jest zawarty w contrib standardowej instalacji git.

Dla wersji wcześniejszych niż 1.7.10.10 można zainstalować z projektu git-diffall na .

Oto opis projektu:

Skrypt git-diffall zapewnia katalogu w oparciu o mechanizm diff git. Skrypt opiera się na opcji konfiguracji diff.tool na określającej, która przeglądarka diff jest używana.

Skrypt ten jest kompatybilny ze wszystkimi form wykorzystywanych do określenia zakresu zmianach Diff:

1) git diffall: pokazuje diff między drzewo pracę i wystawił zmiany
2) git diffall --cached [<commit>]: pokazuje diff między inscenizowanych zmian i HEAD (lub inny o nazwie popełnić)
3) git diffall <commit>: pokazuje diff między drzewa o nazwie roboczej i popełnić
4) git diffall <commit> <commit> show różn pomiędzy dwoma nazwie dopuszcza
5) git diffall <commit>..<commit>: jak powyżej
6) git diffall <commit>...<commit>: pokazują zmiany na gałęzi zawierającej, a także do sekundę, począwszy od wspólnego przodka zarówno <commit>

Uwaga: wszystkie formy wziąć opcjonalną ścieżkę ogranicznik [--] [<path>]

Ten scenariusz jest oparty na example provided by Thomas Rast on the Git list.

+0

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

+0

Mam na myśli oprócz git-diffall respektując ustawienie difftool.tool, podczas gdy git-meld ma połączenie tak twarde jak narzędzie diffto. – kynan

+3

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

1

Napisałem skrypt powershella, który powiela dwa drzewa robocze i porównuje z DiffMerge. Możesz więc wykonać:

GitNdiff master~3 . 

Aby porównać na przykład gałąź master od trzech checkinów temu z bieżącym drzewem roboczym.

Jego błyszczące i nowe i prawdopodobnie pełne błędów. Jedną wadą jest to, że pliki w 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

17

meld ma schludny cechę, że jeśli dać mu katalog pod kontrolą źródła (GIT, Mercurial, Subversion, Bazaar i prawdopodobnie innych) będzie automatycznie listę wszystkich zmienionych plików i można podwójne kliknięcie aby zobaczyć różnice indywidualne.

IMO o wiele łatwiej jest wpisać meld . i wymyślić VCS niż skonfigurować VCS do uruchomienia meld. Dodatkowo możesz użyć tego samego polecenia bez względu na to, z jakiego VCS korzysta twój projekt, co jest wspaniałe, jeśli często przełączasz się między nimi.

Jedynym minusem jest to, że wolniej jest, gdy melduje się w poszukiwaniu zmian, niż zmiany z git/hg/svn, ale to, czy będzie wystarczająco powolny, aby stanowić problem, zależy od tego, jak go używasz. Na pewno.

+4

Moim głównym minusem jest to, że meldunek (z jakiegokolwiek powodu) otwiera różnicę w nowym oknie zamiast nowej zakładce i po zamknięciu pliku, plik w katalogu roboczym otwiera się w nowej karcie z denerwującym wyskakującym wcześniej komunikatem. – kynan

+0

ładne narzędzie, ale straszna instalacja Windows (od początku 2012 r.). – Wernight

+0

@kynan To wydaje się być idealnym rozwiązaniem dla agnostycznego trybu VCS, jeśli nie dla denerwującego podwójnego okna. Szkoda. :( – PKKid

1

Dla osób zainteresowanych używaniem git-diffall na Mac OS X z Araxis, rozwinąłem projekt git-diffall na github i dodałem AppleScript, który otacza polecenie Araxis Merge. Uwaga: jest to nieco zmodyfikowany klon pliku araxisgitdiff że statki z Araxis Merge dla Mac OS X.

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

3

git meld =>https://github.com/wmanley/git-meld jest niesamowite skrypt, który otworzy schludny diff wszystkich plików w jedno okno.

+0

Działa świetnie! Jako dodatkowy bonus działa dokładnie tak, jak hg meld. Dzięki! – PKKid

2

Diffuse ma również integrację VCS. Współpracuje z wieloma innymi systemami VCS, w tym z SVN, Mercurial, Bazaar, ... W przypadku Git, będzie pokazywał nawet trzy panele, jeśli niektóre, ale nie wszystkie zmiany zostaną zainscenizowane. W przypadku konfliktów będą nawet cztery tafle.

Screenshot of diffuse with staged and unstaged edits

Wywołuje ją

diffuse -m 

w Git kopii roboczej.

Jeśli pytasz mnie, najlepsze wizualne różnice widziałem od dekady. (I próbowałem też meldować.)

+0

Czy możesz powiedzieć, która część rozproszonego Ci się podobała, szczególnie w przypadku meldunku? – musiphil

+0

@musiphil: Podoba mi się jego prostota - wygląda na to, że posiada dokładnie zestaw funkcji wymaganych do rozwiązania zadania, nie więcej, ale także nie mniej. (Podobnie jak wyrównanie różnic i szerokość tabulacji). Nie pamiętam, dlaczego przestawiłem się z meldunku i od tego czasu nie używam meldunku, więc nie mogę ich teraz porównać. – krlmlr

+1

Diffuse pracował z gitem bez żadnej konfiguracji. Diffuse -m otwiera pojedyncze okno z różnicami git w różnych zakładkach; podczas gdy inne narzędzia wymagają zbyt dużej konfiguracji, aby można było nawet zacząć. – mosh

Powiązane problemy