git - मैं अपने पसंदीदा diff टूल/दर्शक के साथ 'गिट diff' आउटपुट कैसे देखूं?




difftool git-difftool (17)

जब मैं git diff टाइप करता हूं, तो मैं अपने दृश्य diff टूल (विंडोज़ पर SourceGear "diffmerge") के साथ आउटपुट देखना चाहता हूं। मैं ऐसा करने के लिए गिट को कैसे कॉन्फ़िगर कर सकता हूं?


परिचय

संदर्भ के लिए मैं वॉनसी के उत्तर पर अपनी विविधता शामिल करना चाहता हूं। ध्यान रखें कि मैं संशोधित पाथ के साथ गिट के MSys संस्करण (1.6.0.2 इस समय) का उपयोग कर रहा हूं, और बैश खोल नहीं, बल्कि पावरहेल (या cmd.exe) से गिट चला रहा हूं।

मैंने एक नया आदेश, gitdiff । इस आदेश को चलाने से अस्थायी रूप से आपकी पसंद के विज़ुअल डिफ प्रोग्राम का उपयोग करने के लिए git diff को रीडायरेक्ट किया जाता है (वॉनसी के समाधान के विपरीत जो इसे स्थायी रूप से करता है)। यह मुझे डिफ़ॉल्ट गिट diff कार्यक्षमता ( git diff ) के साथ ही दृश्य diff कार्यक्षमता ( gitdiff ) दोनों की अनुमति देता है। दोनों आदेश एक ही पैरामीटर लेते हैं, उदाहरण के लिए किसी विशेष फ़ाइल में दृश्यमान रूप से भिन्न परिवर्तनों के लिए आप टाइप कर सकते हैं

gitdiff path/file.txt

सेट अप

ध्यान दें कि $GitInstall को उस निर्देशिका के लिए प्लेसहोल्डर के रूप में उपयोग किया जाता है जहां गिट स्थापित है।

  1. एक नई फ़ाइल बनाएं, $GitInstall\cmd\gitdiff.cmd

    @echo off
    setlocal
    for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
    if "%HOME%"=="" @set HOME=%USERPROFILE%
    set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
    set GIT_PAGER=cat
    git diff %*
    endlocal
    
  2. एक नई फ़ाइल बनाएं, $GitInstall\bin\git-diff-visual.cmd (अपनी पसंद के diff प्रोग्राम के पूर्ण पथ के साथ [visual_diff_exe] प्लेसहोल्डर को प्रतिस्थापित करें)

    @echo off
    rem diff is called by git with 7 parameters:
    rem path old-file old-hex old-mode new-file new-hex new-mode
    echo Diffing "%5"
    "[visual_diff_exe]" "%2" "%5"
    exit 0
    
  3. अब आप कर चुके हैं एक गिट भंडार के भीतर से gitdiff चलाना अब बदला गया था कि प्रत्येक फ़ाइल के लिए अपने दृश्य diff कार्यक्रम का आह्वान करना चाहिए।


विंडोज / एमएसआईएस गिट के लिए समाधान

जवाब पढ़ने के बाद, मैंने एक आसान तरीका खोजा जिसमें केवल एक फ़ाइल को बदलना शामिल है।

  1. तर्क 2 और 5 के साथ, अपने diff प्रोग्राम को आमंत्रित करने के लिए बैच फ़ाइल बनाएं। यह फ़ाइल कहीं आपके पथ में होनी चाहिए। (यदि आपको नहीं पता कि वह कहां है, तो इसे c: \ windows में रखें)। इसे कॉल करें, उदाहरण के लिए, "gitdiff.bat"। मेरा है:

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. अपनी बैच फ़ाइल को इंगित करने के लिए पर्यावरण चर सेट करें। उदाहरण के लिए: GIT_EXTERNAL_DIFF=gitdiff.bat । या git config --global diff.external gitdiff.bat टाइप करके git config --global diff.external gitdiff.bat माध्यम से git config --global diff.external gitdiff.bat

    उद्धरणों का उपयोग न करना, या किसी भी पथ की जानकारी निर्दिष्ट करना महत्वपूर्ण है, अन्यथा यह काम नहीं करेगा। यही कारण है कि gitdiff.bat आपके रास्ते में होना चाहिए।

अब जब आप "गिट diff" टाइप करते हैं, तो यह आपके बाहरी diff दर्शक को आमंत्रित करेगा।


आप git difftool उपयोग कर सकते हैं।

उदाहरण के लिए यदि आपने मेल किया है, तो आप शाखाओं के master और डेवेल को संपादित कर सकते हैं:

git config --global diff.external meld
git difftool master..devel

आप xd http://github.com/jiqingtang/xd को आजमा सकते हैं, जो जीआईटी / एसवीएन diff के लिए जीयूआई रैपर है। यह एक diff उपकरण खुद नहीं है। जब आप git diff या svn diff को चलाने के लिए चाहते हैं तो आप xd चलाते हैं और यह आपको फ़ाइलों की एक सूची, एक पूर्वावलोकन विंडो दिखाएगा और आप अपनी पसंद के किसी भी डिफ टूल को लॉन्च कर सकते हैं, जिसमें tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs ( एडिफ), मिश्रित, फैलाना, कॉम्पारे और केडीएफ 3। आप किसी भी कस्टम उपकरण को भी चला सकते हैं।

दुर्भाग्य से उपकरण विंडोज का समर्थन नहीं करता है।

प्रकटीकरण : मैं इस उपकरण का लेखक हूं।


उपरोक्त महान उत्तरों का संक्षिप्त सारांश:

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

फिर टाइप करके इसका उपयोग करें (वैकल्पिक रूप से फ़ाइल नाम निर्दिष्ट करना):

git difftool

उपरोक्त मेरे पिछले "diff.external" कॉन्फ़िगरेशन उत्तर को पूरा करने के लिए:

जैकब द्वारा वर्णित अनुसार , गिट 1.6.3 ने गिट difftool पेश किया, मूल रूप से सितंबर 2008 में प्रस्तावित:

'[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]' = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
(इस उत्तर के अंतिम भाग में --extcmd देखें)

$LOCAL में प्रारंभिक संशोधन से फ़ाइल की सामग्री शामिल है और $REMOTE में अंतिम संशोधन में फ़ाइल की सामग्री शामिल है।
$BASE में $BASE में फ़ाइल की सामग्री शामिल है

यह मूल रूप से गिट इंडेक्स / वर्कट्री पर काम करने के लिए संशोधित git-mergetool मेरेटूलूल है।

इस स्क्रिप्ट के लिए सामान्य उपयोग केस तब होता है जब आपके पास या तो चरणबद्ध या अस्थिर परिवर्तन होते हैं और आप एक साइड-बाय-साइड xxdiff व्यूअर (जैसे xxdiff , tkdiff , आदि) में परिवर्तन देखना चाहते हैं।

git difftool [<filename>*]

एक अन्य उपयोग का मामला तब होता है जब आप एक ही जानकारी देखना चाहते हैं लेकिन मनमाने ढंग से काम करने की तुलना कर रहे हैं (यह वह हिस्सा है जहां रिवर्ज पार्सिंग बेहतर हो सकती है)

git difftool --start=HEAD^ --end=HEAD [-- <filename>*]

अंतिम उपयोग केस तब होता है जब आप अपने वर्तमान वर्कट्री की तुलना HEAD के अलावा किसी अन्य चीज़ से करना चाहते हैं (उदाहरण के लिए एक टैग)

git difftool --commit=v1.0.0 [-- <filename>*]

नोट: चूंकि गिट 2.5, git config diff.tool winmerge पर्याप्त है!
" गिट mergetool winmerge " देखें

गिट 2.5 से पहले:

अपने कस्टम diff उपकरण के साथ difftool को विन्यस्त करने के लिए व्यावहारिक मामला:

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

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

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

यदि आपके पास कोई अन्य टूल है (kdiff3, P4Diff, ...), एक और खोल स्क्रिप्ट बनाएं, और उचित difftool.myDiffTool.cmd कॉन्फ़िगरेशन निर्देश difftool.myDiffTool.cmd
फिर आप diff.tool कॉन्फ़िगरेशन के साथ आसानी से टूल स्विच कर सकते हैं।

डेव द्वारा अन्य विवरण जोड़ने के लिए आपके पास यह ब्लॉग प्रविष्टि भी है।
(या winmergeu विकल्पों के लिए यह सवाल )

इस सेटिंग के साथ ब्याज winmerge.sh स्क्रिप्ट है : आप विशेष मामलों को ध्यान में रखकर इसे अनुकूलित कर सकते हैं।

उदाहरण के लिए डेविड मार्बल का उदाहरण उदाहरण के लिए देखें जो इस बात से संबंधित है:

  • मूल या गंतव्य में नई फाइलें
  • मूल या गंतव्य में फ़ाइलों को हटा दिया

जैसा कि केम मेसन ने अपने जवाब में उल्लेख किया है, आप --extcmd विकल्प का उपयोग कर किसी भी रैपर से भी बच सकते हैं:

--extcmd=<command>

Diffs देखने के लिए एक कस्टम कमांड निर्दिष्ट करें। git-difftool कॉन्फ़िगर किए गए डिफ़ॉल्ट को अनदेखा करता है और यह विकल्प निर्दिष्ट होने पर $command $LOCAL $REMOTE चलाता है।

उदाहरण के लिए, इस प्रकार gitk किसी भी diff उपकरण को चलाने / उपयोग करने में सक्षम है


गिट 1.6.3 के बाद से, आप गिट difftool स्क्रिप्ट का उपयोग कर सकते हैं: नीचे मेरा जवाब देखें

यह article आपकी मदद करेगा। यहां सबसे अच्छे भाग हैं:

बाह्य diff उपकरण निर्दिष्ट करने के दो अलग-अलग तरीके हैं।

GIT_EXTERNAL_DIFF चर सेट करके, पहली विधि वह विधि है जिसका उपयोग आपने किया था। हालांकि, परिवर्तनीय निष्पादन योग्य के पूर्ण पथ को इंगित करना है। इसके अलावा, GIT_EXTERNAL_DIFF द्वारा निर्दिष्ट निष्पादन योग्य को 7 तर्कों के एक निश्चित सेट के साथ बुलाया जाएगा:

path old-file old-hex old-mode new-file new-hex new-mode

चूंकि अधिकांश diff टूल्स को तर्कों के एक अलग क्रम (और केवल कुछ) की आवश्यकता होगी, आपको इसके बजाय एक रैपर स्क्रिप्ट निर्दिष्ट करना होगा, जो बदले में वास्तविक diff टूल को कॉल करेगा।

दूसरी विधि, जिसे मैं पसंद करता हूं, "git config" के माध्यम से बाहरी diff उपकरण को कॉन्फ़िगर करना है । मैंने जो किया था यह रहा:

1) एक रैपर स्क्रिप्ट "git-diff-wrapper.sh" बनाएं जिसमें कुछ ऐसा शामिल है

-->8-(snip)--
#!/bin/sh

# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode

"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--

जैसा कि आप देख सकते हैं, केवल दूसरी ("पुरानी फ़ाइल") और पांचवीं ("नई फ़ाइल") तर्क diff टूल को पास कर दिए जाएंगे।

2) टाइप करें

$ git config --global diff.external <path_to_wrapper_script>

कमांड प्रॉम्प्ट पर, "git-diff-wrapper.sh" के पथ के साथ प्रतिस्थापित, इसलिए आपके ~ / .gitconfig में शामिल है

-->8-(snip)--
[diff]
    external = <path_to_wrapper_script>
--8<-(snap)--

रैपर स्क्रिप्ट और diff टूल के पथ निर्दिष्ट करने के लिए सही वाक्यविन्यास का उपयोग करना सुनिश्चित करें, यानी बैकस्लाश के बजाय आगे का उपयोग करें। मेरे मामले में, मेरे पास है

[diff]
    external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"

.gitconfig और में

"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat

रैपर स्क्रिप्ट में। पिछली "बिल्ली" को ध्यान में रखो!

(मुझे लगता है कि ' | cat ' केवल कुछ प्रोग्रामों के लिए जरूरी है जो उचित या लगातार वापसी की स्थिति वापस नहीं कर सकते हैं। यदि आप अपने diff टूल की स्पष्ट वापसी स्थिति है तो आप पिछली बिल्ली के बिना प्रयास करना चाहेंगे)

वह (उपरोक्त उद्धृत आलेख) कॉन्फ़िगरेशन फ़ाइल (पर्यावरण चर के माध्यम से नहीं) के माध्यम से परिभाषित बाहरी उपकरण का सिद्धांत है।
अभ्यास में (अभी भी बाहरी उपकरण की कॉन्फ़िगरेशन फ़ाइल परिभाषा के लिए), आप इसका उल्लेख कर सकते हैं:


चूंकि गिट संस्करण 1.6.3 के बाद " गिट difftool " है जिसे आप अपने पसंदीदा ग्राफिकल diff उपकरण का उपयोग करने के लिए कॉन्फ़िगर कर सकते हैं। वर्तमान में आउट ऑफ़ द बॉक्स बॉक्स केडीएफ 3, कॉम्पारे, टीकेडीफ, मेल्ड, एक्सएक्सडीफ, उभरा, विमडिफ, जीवीमडिफ, इमरज, डिफ्यूज और ऑपेन्डिफ़ हैं ; यदि आप जिस उपकरण का उपयोग करना चाहते हैं वह इस सूची पर नहीं है, तो आप हमेशा ' difftool.<tool>.cmd ' कॉन्फ़िगरेशन विकल्प का उपयोग कर सकते हैं।

"गिट difftool" एक ही विकल्प स्वीकार करता है जैसे "गिट diff"।


फ़ाइल निष्कासन और परिवर्धन से निपटने के लिए VonC के उत्तर पर बिल्डिंग, निम्न आदेशों और स्क्रिप्ट का उपयोग करें:

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

जो इसे आपके वैश्विक में डालने जैसा ही है। .gitconfig :

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
    prompt = false

फिर winmerge.sh में निम्नलिखित winmerge.sh जो आपके पथ पर होना चाहिए:

#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
    echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
    echo "added: $3"
else
    echo "changed: $3"
    "C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi

मिलाया स्थापित करें

 # apt-get install meld

फिर इसे difftool के रूप में चुनें

 $ git config --global diff.tool meld

यदि टूर इसे कंसोल प्रकार पर चलाने के लिए चाहते हैं:

 $ git difftool

यदि आप ग्राफिक मोड प्रकार का उपयोग करना चाहते हैं:

 $ git mergetool

और आउटपुट होगा:

 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   {local}: modified file
   {remote}: modified file
 Hit return to start merge resolution tool (meld):

तो बस meld (डिफ़ॉल्ट) का उपयोग करने के लिए एंटर दबाएं, यह ग्राफ़िक मोड खोल देगा, जादू को सहेज देगा और विलय को हल करने के लिए दबाएगा। बस इतना ही


मैं इस बिट का उपयोग ~/.gitconfig में लंबे समय से कर रहा हूं:

[diff]
    external = ~/Dropbox/source/bash/git-meld

git-meld :

#!/bin/bash
if [ "$DISPLAY" = "" ];
then
    diff $2 $5
else
    meld $2 $5
fi

लेकिन अब मैं हमेशा ग्राफिकल वातावरण में मेल्ड का उपयोग करने से थक गया हूं, और इस सेटअप के साथ सामान्य diff को आमंत्रित करने के लिए यह छोटा नहीं है, इसलिए मैंने इसे स्विच किया:

[alias]
    v =  "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y [email protected] ; fi' -"

इस सेटअप के साथ, इस काम की तरह चीजें:

git v
git v --staged
git v -t kompare
git v --staged -t tkdiff

और मुझे अभी भी अच्छी पुरानी git diff रखने के लिए मिलता है।


मैं उबंटू पर कॉम्पारे का उपयोग करता हूं:

sudo apt-get install kompare

दो शाखाओं की तुलना करने के लिए:

git difftool -t kompare <my_branch> master

मैक ओएस एक्स पर,

git difftool -t diffuse 

गिट फ़ोल्डर में मेरे लिए नौकरी करता है। फैलाने के लिए, कोई पोर्ट का उपयोग कर सकते हैं -

sudo port install diffuse

यदि आप साइगविन के माध्यम से ऐसा कर रहे हैं, तो आपको साइगपाथ का उपयोग करने की आवश्यकता हो सकती है:

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`

यदि आप मैक पर हैं और XCode है, तो आपके पास FileMerge इंस्टॉल है। टर्मिनल कमांड opendiff है, तो आप केवल git difftool -t opendiff कर सकते हैं


यदि आपके पास पहले से फ़ाइल प्रकार से जुड़े एक diff उपकरण होता है (कहें, क्योंकि आपने टोर्टोइज एसवीएन स्थापित किया है जो एक diff दर्शक के साथ आता है) तो आप नियमित git diff आउटपुट को "temp" फ़ाइल में पाइप कर सकते हैं, फिर बस उस फ़ाइल को बिना आवश्यकता के सीधे खोलें दर्शक के बारे में कुछ भी जानने के लिए:

git diff > "~/temp.diff" && start "~/temp.diff"

इसे एक वैश्विक उपनाम के रूप में स्थापित करने से भी बेहतर काम होता है: git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"

यहां एक बैच फ़ाइल है जो विंडोज के लिए काम करती है - डिफ़ॉल्ट स्थान पर डिफमेज स्थापित है, x64 को संभालती है, बैकस्लैश प्रतिस्थापन के लिए आगे संभालती है और खुद को स्थापित करने की क्षमता होती है। अपने पसंदीदा diff कार्यक्रम के साथ DiffMerge को प्रतिस्थापित करना आसान होना चाहिए।

स्थापित करने के लिए:

gitvdiff --install 

gitvdiff.bat:

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF






diffmerge