ডিফ করতে ফাইলের জন্য গিটের ভিতরে উইনমার্জ ব্যবহার করুন


98

ডিফসগুলি করার জন্য গিটের অভ্যন্তরে উইনমার্জ ব্যবহার করার কোনও উপায় আছে কি?



সম্পর্কিত পোস্ট - গিটের সাধারণভাবে কীভাবে একটি ডিফ সরঞ্জামের কনফিগার করতে হয় ।
আরবিটি

উত্তর:


114

6 বছর পরে জুন 2015 আপডেট করুন:

" গিট মার্জেটুল উইনমার্জ " এ বিশদ হিসাবে , একটি সরল git config diff.tool winmergeযথেষ্ট।

গিট 2.5+ (কিউ 2, 2015) এখন উইনমার্ফকে ডিফ বা মার্জ সরঞ্জাম হিসাবে সচেতন!


আসল উত্তর (২০০৯-২০১২)

(এমএসজিগিত, 1.6.5, ডস সেশন)

প্রথম অংশটি (উইনমার্জ ব্যবহার করে) বর্ণিত হয়েছে " ভিজ্যুয়াল ডিফ প্রোগ্রামের সাথে আমি 'গিট ডিফ' আউটপুট কীভাবে দেখি? "

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"

( উইনমার্গ কমান্ড-লাইন বিকল্পগুলি দেখুন )

git difftool

এখন উইনমার্গ চালু করবে।
আপনি যদি git diffউইনমার্গ চালু করতে চান তবে ঠিক সেট করুন:

set GIT_EXTERNAL_DIFF=winmerge.sh

তবে আসল সংযোজনীয় মানটি সেই একই ডিফ সরঞ্জামটি ব্যবহার করার ক্ষমতা থেকে আসে যা একই ব্যাখ্যায় ক্রমগতভাবে উপস্থাপন করার পরিবর্তে এক ব্যাচে সমস্ত পার্থক্য উপস্থাপন করে, আপনাকে একবারে ডিফ সরঞ্জাম সরঞ্জামগুলির উইন্ডোজ একটি ফাইল বন্ধ করতে বাধ্য করে।

জুন 2012 আপডেট করুন (আড়াই বছর পরে):

ফাইল-বাই-ফাইলের পরিবর্তে ডিরেক্টরি তুলনা প্রাপ্তিসাধ্য শীঘ্রই হবে:
দেখুন গীত 1.7.11.rc1 [ঘোষণা] :

" git difftool" --dir-diff"বিকল্পটি বাইরের ডিফ সরঞ্জামগুলি স্পোন করার জন্য শিখেছে যা একবারে ফাইল জোড়ের জন্য একবার বাহ্যিক সরঞ্জামের দৃষ্টান্ত চালানোর পরিবর্তে দুটি অস্থায়ী ডিরেক্টরিকে জনবহুল করার পরে দুটি ডিরেক্টরি শ্রেণিবিন্যাসের তুলনা করতে পারে

" প্যাচ difftool: difftoolডিরেক্টরি ডিফার্সগুলি পরিচালনা করতে শেখান " এবং আরও তথ্যের জন্য উত্তর " গিট শাখাগুলির ডিরেক্টরি তুলনা " দেখুন।


ডিরেক্টরি স্ক্রিপ্ট দ্বারা মূল ডিফ্টল (ডিসেম্বর ২০০৯)

শেবা ইলিংওয়ার্থ তাঁর উত্তরে যেমন উল্লেখ করেছেন , একটি স্ক্রিপ্ট গিটডাফাল.শ (পথটিতেও রেখেছেন) ঠিক এটি করতে পারে:

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

তবে এটি কেবল এন ফাইলগুলির জন্য এন উইন্ডো খোলার মাধ্যমে কাজ করে (যদি আপনি উইনমার্গের বিকল্পটি ব্যবহার করার চেষ্টা করেন তবে টেম্প ফাইলগুলি ডিফ্টলটি খুব তাড়াতাড়ি মুছে ফেলার কারণে এটি কার্যকর হবে না)-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

বিভিন্ন ডিরেক্টরিতে একই নামের ফাইল হ্যান্ডেল করার পক্ষে এটি যথেষ্ট শক্তিশালী নয়, তবে এটি আপনাকে কী সম্ভব তা সম্পর্কে একটি সাধারণ ধারণা দেয়:
এখানে কেবলমাত্র একটি উইনমার্গ খোলে যা অভ্যন্তরীণ পার্থক্যের ফাইলগুলির তালিকা সহ। আপনি যা পরীক্ষা করতে চান তার উপর আপনি ক্লিক করতে পারেন, তারপরে একটি সাধারণ ESCসমস্ত WinMerge-diffসেশনটি বন্ধ করে দেবে ।


4
গিট সংস্করণ 1.6.5.1.1367.gcd48 এর সাহায্যে এটি চেষ্টা করে দেখে মনে হচ্ছে যে এই টেম্প ফোল্ডারে কোনও ফাইল উত্পন্ন করা যায় না। কোন ধারণা কোথায় খুঁজছেন? ধন্যবাদ!
আর্ট

@ আর্ট: এই ডিবাগের ক্ষেত্রে, আমি স্ক্রিপ্টটি সরল করে সমস্যাটি বিচ্ছিন্ন করার চেষ্টা করি: 1 / যদি স্ক্রিপ্টটি 7 টি প্যারামিটারের সাথে কল করা হয় (ফাইলগুলি অনুলিপি করার জন্য গিট ডিফারের প্রথম পাস) 2 / স্ক্রিপ্টটি কমপক্ষে ফিরে বলা হয় শেষে git diff?
ভোনসি

4
@ এরিক: অপশন সম্পর্কিত -ub, উইনমার্জ এফএকিউ দেখুন : এটি এর চেয়ে সমান -u: এটি উইনমার্গকে বলেছে যে এমআরইউতে ফাইলগুলি যুক্ত না করা।
ভোনসি

4
@ এরিক: আপনার ফাইলের তুলনা দেখতে হবে c:\Temp\GitDiff\oldএবং c:\Temp\GitDiff\new' /tmp' নয়। আপনি কি নিশ্চিত যে আপনি এই ডস প্রোগ্রামটি ডস অধিবেশন (এবং বাশ সেশন নয়) থেকে সম্পাদন করছেন?
ভোনসি

4
@ কফিম্যাকার এটি ""আমার ক্ষেত্রে মূল্যায়ন করেনি ( git configউইন্ডোজ সিএমডি থেকে আদেশটি কার্যকর করে । তবে আপনি ঠিক বলেছেন: ""বাশ শেল থেকে মৃত্যুদন্ড কার্যকর করা হয়েছে কিনা তা মূল্যায়ন করবে ।
ভনসি

19

আমি প্রথম অংশটি 2 টি জায়গায় ব্যবহার করে সমস্যার মুখোমুখি হয়েছি এবং নীচে এটি ঠিক করেছি

  1. উইনমার্স.এমডি স্থাপনের জন্য দ্বিতীয় কমান্ডের জন্য সেমিডলাইন (OC লোকাল এবং EM রিমোটের আগে) অতিরিক্ত স্ল্যাশ দরকার ছিল, অন্যথায় সাইগউইন সেমিডলাইনটিতে পরিবর্তনশীলটি স্থাপন করছিল

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. উইনরম্স.শ ফাইলটি এতে পরিবর্তন করে (এটি ছাড়াই ডান-পাথ-অবৈধ ত্রুটি পাচ্ছিল)

    #!/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")"
    

4
ভনসি যেভাবে নির্দেশনা দিয়েছিল আমি ঠিক তাই করেছি, তবে আমি আমার উইনমার্স.শ স্ক্রিপ্টে খালি যুক্তি পাচ্ছিলাম। অতিরিক্ত স্ল্যাশ ব্যবহার করে সমস্যার সমাধান হয়েছে। ধন্যবাদ!
আশাগি

6

যেহেতু থ্রেডটি বিভ্রান্তিকর এবং দ্বিখণ্ডিত হয়ে উঠছে, তাই এখানে ডিরেক্টরি তালিকা "--dir-diff" msysgit Git উইন্ডোজের জন্য WinMerge পদ্ধতিটির জন্য একীভূত নির্দেশাবলী রয়েছে।

পদক্ষেপ 1 - নীচের বিষয়বস্তুগুলির সাথে আপনার পথে অ্যাক্সেসযোগ্য কোনও স্থানে উইনড্র্যাম.শ নামের একটি ফাইল তৈরি করুন (যেমন /home/bin/win مسئلو.sh)।

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

পদক্ষেপ 2 - উইন্ডোমার.শকে ডিফ্টল হিসাবে ব্যবহার করতে গিটকে নির্দেশ দেওয়ার জন্য গিট বাশে নিম্নলিখিত কমান্ডগুলি টাইপ করুন (এই বিকল্পগুলি /home/.gitconfig এ সংরক্ষণ করা হবে):

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 difftool --dir-diff

পদক্ষেপ 4 - দ্রুত অ্যাক্সেসের জন্য, আপনার হোম ফোল্ডারে এই লাইনটি .bashrc এ যুক্ত করে এই কমান্ডের জন্য একটি উপাত্ত তৈরি করুন (বা ফাইলটি ইতিমধ্যে উপস্থিত না থাকলে এই লাইনের সাথে .bashrc ফাইল তৈরি করুন):

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

পদক্ষেপ 5 - এখন আপনি উইটমার্জে খুব শীঘ্রই গিট বাশে নিম্নলিখিত কমান্ডটি টাইপ করে দ্রুত দেখতে পাচ্ছেন

diffdir

এটা তোলে কাউকে অর্থ ব্যাখ্যা আছে সহায়ক হবে $LOCALএবং $REMOTE
তোলা ওদেজেয়

6

আমার কাছে একটি স্ক্রিপ্ট রয়েছে যা গিট কনফিগারেশনে ডিফ এবং মেশার সরঞ্জামগুলি যথাযথ পরামিতিগুলির সাথে সেট করবে যা পৃথক .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 এ তালিকাভুক্ত হবে


4
নিম্নলিখিত কমান্ডটি আমার পক্ষে কার্যকর হয়নি। 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\"
জোশ

4
এটা কাজ করে নি, কিন্তু কিছু পরিবর্তনের সঙ্গে, এটা কাজ করে: প্রশাসক হিসেবে 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\""। কয়েকটি নিরাপদ পালানোর স্ট্রিং ছিল (ঠিক এর আগে সেখানে কয়েকটি অতিরিক্ত অযাচিত ব্যাকস্ল্যাশগুলি নোট করুন $- আমার ধারণা যে পালানোর $দরকার নেই)। এছাড়াও, এটির "পরে একটি পরিণতি অনুপস্থিত WinMergeU?.exe। চালান git config --get mergetool.winmerge.cmdদেখতে আসলে প্রস্তুত করা হয়েছে। যাইহোক, অ .shসংস্করণ জন্য ধন্যবাদ : +1!
falsarella

5

উইন্ডোজ এ আপনি এটি এইভাবে করতে পারেন:

1) .gitconfig ফাইলটি খুলুন। এটি আপনার হোম ডিরেক্টরিতে অবস্থিত: c: \ ব্যবহারকারীদের \ ব্যবহারকারীর নাম.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

ধরে নেওয়া:

  • উইনমার্জ ইনস্টল করা আছে
  • উইন্ডোজের জন্য গিটটি "গিট সংস্করণ 2.12.0.windows1" বা তদূর্ধ্ব থেকে ইনস্টল করা আছে (যদিও গিটের পূর্ববর্তী সংস্করণগুলি কমান্ডটি প্রবর্তন করতে পারে)।

ধন্যবাদ, এটি সর্বাধিক সহজ সমাধান
কোড

2

আমার গিট ইনস্টলেশনটি ব্যাশ শেল নিয়ে আসার সাথে সাথে কেন সমাধানটি ডস ব্যাচ ফাইল হিসাবে উপস্থাপন করা হয়েছিল তা সম্পর্কে আমি বিভ্রান্ত ছিলাম। আমি বাশ থেকে কোনও ডস প্রসঙ্গ চলতেও অক্ষম ছিলাম, তাই ব্যাশের প্রসঙ্গে পূর্বের ভাগ ভাগ করে নেওয়ার চেষ্টা করেছি।

যেহেতু 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(ব্যাশ-এ) ম্যাপ করা হয়েছে %LOCALAPPDATA%\Temp\1\(উইন্ডোজে), সেজন্য আমি উইনমার্জে আমার কলটিতে পরবর্তীটি ব্যবহার করছি।


4
থ্যাঙ্ক ইউ এর 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"!
দোবাউ

এই কাজটি করতে এতগুলি হুপ থেকে ঝাঁপিয়ে পড়া হাস্যকর মনে হয় তবে তা হয়। আপনি যা করতে হবে তা একই সাথে সমস্ত ফাইলের ভিন্নতা পাবেন। সাবডিরেক্টরিগুলিতে ফাইলগুলি সঠিকভাবে পরিচালনা করার জন্য আমাকে @ ডোবাউ দ্বারা উল্লিখিত পরিবর্তনগুলি করতে হয়েছিল।
টম

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 কমান্ড লাইন ম্যানুয়াল : "পরামিতি পারেন একটা ফরওয়ার্ড স্ল্যাশ (/) অথবা ড্যাশ প্রিফিক্স করা (-) চরিত্র"

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.