diff dosyalamak için Git içinde Winmerge kullanın


Yanıtlar:


114

6 yıl sonra Haziran 2015 güncellemesi:

" Git mergetool winmerge " de detaylandırıldığı gibi , basit bir git config diff.tool winmergeyeterli olacaktır.

Git 2.5+ (Q2, 2015) artık bir fark veya birleştirme aracı olarak Winmerge'ın farkında!


Orijinal cevap (2009-2012)

(msysgit, 1.6.5, DOS oturumu)

İlk kısım (winmerge kullanılarak) " Görsel diff programıyla 'git diff' çıktısını nasıl görüntülerim? "

C:\myGitRepo>git config --replace --global diff.tool winmerge
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --replace --global difftool.prompt false

Aşağıdakilerin winmerge.shbir dizin bölümünde depolanan PATH:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"

( WinMerge Komut satırı seçeneklerine bakın )

git difftool

şimdi WinMerge'i başlatacak. WinMerge'i başlatmak
istiyorsanız git diff, şunu ayarlayın:

set GIT_EXTERNAL_DIFF=winmerge.sh

Ancak gerçek katma değer, tüm farklılıkları sıralı olarak sunmak yerine, aynı diff aracını kullanarak tüm farklılıkları bir seferde bir dosya olarak kapatmanızdan gelir.

Haziran 2012 Güncellemesi (2 buçuk yıl sonra):

Dosya dosya yerine dizinleri karşılaştırma yakında kullanıma sunulacak:
Bkz. [ANNOUNCE] Git 1.7.11.rc1 :

" git difftool" Öğrenilmiş " --dir-diffharici fark araçları yumurtlamaya" seçeneğini iki dizin hiyerarşileri karşılaştırmak iki geçici dizinleri doldururken, sonra bir defada bir kere dosya çifti başına yerine dış aracının bir örneğini çalıştıran .

Daha fazla ayrıntı için " Yama difftool: difftooldizin farklılıklarını işlemeyi öğretin " ve " Git dallarının dizin karşılaştırması " yanıtına bakın.


Dizinler komut dosyasıyla orijinal diftool (Aralık 2009)

As Seba Illingworth bahsedildi onun cevabı , bir komut dosyası git-diffall.sh (aynı zamanda yoluna koymak) sadece yapabilirsiniz:

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

Ancak bu yalnızca n dosya için n pencere açarak çalışır (WinMerge seçeneğini kullanmaya çalışırsanız , difftool tarafından çok erken silinen geçici dosyalar nedeniyle çalışmayacaktır)-s


Bu nedenle, GitDiff.bat'ın - GI ile güç ayrımı yaklaşımını beğeniyorum ; bu, iç farklılıklarını incelemek için birini seçmeden önce, farklı dosyaların listesini incelemenizi sağlar.
Yalnızca DOS komutlarını kullanmak için ince ayar yaptım

@echo off

setlocal

if "%1" == "-?" (
    echo GitDiff - enables diffing of file lists, instead of having to serially
    echo diff files without being able to go back to a previous file.
    echo Command-line options are passed through to git diff.
    echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
    goto END
)

if "%GIT_DIFF_COPY_FILES%"=="" (
    rd /s /q %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff\old
    mkdir %TEMP%\GitDiff\new

    REM This batch file will be called by git diff. This env var indicates whether it is
    REM being called directly, or inside git diff
    set GIT_DIFF_COPY_FILES=1

    set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old
    set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new

    set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat
    echo Please wait and press q when you see "(END)" printed in reverse color...
    call git diff %*

    if defined GIT_FOLDER_DIFF (
        REM This command using GIT_FOLDER_DIFF just does not work for some reason.
        %GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" (
        set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe"
        "%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    "%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote"  %TEMP%\GitDiff\old %TEMP%\GitDiff\new
    goto END
)

REM diff is called by git with 7 parameters:
REM     path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1
copy %5 %GIT_DIFF_NEW_FILES%

:END

Farklı dizinlerde aynı ada sahip dosyaları işlemek için yeterince sağlam değildir, ancak size neyin mümkün olduğuna dair genel bir fikir verir:
Burada, dahili farklılıkları olan dosyaların listesiyle birlikte yalnızca bir WinMerge açılacaktır. İncelemek istediklerinize tıklayabilirsiniz, ardından basit bir ESCtüm WinMerge-diffoturumu kapatır .


1
Bunu 1.6.5.1.1367.gcd48 git sürümüyle denemek ve bu geçici klasörlerde herhangi bir dosya oluşturmadığı görülüyor. Sorunu nerede arayacağınıza dair bir fikriniz var mı? Teşekkürler!
Art

@Art: Bu hata ayıklama durumlarında, betiği basitleştirerek sorunu izole etmeye çalışıyorum: 1 / komut dosyası 7 parametresiyle çağrıldıysa (dosyaları kopyalamak için git diff'in ilk geçişi) 2 / en azından geri çağrılan komut dosyasıdır sonunda git diff?
VonC

1
@Erik: seçenekle ilgili olarak -ub, WinMerge SSS bölümüne bakın : aynıdır -u: WinMerge'e dosyaları MRU'ya eklememesini söyler.
VonC

1
@Erik: Eğer dosya karşılaştırma görmelisiniz c:\Temp\GitDiff\oldve c:\Temp\GitDiff\new'değil, /tmp'. Bu DOS programını bir DOS oturumundan (bash oturumundan değil) çalıştırdığınızdan emin misiniz?
VonC

1
@coffeemakr ""benim durumumda değerlendirmedi ( git configkomutu bir Windows CMD'den yürütmek . Ama haklısın: ""bir bash kabuğundan çalıştırılırsa değerlendirilir .
VonC

19

İlk bölümü 2 yerde kullanırken sorunla karşılaştım ve aşağıdaki gibi düzelttim

  1. Winmerge.cmd'yi kurmak için ikinci komut cmdline'da fazladan bir eğik çizgi gerektiriyordu ($ LOCAL ve $ REMOTE'dan önce), aksi takdirde cygwin cmdline'daki değişkeni değiştiriyordu

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. winmerge.sh dosyasını olarak değiştirdi (bu olmadan, doğru yol geçersiz hatası alıyordu)

    #!/bin/sh
    echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    

3
VonC'nin tam olarak nasıl talimat verdiğini yaptım, ancak winmerge.sh betiğimde boş argümanlar alıyordum. Ekstra eğik çizgiler kullanmak sorunu çözdü. Teşekkür ederim!
ashagi

6

İş parçacığı kafa karıştırıcı ve çatallı hale geldiğinden, msysgit Git Windows için Dizin Listeleme "--dir-diff" WinMerge yöntemi için birleştirilmiş talimatlar burada verilmiştir.

Adım 1 - Aşağıdaki içeriğe sahip yolunuza erişilebilen bir konumda (/home/bin/winmerge.sh gibi) winmerge.sh adlı bir dosya oluşturun.

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"

Adım 2 - git'e winmerge.sh'yi difftool olarak kullanması talimatını vermek için Git Bash'e aşağıdaki komutları yazın (bu seçenekler /home/.gitconfig dosyasında saklanır):

git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --replace --global difftool.prompt false

Adım 3 - Artık WinMerge farkınızı başlatmak için Git Bash'e aşağıdaki komutu yazarak test edebilirsiniz:

git difftool --dir-diff

Adım 4 - Daha hızlı erişim için, bu satırı ana klasörünüzdeki .bashrc'ye ekleyerek bu komut için bir takma ad oluşturun (veya dosya zaten yoksa bu satırla .bashrc dosyası oluşturun):

alias diffdir='git difftool --dir-diff'

Adım 5 - Artık WinMerge'de aşağıdaki komutu Git Bash'e yazarak hızlı bir şekilde bir fark görebilirsiniz.

diffdir

Birisi anlamlarını açıklamak zorunda yararlı olacaktır $LOCALve $REMOTE.
Tola Odejayi

6

Var olması için ayrı bir .sh dosyası gerektirmeyen uygun parametrelerle Git yapılandırmasındaki Dağıt ve Birleştir araçlarını ayarlayacak bir komut dosyam var. Benim için iyi çalışıyor gibi görünüyor.

git config --global diff.tool winmerge
git config --global difftool.prompt false
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""

git config --global merge.tool winmerge
git config --global mergetool.prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""

Not - .cmd kısmının tamamı alıntılanmıştır, böylece parametreler .gitconfig dosyasında düzgün bir şekilde listelenir


1
Aşağıdaki komut benim için çalışmadı. git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" Not: Bu komut powershell'den değil bir komut isteminden çalıştırılmalıdır. Aşağıdakileri .gitconfig bölümüme manuel olarak eklemek [difftool "winmerge"]işe yaradı : cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
Josh

1
Bu işi yoktu, ancak bazı değişikliklerle, çalışır: Açık yönetici olarak cmd ve koşmak: git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"". Birkaç yanlış kaçılmış dizge vardı (orada birkaç istenmeyen ters eğik çizgiye dikkat edin $- sanırım kaçılmasına $gerek yok). Ayrıca, "sonrasında bir sonu eksikti WinMergeU?.exe. git config --get mergetool.winmerge.cmdGerçekte neyin ayarlandığını görmek için çalıştırın . Neyse, .shsürüm olmayanlar için teşekkürler : +1!
falsarella

5

Windows'ta bunu şu şekilde yapabilirsiniz:

1) .gitconfig dosyasını açın. Ana dizininizde bulunur: c: \ users \ username.gitconfig

2) Aşağıdaki satırları ekleyin. Kazanmaya giden yolu saran tek alıntılara dikkat edin:

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
    prompt = false
[merge]
    tool = winmerge
[mergetool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
    keepBackup = false
    trustExitCode = false

Ayrıca dikkat ileri yerine komut yolundaki tersbölülerden eğik çizgiler.
akıllıca

5

Yapılandırma olmadan:

git difftool --tool winmerge

Varsayalım:

  • Winmerge yüklendi
  • Windows için Git, "git sürüm 2.12.0.windows1" veya üstünden yüklenir (git'in önceki sürümleri komutu sunmuş olsa da).

Teşekkürler, bu en basit çözüm
code4j

2

Git kurulumum bir bash kabuğuyla birlikte geldiğinden, çözümün neden bir DOS toplu iş dosyası olarak sunulduğu konusunda kafam karışmıştı. Ayrıca bash'den çalışan bir DOS içeriği alamadım, bu yüzden daha önce bir bash bağlamında paylaşılanları uyarlamaya çalıştım.

Yana git diffgörünür her dosya için bir kez belirtilen komutu çalıştırmak için, iki bash komut içine benim çözüm bölmek:

İlk gitprepdiff.shönce, daha önce belirtildiği gibi diftool olarak yapılandırın

#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"

Ayrıca git configurekomutların sonuçlarının doğrudan şurada bulunabileceğini ve düzenlenebileceğini de not ettim :C:\Users\<username>\.gitconfigure

gitdiff.sh normal olarak çağıracağınız komut satırında çalıştırılır git diff

#!/bin/sh
#echo Running gitdiff.sh...

DIFFTEMP=$TMP/GitDiff

echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;

echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;

echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;

git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename";
done

"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new

Ayrıca, kurulumumda /tmp( %LOCALAPPDATA%\Temp\1\Windows'ta) ile eşlenen (bash'da ), bu yüzden WinMerge çağrımda ikincisini kullanmamın nedeni bu.


2
Teşekkürler gitprepdiff.shiçin değiştim #!/bin/sh #echo ...gitprepdiff.sh mkdir -vp "$TMP/GitDiff/old/$(dirname $2)" cp -v $1 "$TMP/GitDiff/old/$2" cp -v --parents $2 "$TMP/GitDiff/new"!
dobau

Bu işi yapmak için bu kadar çok çemberden atlamak saçma görünüyor, ama öyle. Tüm dosya farklılıklarını olması gerektiği gibi tek seferde alırsınız. Alt dizinlerdeki dosyaları düzgün bir şekilde işlemek için @dobau tarafından belirtilen değişiklikleri de yapmak zorunda kaldım.
Tom

1
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.prompt false

Gereğince WinMerge komut satırı kılavuzuna : "Parametreler ya bir eğik çizgi (/) ya da çizgi ile öneki (-) karakteri"

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.