फ़ाइल अंतर में Winmerge का उपयोग करें


98

क्या जीआईटी को करने के लिए विंमर्ज का उपयोग करने का एक तरीका है मुश्किल?



संबंधित पोस्ट - सामान्य रूप से गिट में एक अलग टूल को कैसे कॉन्फ़िगर करें ।
RBT

जवाबों:


113

जून 2015 को अपडेट करें, 6 साल बाद:

जैसा कि " गिट मेरिजेट विनमरेज " में विस्तृत है , एक सरल git config diff.tool winmergeपर्याप्त होगा।

Git 2.5+ (Q2, 2015) अब Winmerge को एक अंतर या मर्ज टूल के रूप में जानते हैं!


मूल उत्तर (2009-2012)

(एमएसआईजित, 1.6.5, डॉस सत्र)

पहले भाग (विंडरमेज का उपयोग करके) का वर्णन " मैं दृश्य अंतर कार्यक्रम के साथ 'git diff' आउटपुट कैसे करूं? "

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

winmerge.shआपके निर्देशिका भाग में संग्रहीत के साथ PATH:

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

(देखें WinMerge कमांड लाइन विकल्प )

git difftool

अब WinMerge लॉन्च करेगा।
यदि आप git diffWinMerge लॉन्च करना चाहते हैं , तो बस सेट करें:

set GIT_EXTERNAL_DIFF=winmerge.sh

लेकिन असली जोड़ा मूल्य एक समान अंतर उपकरण का उपयोग करने की क्षमता से आता है जो एक बैच में सभी अंतरों को क्रमिक रूप से पेश करने के बजाय उन्हें अलग-अलग टूल विंडो को एक बार में बंद करने के लिए मजबूर करता है।

जून 2012 को अपडेट करें (ढाई साल बाद):

फ़ाइल-दर-फ़ाइल के बजाय निर्देशिकाओं की तुलना जल्द ही उपलब्ध होगी:
देखें [ANNOUNCE] Git 1.7.11.rc1 :

" git difftool" ने --dir-diffबाहरी डिफरेंशियल टूल को स्पॉन करने का विकल्प सीखा है, जो एक फाइल पेयर के अनुसार एक बार एक्सटर्नल टूल के इंस्टेंस को चलाने के बजाय , दो अस्थायी डायरेक्टरी को पॉप्युलेट करने के बाद एक बार में दो डायरेक्टरी पदानुक्रम की तुलना कर सकता है ।

" पैच difftool: difftoolडायरेक्ट डाइरेक्ट्स डिफरेंसेस को हैंडल करना सिखाएं " और अधिक विवरण के लिए " गिट शाखाओं की डायरेक्टरी तुलना " का उत्तर दें ।


निर्देशिका स्क्रिप्ट द्वारा मूल difftool (दिसंबर 2009)

जैसा कि सेबा इलिंगवर्थ ने अपने उत्तर में उल्लेख किया है , एक स्क्रिप्ट git-diffall.sh (पथ में भी डालती है) बस यही कर सकती है:

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

लेकिन यह केवल n फ़ाइलों के लिए n विंडो खोलने से काम करता है (यदि आप WinMerge के विकल्प का उपयोग करने का प्रयास करते हैं , तो यह काम नहीं करेगा क्योंकि अस्थायी फ़ाइलों को कई बार जल्दी से हटा दिया गया है)-s


यही कारण है कि मुझे जीआईटीडी.बीएटी का दृष्टिकोण पसंद है - जीआई के साथ पावर-डिफरेंसिंग , जो आपको आंतरिक अंतरों की जांच करने के लिए किसी एक का चयन करने से पहले एक अंतर के साथ फाइलों की सूची की समीक्षा करने की अनुमति देता है।
मैंने इसे केवल डॉस कमांड का उपयोग करने के लिए ट्विक किया है

@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

यह अलग-अलग निर्देशिकाओं में समान नामों वाली फ़ाइलों को संभालने के लिए पर्याप्त मजबूत नहीं है, लेकिन यह आपको एक सामान्य विचार देता है कि क्या संभव है:
यहां केवल एक WinMerge खुलेगा, जिसमें आंतरिक अंतर वाली फ़ाइलों की सूची होगी। आप उन लोगों पर क्लिक कर सकते हैं जिन्हें आप जांचना चाहते हैं, फिर एक साधारण ESCसभी WinMerge-diffसत्र बंद कर देगा ।


1
इसे git संस्करण 1.6.5.1.1367.gcd48 के साथ आज़माना और यह उन अस्थायी फ़ोल्डरों में कोई भी फाइल उत्पन्न नहीं करता है। किसी भी विचार जहां समस्या के लिए देखने के लिए? धन्यवाद!
कला

@ आर्ट: उन डिबग मामलों में, मैं स्क्रिप्ट को आसान बनाकर समस्या को अलग करने की कोशिश करता हूं: 1 / यदि स्क्रिप्ट को 7 पैरामीटर (पहली पास गिट भिन्न, फ़ाइलों की प्रतिलिपि बनाने के लिए) के साथ बुलाया जाता है 2) / स्क्रिप्ट को कम से कम वापस बुलाया जाता है के अंत में git diff?
वॉनक

1
@ एरिक: विकल्प के बारे में -ub, WinMerge FAQ देखें : यह उसी की तुलना में है -u: यह बताता है कि WinMerge एमआरयू में फाइलों को नहीं जोड़ता है।
VonC

1
@Erik: आप में फ़ाइलों की तुलना देखना चाहिए c:\Temp\GitDiff\oldऔर c:\Temp\GitDiff\new, नहीं ' /tmp'। क्या आप वाकई इस डॉस प्रोग्राम को DOS सत्र से निष्पादित कर रहे हैं (और बैश सत्र नहीं)?
वॉन सी सी

1
@coffeemakr इसने ""मेरे मामले में मूल्यांकन नहीं किया ( git configविंडोज सीएमडी से कमांड को निष्पादित करना । लेकिन आप सही हैं: यह ""एक बैश शेल से निष्पादित होने पर मूल्यांकन करेगा ।
VonC

19

मैंने 2 स्थानों पर पहले भाग का उपयोग करने में परेशानी का सामना किया और इसे इस प्रकार तय किया

  1. Winmerge.cmd स्थापित करने के लिए दूसरी कमांड cmdline पर अतिरिक्त स्लैश ($ LOCAL और $ REMOTE से पहले) की आवश्यकता थी, अन्यथा cygwin cmdline में वैरिएबल का प्रतिस्थापन कर रहा था

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. winmerge.sh फ़ाइल को बदल दिया (इसके बिना, सही-पथ-अमान्य त्रुटि हो रही थी)

    #!/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 ने निर्देश दिया था, लेकिन मुझे अपनी winmerge.sh स्क्रिप्ट में खाली तर्क मिल रहे थे। अतिरिक्त स्लैश का उपयोग करने से समस्या हल हो गई। धन्यवाद!
10

6

चूंकि थ्रेड भ्रमित हो रहा है और द्विभाजित हो रहा है, यहां डायरेक्टरी लिस्टिंग के लिए समेकित निर्देश "--dir-diff" WinMerge विधि के लिए msysgit Git Windows हैं।

चरण 1 - निम्न सामग्री के साथ अपने पथ (जैसे /home/bin/winmerge.sh) के लिए सुलभ स्थान पर winmerge.sh नामक फ़ाइल बनाएँ।

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

चरण 2 - गिट बश में निम्नलिखित कमांड टाइप करें git को winmerge.sh को difftool के रूप में उपयोग करने के लिए निर्देश दें (ये विकल्प /home/.itconfig में संग्रहीत हैं):

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

चरण 3 - अब आप अपने WinMerge को शुरू करने के लिए Git Bash में निम्न कमांड टाइप करके टेस्ट कर सकते हैं:

git difftool --dir-diff

चरण 4 - त्वरित पहुँच के लिए, अपने घर में .bashrc इस पंक्ति को जोड़कर इस कमांड के लिए एक उपनाम बनाएं (या फ़ाइल पहले से मौजूद नहीं है तो इस पंक्ति के साथ .bashrc फ़ाइल बनाएं):

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

चरण 5 - अब आप जल्दी से विनमैट में एक भिन्नता देख सकते हैं, जो निम्न कमांड को Git Bash में टाइप कर रहा है

diffdir

यह कोई है के अर्थ की व्याख्या करने के लिए मददगार होगा $LOCALऔर $REMOTE
टोला ओडजायी

6

मेरे पास एक स्क्रिप्ट है जो उचित पैरामीटर के साथ Git कॉन्फिगर में डिफ और मर्ज टूल सेट करेगी जिसमें मौजूद होने के लिए अलग .sh फाइल की आवश्यकता नहीं है। यह मेरे लिए ठीक काम कर रहा है।

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\""

नोट - पूरे .cmd भाग को उद्धृत किया गया है ताकि मापदंडों को .gitconfig में ठीक से सूचीबद्ध किया जा सके


1
निम्नलिखित आदेश मेरे लिए काम नहीं किया। git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" नोट: इस कमांड को कमांड प्रॉम्प्ट से चलाया जाना चाहिए न कि पावरशेल से। निम्नलिखित को मेरे .gitconfig [difftool "winmerge"]सेक्शन में जोड़कर मेरे लिए काम किया: cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
जोश

1
यह काम नहीं किया, लेकिन कुछ परिवर्तनों के साथ, यह काम करता है: व्यवस्थापक के रूप में cmd ​​खोलें, और चलाएँ git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\"":। वहाँ कुछ गलत बच गए तार थे (नोट कुछ अतिरिक्त अवांछित backslashes सही से पहले $- मुझे लगता $है कि बचने की जरूरत नहीं है)। इसके अलावा, यह एक अंत के "बाद गायब था WinMergeU?.exegit config --get mergetool.winmerge.cmdवास्तव में सेट किया गया था यह देखने के लिए चलाएँ । वैसे भी, गैर .shसंस्करण के लिए धन्यवाद : +1!
falsarella

5

खिड़कियों पर आप इसे इस तरह से कर सकते हैं:

1) .itconfig फ़ाइल खोलें। यह आपके होम डायरेक्टरी में स्थित है: c: \ users \ username.gitconfig

2) नीचे की पंक्तियाँ जोड़ें। विजेताओं के मार्ग को लपेटने वाले एकल उद्धरणों पर ध्यान दें:

[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

कमांड पथ में बैकस्लैश के बजाय फ़ॉरवर्ड स्लैश पर भी ध्यान दें ।

5

कॉन्फ़िगरेशन के बिना:

git difftool --tool winmerge

मान लिया जाये कि:

  • Winmerge स्थापित है
  • विंडोज़ के लिए Git "git संस्करण 2.12.0.windows1" या इसके बाद के संस्करण से स्थापित किया गया है (हालाँकि git के पुराने संस्करणों ने कमांड को पेश किया हो सकता है)।

धन्यवाद, यह सबसे सरल समाधान है
कोड

2

मैं इस बारे में उलझन में था कि समाधान को डॉस बैच फ़ाइल के रूप में क्यों प्रस्तुत किया गया था, क्योंकि मेरी गिट स्थापना बैश शेल के साथ आई थी। मैं भी bash से चलने वाले DOS संदर्भ को प्राप्त करने में असमर्थ था, इसलिए मैंने पहले से ही bash संदर्भ में जो साझा किया था, उसे अनुकूलित करने का प्रयास किया है।

चूंकि git diffप्रत्येक फ़ाइल के लिए एक बार निर्दिष्ट कमांड चलाने के लिए, मैं अपने समाधान को दो बैश लिपियों में विभाजित करता हूं:

सबसे पहले, gitprepdiff.shजैसा कि पहले उल्लेख किया गया है, मल्टिफुल को कॉन्फ़िगर करें

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

मैंने यह भी नोट किया कि git configureकमांड्स के परिणाम को सीधे पाया और संपादित किया जा सकता हैC:\Users\<username>\.gitconfigure

gitdiff.sh फिर कमांड-लाइन पर चलाया जाता है जहाँ आप सामान्य रूप से कॉल करते हैं 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

यह भी ध्यान देने योग्य है कि, मेरे इंस्टॉलेशन पर, /tmp(bash में) मैप किया गया है %LOCALAPPDATA%\Temp\1\(विंडोज में), इसलिए मैं WinMerge में अपने कॉल में बाद का उपयोग कर रहा हूं।


2
मैं थैंक यू के gitprepdiff.shलिए बदल गया #!/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 द्वारा उल्लिखित परिवर्तनों को भी करना था।
टॉम

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

के अनुसार WinMerge कमांड लाइन मैनुअल : "पैरामीटर या तो एक फ़ॉरवर्ड स्लैश (/) या पानी का छींटा लगी होती हैं (-) चरित्र"

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.