2009-02-25 12 views
50

Znalazłem git mergetool jako przydatne narzędzie do wizualnego scalania różnic, ale sposób, w jaki to robię, wydaje się naprawdę niewiarygodny. Zasadniczo mój proces wygląda tak, gdy konflikty są raportowane:Łączenie z "git mergetool"

  1. Wykonuje mergetool git
  2. W wierszu hit Wprowadź uruchomić mój narzędzie diff (Meld lub FileMerge, w zależności od komputera)
  3. rozwiązania konfliktów
  4. zapisać zmiany
  5. zamknąć narzędzie diff

Jeśli mam więcej niż jeden konflikt, spłucz, powtórz. Tak, to ja otwierając i zamykając moją przeglądarkę różnic dla każdego konfliktu w scaleniu. Ponieważ jest uruchamiany z wiersza poleceń, zamknięcie go jest jedynym sposobem, w jaki mogę powiedzieć git mergetool, że rozwiązałem ten konkretny konflikt i że może on przejść do następnego.

Na pewno jest lepszy sposób, ale nie mam pojęcia. Pomóż Li'l, proszę? Ten proces wydaje się szalony nieefektywny.

+6

Możesz również uruchomić 'git mergetool -y', aby pominąć monity pośrednie. Być może nadal będziesz musiał zamknąć mergetool, ale nie będziesz musiał powracać do terminala i uderzać w powrót dla każdego nowego scalenia. – moeffju

+1

Jeśli robisz gitowe scalenie wielu plików i to wszystko, o co musisz się martwić, nie masz się czym martwić. – jwg

+0

@moeffju to najlepsza odpowiedź, aby przyspieszyć proces konfliktów scalania. – mqklin

Odpowiedz

34

Na pierwszy rzut oka nie wydaje się możliwe ponowne użycie zewnętrznej sesji narzędzia różnicowego.

git-mergetool documentation wyraźnie stwierdza:

Jeśli narzędzie zwyczaj seryjnej poprawnie wskazuje na sukces uchwały seryjnej z jego kodem wyjścia, wówczas zmienna konfiguracja mergetool.<tool>.trustExitCode może być ustawiony na true.
W przeciwnym razie, git-mergetool poprosi użytkownika o wskazanie powodzenia rozdzielczości po wyjściu narzędzia niestandardowego.

Więc potrzebny jest kod wyjścia (lub walidacja użytkownika po wyjściu z narzędzia diff), co oznacza, że ​​użytkownik najpierw zamknąć zewnętrzne narzędzie diff.

Wydaje wielką motywację do zmniejszenia liczby konfliktów na każdego scalania/rebase jeden próbuje;) (cokolwiek narzędzie VCScs używany)

Uwaga:
Dwa pozostałe ustawienia narzędzia git zewnętrzny diff („Setting up diff and merge tools for Git on Windows” i „Setting up SourceGear DiffMerge with Git”) nie daje więcej nadziei, kiedy przyjdzie do nie zamykając zewnętrznego narzędzia różn ...

+1

To prawda. :-) Dzięki za sprawdzenie zdrowia psychicznego. Co ty i inni używasz do scalania? Po prostu otwierając pliki w wybranym edytorze? –

+0

Używam WinMerge w systemie Windows, ale muszę je zamykać po każdej rozdzielczości, tak jak ty. – VonC

12

problemem jest to, że mergetool celowo wykorzystuje interfejs wiersza poleceń do inicjowania sesji scalania i następnie czeka dla wywoływanego polecenia, aby powrócić, aby określić, kiedy użytkownik scalanie napędowe zostało zakończone.

Większość narzędzi do scalania nie udostępnia mechanizmu wiersza poleceń do uruchamiania sesji scalania w już działającym procesie z możliwością określenia, kiedy rozdzielczość została zakończona i czy zakończyła się powodzeniem, czy nie.

Można sobie wyobrazić, że niektóre narzędzia scalające mogą zapewniać tę funkcjonalność za pomocą osobnego polecenia otoki i pewnego rodzaju IPC, ale byłoby to wyjątkowo trudne i trudne do implementacji w ogólnym programie mergetool.

+1

Zgadzam się z tą analizą. +1 – VonC

+0

Git mógł określić "status pomyślnego połączenia" na podstawie tego, czy cel scalenia został zaktualizowany (zmieniony). Następnie, jeśli "zapisz scalenie", oznacza to, że zakończyłem pomyślnie. W przeciwnym razie nie. Ale może potrzebne jest 2-etapowe scalenie dla tego przypadku użycia. – phord

+0

@phord: Robi to w przypadku narzędzi, które nie zgłaszają statusu za pomocą zwracanych wartości, ale to nie pomaga w tym przypadku, ponieważ nadal nie byłoby wskazania, kiedy jest właściwe, aby git sprawdzał status jako sesję narzędzi został już uruchomiony i może być kontynuowany po zakończeniu scalania. –

22

Jeśli mergetool wyboru obsługuje otwieranie plików w istniejącym przykład, można podać komendę w git config:

% git config mergetool.whatever_you_want.cmd 'exec /path/to/merge/tool $LOCAL $MERGED $REMOTE' 
% git config merge.tool whatever_you_want 

git mergetool będą następnie wykonywać swoje polecenia niestandardowego, a następnie zapyta, czy plik został pomyślnie połączony (zamiast sprawdzać kod wyjścia).

Przykładem właśnie włamał się razem vimdiff:

% git config mergetool.persistent.cmd 'gvim --remote-tab-silent "+set buftype=nowrite" "$PWD/$BASE" && sleep 1; gvim --remote-send ":split $PWD/$REMOTE<CR>:set buftype=nowrite<CR>:vertical diffsplit $PWD/$MERGED<CR>:vertical diffsplit $PWD/$LOCAL<CR>:set buftype=nowrite<CR><C-W>l"' 

To działa wystarczająco dobrze, mogę zacząć używać go sam!

+0

Interesujące. Spróbuję tego z WinMerge. +1 – VonC

+0

Muszę przyznać, to jest niesamowite. Na pewno będę musiał zobaczyć, co mogę zrobić dla Melda. –

+0

Wygląda na to, że istnieje oczekujący patch i zgłoszenie błędu, aby zezwolić na użycie meld w następujący sposób: http://bugzilla.gnome.org/show_bug.cgi?id=453670 –