গিট-সংহতকরণের জন্য কি লাইন-শেষের পার্থক্য উপেক্ষা করা সম্ভব?


150

git mergeলাইন-শেষের পার্থক্য উপেক্ষা করা কি সম্ভব ?

হয়তো আমি ভুল প্রশ্ন জিজ্ঞাসা করছি ... তবে:

আমি উআইএসএনজি চেষ্টা করেছিলাম config.crlf inputকিন্তু বিষয়গুলি কিছুটা অগোছালো এবং নিয়ন্ত্রণের বাইরে চলে যায়, বিশেষত যখন আমি সত্যের পরে এটি প্রয়োগ করি ।

একটি জিনিস, সত্যতার পরে এই কনফিগারটি প্রয়োগ করা এই বিকল্পটি প্রয়োগ করার আগে ভাণ্ডারগুলিতে প্রতিশ্রুতিবদ্ধ ফাইলগুলিকে প্রভাবিত করবে বলে মনে হয় না। আর একটি বিষয় হঠাৎ করে সমস্ত কমিটের ফলে সিআরএলএফ সম্পর্কে প্রচুর বিরক্তিকর সতর্কতা বার্তা এলএফতে রূপান্তরিত হয়।

সত্যি কথা বলতে কী লাইন-এন্ডিং ব্যবহার করা হয় তা আমি সত্যিই যত্নশীল না, আমি ব্যক্তিগতভাবে ইউনিক্স শৈলী পছন্দ করি \nতবে যাই হোক না কেন। আমি যতটা যত্ন নিই তা হ'ল git mergeকিছুটা স্মার্ট হতে হবে এবং লাইন-এন্ডিংয়ের পার্থক্যগুলি উপেক্ষা করবে।

কখনও কখনও আমার কাছে দুটি অভিন্ন ফাইল থাকে তবে গিটটি এগুলি বিরোধের হিসাবে চিহ্নিত করে (এবং দ্বন্দ্বটি পুরো ফাইলটি হয়) কেবল কারণ তারা একটি ভিন্ন লাইন সমাপ্তি অক্ষর ব্যবহার করে।

হালনাগাদ:

আমি খুঁজে পেয়েছি যে git diffকোনও --ignore-space-at-eolবিকল্প গ্রহণ করে , git mergeএই বিকল্পটিও কি ব্যবহার করা দেওয়া সম্ভব হবে ?


28
ওহ আমি ইচ্ছুক। গিটে শেষ হওয়া এই লাইনটি সম্পূর্ণরূপে ভাঙা হয়েছে
1800 তথ্য

এই তৃতীয় পক্ষের মার্জ সরঞ্জামটি চিত্রিত করে কেবল একটি পরীক্ষার কেস যুক্ত করা হয়েছে যা মার্জ করার সময় ইওল শৈলী উপেক্ষা করবে
ভোনসি

সুতরাং, স্পষ্ট করার জন্য (আমি যা নির্ধারণ করতে পারি) থেকে: সিআর এর উপেক্ষা করার জন্য গিট পাওয়ার কোনও উপায় নেই তবে অন্যান্য সমস্ত চলমান শ্বেত স্পেস সম্পর্কে অভিযোগ করুন?
স্টিফেন

নীচের উত্তরটি একবার দেখে নিনgit config merge.renormalize true
কুইনিল

উত্তর:


115

আপডেট 2013:

কৌশল recursiveএবং কৌশল বিকল্প ( -X) এর সাথে একত্রীকরণ ব্যবহার করে সাম্প্রতিক আরও গিট সংস্করণগুলি অনুমোদন দেয় :

গিট একত্রিতকরণ-পুনরাবৃত্তি -জাইনোর-স্পেস-এ-ইওল

তবে " -Xignore-space-change" ব্যবহার করাও একটি সম্ভাবনা

  • ফ্যাব-ভি নীচে উল্লেখ করেছে :
    গিট মার্জ মাস্টার-পুনরাবৃত্ত-এক্স পুনর্নির্মাণ
    
    

জাকুব। এও মন্তব্য করেছেন যে কৌশলগুলি চেরি-বাছাইয়ের সাথেও কাজ করে :

git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize 

এই তুলনায় অনেক ভাল কাজ করে ignore-all-space


আসল উত্তর (মে ২০০৯)

ইওল স্টাইল উপেক্ষা করার জন্য প্যাচটি 2007 এর জুনে প্রস্তাব করা হয়েছিল , তবে এটি কেবল উদ্বেগের বিষয় git diff --ignore-space-at-eolনয় git merge

এই সময়, প্রশ্ন জিজ্ঞাসা করা হয়েছে:

করা উচিত --ignore-space-at-eolকরার জন্য একটি বিকল্প হতে git-merge?
মার্জগুলি যেখানে এই কার্যকারিতা গুরুত্বপূর্ণ।
কার্যকরভাবে এই বিকল্পগুলির সাথে একটি স্বয়ংক্রিয়-সমাধান হওয়া সংশ্লেষের শব্দার্থগুলি কী কী - সেগুলি কি কেবল নামকরণ সনাক্তকরণের জন্য ব্যবহৃত হয়, বা আমরা যেমন উদাহরণস্বরূপ, কেবল শ্বেত স্পেস পরিবর্তনের সাথে পতাকা বিরোধ নয়? এবং যদি আমরা না করি তবে আমরা কোন সংস্করণ স্বয়ংক্রিয়ভাবে গ্রহণ করব?

জুলিও সি হামানো ঠিক উত্সাহী ছিল না:

এটি অবশ্যই লোভনীয়, তবে আমার সন্দেহ যে এটি পরবর্তী রাউন্ডে ছেড়ে দেওয়া উচিত।
আমি সন্দেহ করি যে এটি দুটি বিভিন্ন ধরণের ডিফের ধারণা প্রবর্তন করবে, একটি যান্ত্রিকভাবে প্রক্রিয়াজাতকরণ হবে (অর্থাত্ "গিট-মার্জ-রিকার্সিভ" এর সাথে একত্রীকরণে ব্যবহৃত হবে এবং "গিট-এমএম" দিয়ে প্রয়োগ করবেন) এবং অন্যটি দ্বারা পরিদর্শন করা হবে মানুষ বুঝতে।
পরবর্তী ক্ষেত্রেগুলির জন্য ইনপুটটি বন্ধ করে দেওয়া প্রায়শই দরকারী হতে পারে, যদিও মংড ইনপুট ফাইলগুলির তুলনা করে আউটপুট যান্ত্রিক প্রয়োগের জন্য সহজে ব্যবহারযোগ্য নাও হতে পারে।

সাধারণ ধারণাটি যখন আসে git mergeতখন তৃতীয় পক্ষের সংযোজন সরঞ্জামের উপর নির্ভর করা।

উদাহরণস্বরূপ, আমার কাছে গিফ সংশ্লেষের জন্য ডিফফার্জে সেটআপ আছে , একটি নিয়ম সেট করা হচ্ছে যা নির্দিষ্ট সংখ্যক ফাইলের ইওলটিকে উপেক্ষা করার অনুমতি দেয় merge


ডিএসফ বা গিট ব্যাশ সেশনের জন্য ডাইফ বা গিটার বাশ সেশনের জন্য উইন্ডোজে ডিফফর্ম বা কেডিফ 3 সহ উইন্ডোজে সেটআপ করুন:

  • আপনার পথের মধ্যে একটি ডিরেক্টরি সেট করুন (এখানে c:\HOMEWARE\cmd:)।
  • সেই ডিরেক্টরিতে স্ক্রিপ্টটি মার্জ করুন sh

merge.sh:

#!/bin/sh

# Passing the following parameters to mergetool:
#  local base remote merge_result

alocal=$1
base=$2
remote=$3
result=$4

if [ -f $base ]
then
    #"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"

    # for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
    # KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
    "C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
    #there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
    #"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"

    # KDiff3 however does know how to merge based on 2 files (not just 3)
    "C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi
  • গিটের জন্য আপনার মার্জ র‌্যাপারটি ঘোষণা করুন

গিট কনফিগারেশন কমান্ড:

git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false
  • AutoCRLF মিথ্যা কিনা তা পরীক্ষা করুন

সিস্টেম স্তরে গিট কনফিগারেশন:

git config ---system core.autoCRLF=false
  • পরীক্ষা করুন, যখন দুটি লাইন একরকম হয় (তবে তাদের ইওল অক্ষর), ডিফফর্ম বা কেডিফ 3 উভয়ই মার্জ করার সময় সেই লাইনটিকে উপেক্ষা করবে।

ডস স্ক্রিপ্ট (দ্রষ্টব্য: ডস 2 ইউনিক্স কমান্ডটি এখান থেকে এসেছে এবং এটি ইউনিক্স ইওল-স্টাইল অনুকরণ করতে ব্যবহৃত হয় That এই আদেশটির উত্তরটির শুরুতে উল্লিখিত ডিরেক্টরিতে অনুলিপি করা হয়েছে)):

C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):

এই মুহুর্তে (হিটিং "রিটার্ন"), ডিফফর্মেজ বা কেডিফ 3 খুলবে এবং আপনি নিজেই দেখতে পাবেন কোন লাইনগুলি আসলে একত্রিত হয়েছে এবং কোন লাইনগুলি উপেক্ষা করা হয়েছে।

সতর্কতা : ফলাফল ফাইলটি সর্বদা উইন্ডোজ ইওল মোডে (সিআরএলএফ) ডিফফর্মজের সাথে থাকবে ...
কেডিফ 3 একটি উপায়ে বা অন্য কোনওভাবে সংরক্ষণের প্রস্তাব দেয়।


বখশিষের জন্য ধন্যবাদ! ম্যাকের মাউন্ট এবং ফাইলমেজও দুর্দান্ত অ্যাপস বলে মনে হচ্ছে।
লিও লোপল্ড হার্টজ 준영

1
তথ্যের জন্য, কৌশল সঙ্গে আরো কাজ চেরি-অবচয় : git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize (এই অনেক ভালো চেয়ে কাজ করে ignore-all-space)
jakub.g

1
@ জাকুব.উইড পয়েন্ট! আরও দৃশ্যমানতার জন্য আমি এটিকে উত্তরে অন্তর্ভুক্ত করেছি।
ভনসি

98

আমি একই উত্তর খুঁজছেন ছিল এবং আমি খুঁজে পাওয়া যায় নি এই

শাখাগুলিকে আলাদা করে চেকিন / চেকআউট বৈশিষ্ট্যগুলির সাথে মার্জ করা

যদি আপনি কোনও ফাইলটিতে এমন বৈশিষ্ট্য যুক্ত করে থাকেন যা সেই ফাইলটির জন্য ক্যানোনিকাল রিপোজিটরি ফর্ম্যাটকে পরিবর্তিত করে, যেমন একটি ক্লিন / স্মাড ফিল্টার বা পাঠ্য / ইওল / পরিচয় বৈশিষ্ট্য যুক্ত করা, বৈশিষ্ট্যটি যেখানে নেই সেখানে কিছু মার্জ করা সাধারণত মার্জ সংঘাত সৃষ্টি করে ।

এই অপ্রয়োজনীয় মার্জ সংঘাতগুলি প্রতিরোধ করতে, গিটকে একটি ভার্চুয়াল চেক-আউট চালানো এবং ফাইলের তিনটি পর্যায়ে চেক-ইন চালানোর জন্য বলা যেতে পারে যখন মার্জ.আরনরমালাইজেশন কনফিগারেশন ভেরিয়েবল সেট করে একটি ত্রি-মুখী সংহতিকে সমাধান করে। যখন রূপান্তরিত ফাইলটি একটি রূপান্তরিত ফাইলের সাথে একীভূত করা হয় তখন এটি চেক ইন রূপান্তরটির কারণে উত্সাহী একীকরণের দ্বন্দ্ব ঘটায় changes

"ধূমপান পরিষ্কার" যতক্ষণ না ইতিমধ্যে ধুয়ে ফেলা ফাইলগুলিতে এমনকি "ক্লিন" হিসাবে একই আউটপুটে ফলাফল আসে, এই কৌশলটি স্বয়ংক্রিয়ভাবে সমস্ত ফিল্টার-সম্পর্কিত দ্বন্দ্ব সমাধান করবে। যে ফিল্টারগুলি এভাবে কাজ করে না তাদের অতিরিক্ত সংশ্লেষের দ্বন্দ্ব হতে পারে যা ম্যানুয়ালি সমাধান করতে হবে।

সুতরাং কোনও কমান্ডে এই কমান্ডটি চালানো কৌশলটি কার্যকর করবে:

git config merge.renormalize true

20
এটি এখন ডিফল্ট উত্তর হিসাবে প্রাপ্য। প্রশ্নটি প্রথম জিজ্ঞাসা করার পরে অনেক কিছু বদলেছে, গিটের এটির পরিচালনা এখন একীকরণের সাথে তৈরি হয়েছে youআপনি যেমন বলছেন তেমন সাধারণ করুন।
অ্যান্টন আই সিপোজ

এটি কেবল দুর্দান্ত ... আমার দিনটি বাঁচায়
ম্যাথিউয়াস



4

আমি যা করেছি তা হ'ল সবকিছুকে ডিফল্ট হিসাবে (যেমন স্বতঃক্রাফাল = সত্য) ছেড়ে দেওয়া, সমস্ত ফাইল স্পর্শ করুন (সন্ধান করুন ex অন্যথায় আপনি হয় সবসময় বিরক্তিকর বার্তা বা আশ্চর্যজনক পার্থক্যের দ্বারা জর্জরিত হয়ে পড়ে থাকবেন, বা গিটের সমস্ত সাদা জায়গার বৈশিষ্ট্যগুলি বন্ধ করতে হবে।

আপনি দোষের তথ্য হারাবেন, তবে এটির চেয়ে পরে তা করা ভাল :)


4

"গিট মার্জ-এক্সারনরমালাইজ" কবিতার মতো কাজ করে।



1

http://stahlforce.com/dev/index.php?tool=remcrlf

আমি চেষ্টা করেছিলাম, তবে যদি আপনার কোডের শেষ লাইনের পরে আপনার কাছে ইতিমধ্যে সিআরএলএফ না থাকে তবে এটি নিজেই একটি এলএফ যুক্ত করে এবং ফাইলটি গিটে পরিবর্তিত দেখায়। এটি ছাড়াও এটি কাজ করে।


0

আমার কাছে এখন মনে হয়েছে যে সর্বোত্তম উপায় হ'ল মার্জ হওয়ার আগে উভয় শাখায় লাইন শেষ হওয়া (এবং প্রতিশ্রুতিবদ্ধ) করা স্বাভাবিক to

আমি "সিআরএলএফ কে এলএফতে রূপান্তরিত করে" গুগল করেছিলাম এবং এটি প্রথম ফলাফল হিসাবে পেয়েছি:
http://stahlforce.com/dev/index.php?tool=remcrlf

আমি এটি ডাউনলোড করেছি এবং ব্যবহার করেছি, মনে হচ্ছে একটি দুর্দান্ত সরঞ্জাম।

>sfk remcr . .py

ডিরেক্টরি এবং একটি ফাইলের ধরণ (উদাহরণস্বরূপ .py) নির্দিষ্ট করা সুনিশ্চিত করুন অন্যথায় এটি .gitডিরেক্টরিতে থাকা সামগ্রীর সাথে বিশৃঙ্খলা সৃষ্টি করার চেষ্টা করতে পারে !


0

আফাফিক, (আমি চেষ্টা করে দেখিনি) আপনি git diffযে শাখাকে সাধারণ পূর্বপুরুষের সাথে একত্রীকরণ করতে চান তা তুলনা করতে ব্যবহার করতে পারেন , তারপরে ফলাফলগুলি প্রয়োগ করুন git apply। উভয় কমান্ডের --ignore-whitespaceলাইন শেষ এবং সাদা স্থান ত্রুটি উপেক্ষা করার বিকল্প রয়েছে।

দুর্ভাগ্যক্রমে, যদি প্যাচটি পরিষ্কারভাবে প্রয়োগ না করা হয় তবে পুরো ক্রিয়াটি বাতিল হয়ে যায় orted আপনি মার্জ বিরোধগুলি ঠিক করতে পারবেন না। একটা হল --rejectমধ্যে unpatchable কৃপণ ব্যক্তি ছাড়ার বিকল্প .rejফাইল, যা সাহায্য করে, কিন্তু একটি ফাইল দেখানো একত্রীকরণ দ্বন্দ্ব তার হিসাবে একই নয়।


-1

মার্জ সংঘাতগুলি সমাধান করুন পড়ার পরে : সমস্ত ফাইল ওভাররাইট করে জোর করে

আমি অবশেষে এই সমস্যাটির আমার সংস্করণটি সমাধান করেছি। আমি উজানের রেপো থেকে আপডেটগুলি টেনে আনার চেষ্টা করছিলাম তবে আমার বর্তমান একটিতে সিআরএলএফ সম্পর্কিত সমস্যা ছিল এবং ফলস্বরূপ মার্জ করতে পারিনি। এটি লক্ষ করা উচিত যে আমার চিন্তার জন্য প্রয়োজনীয় কোনও স্থানীয় পরিবর্তন ছিল না। নিম্নলিখিত পদক্ষেপগুলি আমার সমস্যার সমাধান করেছে:

কাঁটাচামচ সিঙ্ক করার বিষয়ে গিথুবের নির্দেশনা অনুসারে ( https://help.github.com/articles/syncing-a-fork/ ):

  1. git fetch upstream

  2. git reset --hard upstream/master
    আমার গিট সম্পর্কে সীমাবদ্ধ বোঝাপড়া আমাকে বলছে যে আমি যা চাইছি তা করছে - প্রবাহের উত্সে করা সমস্ত পরিবর্তনগুলি অর্জন করার জন্য আমার কাঁটাচামচ (কোনও প্রকৃত অমীমাংসিত পরিবর্তন ছাড়াই) মুক্তি দেওয়া হচ্ছে। উত্স পৃষ্ঠা অনুসারে, এই পদক্ষেপটি সাধারণত প্রয়োজন হয় না, তবে সিআরএলএফ ইস্যু এটি প্রয়োজনীয় করে তোলে।

  3. git merge upstream/master

  4. git push

1
আপনি বুঝতে পেরেছেন যে git reset --hard upstream/masterআপনার স্থানীয় শাখাটি ছুঁড়ে ফেলেছে এবং এটিকে নির্দেশ করে upstream/master, git merge upstream/masterকোনও বিকল্প নেই?
ক্রিস্টোফার হামার্সট্রিম

-1

তবে আমি সঠিক লাইনের সমাপ্তি অর্জনের জন্য সেডের মতো সরঞ্জামটি ব্যবহার করার পরামর্শ দেব এবং তারপরে ফাইলগুলি পৃথক করুন। আমি দম্পতি ঘণ্টা ব্যয় diffing বিভিন্ন লাইন শেষা w শ সঙ্গে প্রকল্প।

সবচেয়ে ভাল উপায় ছিল:

  1. কেবলমাত্র .gitঅন্য কোনও ডিরেক্টরিতে প্রকল্প ফাইল ( ডিরেক্টরি বাদ দিন ) অনুলিপি করুন এটিতে সংগ্রহস্থল তৈরি করুন, তারপরে ফাইলগুলি যুক্ত করুন এবং তাদের প্রতিশ্রুতিবদ্ধ করুন (নতুন ভাণ্ডারে মাস্টার শাখায় থাকা উচিত)।
  2. দ্বিতীয় প্রজেক্ট থেকে একই ফোল্ডারে ফাইলগুলি অনুলিপি করুন, তবে অন্য একটি শাখা উদাহরণস্বরূপ dev( git checkout -b dev), এই শাখায় ফাইলগুলি কমিট করুন এবং চালান (যদি প্রথম প্রকল্পটি মাস্টার হয়): git diff master..dev --names-only পরিবর্তিত ফাইলের নাম দেখতে কেবল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.