Git w systemie Windows: jak skonfigurować narzędzie do łączenia?

347

Próbowałem msysGit i Git na Cygwin. Oba działają same w sobie i oba działają doskonale gitk i git-gui.

Teraz jak do diabła mam skonfigurować narzędzie do łączenia? (Vimdiff działa na Cygwin, ale najlepiej chciałbym czegoś nieco bardziej przyjaznego dla niektórych z naszych kochających Windows współpracowników.)

Jake
źródło
4
Rozszerzenia Git mają interfejs użytkownika git, który ma całkiem dobre i przyjazne dla użytkownika narzędzie do scalania.
KallDrexx
Wygląda na to, że potrzebujesz TortoiseGit?
Siergiej

Odpowiedzi:

305

Aby śledzić odpowiedź Charlesa Baileya, oto moja konfiguracja git, która używa p4merge (darmowego narzędzia do łączenia na trzy platformy); przetestowany na instalacji msys Git (Windows):

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\"'

lub z powłoki Windows cmd.exe druga linia staje się:

git config --global mergetool.p4merge.cmd "p4merge.exe \"$BASE\" \"$LOCAL\" \"$REMOTE\" \"$MERGED\""

Zmiany (w stosunku do Charlesa Baileya):

  • dodane do globalnej konfiguracji git, tzn. ważne dla wszystkich projektów git, nie tylko bieżących
  • wartość konfiguracji narzędzia niestandardowego znajduje się w „scaletool. [narzędzie] .cmd”, a nie w „scaleniu. [narzędzie] .cmd” (głupia ja, spędziłem godzinę na rozwiązywaniu problemów, dlaczego git narzeka na nieistniejące narzędzie)
  • dodałem podwójne cudzysłowy dla wszystkich nazw plików, aby pliki ze spacjami nadal mogły być znalezione przez narzędzie scalania (przetestowałem to w msys Git z Powershell)
  • zwróć uwagę, że domyślnie Perforce doda katalog instalacyjny do PATH, dlatego nie trzeba podawać pełnej ścieżki do p4merge w poleceniu

Pobierz: http://www.perforce.com/product/components/perforce-visual-merge-and-diff-tools


EDYCJA (luty 2014)

Jak zauważył @Gregory Pakosz , najnowszy msys git teraz „natywnie” obsługuje p4merge (testowany na 1.8.5.2.msysgit.0 ).

Możesz wyświetlić listę obsługiwanych narzędzi, uruchamiając:

git mergetool --tool-help

Powinieneś zobaczyć p4merge na dostępnej lub prawidłowej liście. Jeśli nie, zaktualizuj swój git.

Jeśli p4merge został wymieniony jako dostępny , znajduje się w twojej ŚCIEŻCE i musisz tylko ustawić merge.tool :

git config --global merge.tool p4merge

Jeśli została ona uznana za ważny , trzeba określić mergetool.p4merge.path oprócz merge.tool :

git config --global mergetool.p4merge.path c:/Users/my-login/AppData/Local/Perforce/p4merge.exe
  • Powyżej znajduje się przykładowa ścieżka, gdy p4merge został zainstalowany dla bieżącego użytkownika, a nie w całym systemie (nie wymaga uprawnień administratora ani podniesienia uprawnień UAC)
  • Chociaż ~powinien rozwinąć się do katalogu domowego bieżącego użytkownika (więc teoretycznie powinna to być ścieżka ~/AppData/Local/Perforce/p4merge.exe), nie działało to dla mnie
  • Jeszcze lepiej byłoby skorzystać ze zmiennej środowiskowej (np. $LOCALAPPDATA/Perforce/p4merge.exe), Git nie wydaje się rozszerzać zmiennych środowiskowych dla ścieżek (jeśli wiesz, jak to zrobić, daj mi znać lub zaktualizuj tę odpowiedź)
Milan Gardian
źródło
Hmm - wypróbowanie tego - pierwsza konfiguracja działa dobrze, następna wyświetla tekst pomocy dla git config. Nie pewny dlaczego.
Danny Staple
1
Rozumiem - te pojedyncze cytaty wydają mi się podejrzane. Wystarczy podwoić to i będą działać.
Danny Staple
13
ustawienie mergetool.p4merge.cmdnie będzie działać, ponieważ Git zaczął próbować obsługiwać p4merge, patrz libexec/git-core/git-mergetool--lib. zamiast tego używa bezpośredniomergetool.p4merge.path
Gregory Pakosz
5
Musiałem postawić pełną ścieżkę i uniknąć podwójnych cytatów:cmd = \""c:/Program Files/TortoiseSVN/bin/TortoiseMerge.exe"\" -base:"$BASE" -theirs:"$REMOTE" -mine:"$LOCAL" -merged:"$MERGED"
Ludovic Kuty
21
Zrobiło to dla mnie: git config --global mergetool.p4merge.cmd '"C:\\Program Files\\Perforce\\p4merge" $BASE $LOCAL $REMOTE $MERGED'na komputerze z systemem Windows 7
Dan P.
88

ustawienie scaletool.p4merge.cmd nie będzie już działać, odkąd Git zaczął próbować obsługiwać p4merge, patrz libexec / git-core / git-mergetool--lib. więc musimy tylko określić ścieżkę scalania dla git, na przykład p4merge:

git config --global mergetool.p4merge.path 'C:\Program Files\Perforce\p4merge.exe'
git config --global merge.tool p4merge

Wtedy to zadziała.

daizuozhuo
źródło
1
Działa również z Beyond Compare 3. Zamiast tego użyj ścieżki do pliku BComp.exe. Dzięki!
Richard Anthony Hein
4
Zdaję sobie sprawę, że to stary wątek, ale nie mogę znaleźć tej ścieżki do pracy. Jestem trochę zdezorientowany co do tego, w jaki sposób należy uciec ścieżkę, biorąc pod uwagę współdziałanie cmd / msys ... EDYCJA Zmiana na podwójne cudzysłowy naprawiła to!
Rustavore,
Dziękuję Gitninja! Pamiętaj, że możesz wpisać to w Git Bash, ale jeśli użyjesz polecenia Monituj, musisz zmienić pojedynczy cytat na podwójny
Hải Phong
61

Używam Portable Git na WinXP (działa uczta!) I potrzebowałem rozwiązać konflikt, który pojawił się podczas rozgałęziania. Ze wszystkich sprawdzonych przeze mnie GUI, KDiff3 okazał się najbardziej przejrzysty w użyciu.

Ale w tym wpisie na blogu znalazłem instrukcje, których potrzebowałem, aby działał w systemie Windows , instrukcje, które nieco różnią się od innych podejść wymienionych tutaj. Zasadniczo sprowadzało się to do dodania następujących wierszy do mojego .gitconfigpliku:

[merge]
    tool = kdiff3

[mergetool "kdiff3"]
    path = C:/YourPathToBinaryHere/KDiff3/kdiff3.exe
    keepBackup = false
    trustExitCode = false

Teraz ładnie działa!

Dɑvïd
źródło
13
na moim komputerze z Win7 musiałem użyć path = C:\\Program Files (x86)\\KDiff3\\kdiff3.exe(zauważ podwójne ukośniki)
Someone Somewhere
Wystąpił błąd podobny do tego: „Narzędzie różnicowania nie jest dostępne jako„ D: \ software \ melddiff \ Meld.exe ””
Allen Vork
Czy wiesz, czy istnieje różnica w kolejności dodawania każdej sekcji. To znaczy, jeśli [scalenie] byłoby po [scaletool]?
Samuel
20

Pod Cygwin tylko rzeczą, która pracowała dla mnie jest następująca:

git config --global merge.tool myp4merge
git config --global mergetool.myp4merge.cmd 'p4merge.exe "$(cygpath -wla $BASE)" "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)" "$(cygpath -wla $MERGED)"'
git config --global diff.tool myp4diff
git config --global difftool.myp4diff.cmd 'p4merge.exe "$(cygpath -wla $LOCAL)" "$(cygpath -wla $REMOTE)"'

Chciałbym również wyłączyć komunikat zachęty do difftool:

git config --global difftool.prompt false
splicer
źródło
16

git mergetool jest w pełni konfigurowalny, więc możesz wybrać swoje ulubione narzędzie.

Pełna dokumentacja znajduje się tutaj: http://www.kernel.org/pub/software/scm/git/docs/git-mergetool.html

W skrócie, możesz ustawić domyślną narzędzie do łączenia, ustawiając zmienną config użytkownika merge.tool.

Jeśli narzędzie do scalania jest jednym z obsługiwanych przez niego natywnie, wystarczy ustawić mergetool.<tool>.pathpełną ścieżkę do narzędzia (zastąp <tool>to, co skonfigurowałeśmerge.tool .

W przeciwnym razie można ustawić mergetool.<tool>.cmdodrobinę powłoki, która będzie sprawdzana w czasie wykonywania, przy zmiennych zmiennych powłoki $BASE, $LOCAL, $REMOTE, $MERGEDustawionych na odpowiednie pliki. Musisz być ostrożny przy ucieczce, czy bezpośrednio edytujesz plik konfiguracyjny, czy ustawiasz zmienną za pomocągit config polecenia.

Coś takiego powinno nadać posmak tego, co możesz zrobić („mymerge” to fikcyjne narzędzie).

git config merge.tool mymerge
git config merge.mymerge.cmd 'mymerge.exe --base "$BASE" "$LOCAL" "$REMOTE" -o "$MERGED"'

Po skonfigurowaniu ulubionego narzędzia do scalania wystarczy uruchomić git mergetool za każdym razem, gdy występują konflikty do rozwiązania.

Narzędzie p4merge firmy Perforce jest całkiem dobrym samodzielnym narzędziem do scalania.

CB Bailey
źródło
8

Dla porównania poza w Windows 7

git config --global merge.tool bc3
git config --global mergetool.bc3.path "C:\Program Files (x86)\Beyond Compare 3\BCompare.exe"
developer747
źródło
2
Użyłem tych poleceń, ale używam WinMerge zamiast Beyond Compare.
Brent Keller,
6

Wygląda na to, że nowsze wersje git bezpośrednio obsługują p4merge, więc

git config --global merge.tool p4merge

powinno być wszystkim, czego potrzebujesz, jeśli p4merge.exe jest na twojej drodze. Nie ma potrzeby konfigurowania cmd ani ścieżki.

friederbluemle
źródło
To jest klucz. Po zainstalowaniu programu p4merge i ustawieniu dokładnie ścieżki replaceetool.p4merge.path nadal nie działało. Dodanie folderu instalacyjnego do ścieżki działało.
RichardM,
5

Jak już odpowiedziano tutaj (i tu i tutaj ), połączenie to polecenie do skonfigurowania. Dla przyjemnej graficznej nakładki polecam kdiff3 (GPL).

hlovdal
źródło
4

Musiałem zrezygnować z dodatkowego cytowania za pomocą msysGit na Windows 7, nie jestem pewien, dlaczego.

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
Mike Glenn
źródło
3

Jeśli robisz to przez cygwin, być może będziesz musiał użyć cygpath:

git config --global merge.tool p4merge
git config --global mergetool.p4merge.cmd 'p4merge `cygpath -w $BASE` `cygpath -w $LOCAL` `cygpath -w $REMOTE` `cygpath -w $MERGED`'
idbrii
źródło
3

Bah, to w końcu zadziałało dla mnie (Windows 7 + Cygwin + TortoiseMerge):

W .git / config:

cmd = TortoiseMerge.exe /base:$(cygpath -d \"$BASE\") /theirs:$(cygpath -d \"$REMOTE\") /mine:$(cygpath -d \"$LOCAL\") /merged:$(cygpath -d \"$MERGED\")

Dzięki poprzednim postom za wskazówkę dotyczącą korzystania z cygpath!

Nathan McDaniel
źródło
3

korzystam z aplikacji o nazwie WinMerge ( http://winmerge.org/ ) informacji z ich instrukcji ( http://manual.winmerge.org/CommandLine.html )

jest to skrypt bash, którego używam z mergetooldyrektywy poprzez.gitconfig

#!/bin/sh
# using winmerge with git
# replaces unix style null files with a newly created empty windows temp file

file1=$1
if [ "$file1" == '/dev/null' ] || [ "$file1" == '\\.\nul' ] || [ ! -e "$file1" ]
    then 
       file1="/tmp/gitnull"
       `echo "">$file1`
fi
file2=$2
if [ "$file2" == '/dev/null' ] || [ "$file2" == '\\.\nul' ] || [ ! -e "$file2" ]
    then 
       file2="/tmp/gitnull"
       `echo "">$file2`
fi
echo diff : $1 -- $2
"C:\Program files (x86)\WinMerge\WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$file1" "$file2"

w zasadzie bash bierze pod uwagę, kiedy wynik różnicy w pustym pliku i tworzy nowy plik tymczasowy we właściwej lokalizacji.

Xero
źródło
3

Znalazłem dwa sposoby skonfigurowania „ SourceGear DiffMerge ” jako difftool i scaletool w github Windows.

Następujące polecenia w oknie wiersza polecenia zaktualizują plik .gitconfig, aby skonfigurować GIT przy użyciu DiffMerge:

git config --global diff.tool diffmerge
git config --global difftool.diffmerge.cmd 'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  \"$LOCAL\" \"$REMOTE\"'

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd  'C:/Program\ Files/SourceGear/Common/DiffMerge/sgdm.exe  -merge  -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"'

[ LUB ]

Dodaj następujące wiersze do .gitconfig. Ten plik powinien znajdować się w katalogu domowym w C: \ Users \ UserName:

[diff]
    tool = diffmerge
[difftool "diffmerge"]
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe \"$LOCAL\" \"$REMOTE\"

[merge]
    tool = diffmerge
[mergetool "diffmerge"]
    trustExitCode = true
    cmd = C:/Program\\ Files/SourceGear/Common/DiffMerge/sgdm.exe -merge -result=\"$MERGED\" \"$LOCAL\" \"$BASE\" \"$REMOTE\"
winorośl
źródło
1

Możesz także dodać te opcje:

git config --global merge.tool p4mergetool
git config --global mergetool.p4merge.cmd 'p4merge $BASE $LOCAL $REMOTE $MERGED'
git config --global mergetool.p4mergetool.trustExitCode false
git config --global mergetool.keepBackup false

Nie wiem też dlaczego, ale cytowanie i cięcie z odpowiedzi Milana Gardiana zepsuło mi wszystko.

Roberto
źródło
1

Jeśli ktoś chce użyć gvim jako narzędzia do porównywania w TortoiseGit, to jest to, co musisz wprowadzić w polu tekstowym ścieżki do zewnętrznego narzędzia do porównywania:

path\to\gvim.exe -f -d -c "wincmd R" -c "wincmd R" -c "wincmd h" -c "wincmd J"
Attila Szeremi
źródło
1

Dla konfiguracji IntelliJ IDEA (Community Edition) 3-drożnej git scalania w środowisku Windows ( ~/.gitconfig)

Cygwin

[mergetool "ideamerge"]
     cmd = C:/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe merge `cygpath -wa $LOCAL` `cygpath -wa $REMOTE` `cygpath -wa $BASE` `cygpath -wa $MERGED`
[merge]
     tool = ideamerge

Msys

[mergetool "ideamerge"]
cmd = "/c/Program\\ Files\\ \\(x86\\)/JetBrains/IntelliJ\\ IDEA\\ Community\\ Edition\\ 14.1.3/bin/idea.exe" merge `~/winpath.sh $LOCAL` `~/winpath.sh $REMOTE` `~/winpath.sh $BASE` `~/winpath.sh $MERGED`
[merge]
 tool = ideamerge

~ / Winpath.sh służy do konwersji ścieżek do systemu Windows na msys i jest pobierany z pytania o konwersję ścieżki msys na stackoverflow

#! /bin/sh                                                               

function wpath {                                                         
    if [ -z "$1" ]; then                                                 
        echo "$@"                                                        
    else                                                                 
        if [ -f "$1" ]; then                                             
            local dir=$(dirname "$1")                                    
            local fn=$(basename "$1")                                    
            echo "$(cd "$dir"; echo "$(pwd -W)/$fn")" | sed 's|/|\\|g';  
        else                                                             
            if [ -d "$1" ]; then                                         
                echo "$(cd "$1"; pwd -W)" | sed 's|/|\\|g';              
            else                                                         
                echo "$1" | sed 's|^/\(.\)/|\1:\\|g; s|/|\\|g';          
            fi                                                           
        fi                                                               
    fi                                                                   
}                                                                        

wpath "$@" 
Usman Saleem
źródło
0

Jeśli masz problemy z otwarciem p4merge z SourceTree, poszukaj lokalnego pliku konfiguracyjnego o nazwie config w MyRepo.git i usuń dowolną konfigurację scalania. W moim przypadku próbowałem otworzyć Meld, który właśnie odinstalowałem

Kautsky Lozano
źródło