Diffs yapmak için Winmerge'ı git içinde kullanmanın bir yolu var mı?
Diffs yapmak için Winmerge'ı git içinde kullanmanın bir yolu var mı?
Yanıtlar:
6 yıl sonra Haziran 2015 güncellemesi:
" Git mergetool winmerge " de detaylandırıldığı gibi , basit bir git config diff.tool winmerge
yeterli 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.sh
bir 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-diff
harici 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
: difftool
dizin 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-diff
oturumu kapatır .
git diff
?
-ub
, WinMerge SSS bölümüne bakın : aynıdır -u
: WinMerge'e dosyaları MRU'ya eklememesini söyler.
c:\Temp\GitDiff\old
ve 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?
""
benim durumumda değerlendirmedi ( git config
komutu bir Windows CMD'den yürütmek . Ama haklısın: ""
bir bash kabuğundan çalıştırılırsa değerlendirilir .
İlk bölümü 2 yerde kullanırken sorunla karşılaştım ve aşağıdaki gibi düzelttim
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\""
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")"
İş 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
$LOCAL
ve $REMOTE
.
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
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\"
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.cmd
Gerçekte neyin ayarlandığını görmek için çalıştırın . Neyse, .sh
sürüm olmayanlar için teşekkürler : +1!
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
Yapılandırma olmadan:
git difftool --tool winmerge
Varsayalım:
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 diff
gö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 configure
komutları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.
gitprepdiff.sh
iç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"
!
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"