git - গিট-diff উপেক্ষা ^ এম




newline git-diff (9)

একটি প্রকল্প যেখানে কিছু ফাইল ^ এমকে নতুন লাইন বিভাজক হিসাবে অন্তর্ভুক্ত করে। এই ফাইলগুলি বিচ্ছিন্ন করা অসম্ভব অসম্ভব, কারণ জিট-ডিফ্ফটি এটি দেখে মনে করে সমগ্র ফাইলটি কেবল একটি লাইন।

কিভাবে একটি পূর্ববর্তী সংস্করণ সঙ্গে diff না?

"ডিসচার্জ করার সময় ^ এম ^ এমাইনাইন হিসাবে নতুন একটি বিকল্প" আছে কি?

prompt> git-diff "HEAD^" -- MyFile.as 
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
prompt>

হালনাগাদ:

এখন আমি একটি স্ক্রিপ্ট লিখেছি যা সর্বশেষ 10 টি সংস্করণ পরীক্ষা করে এবং সিআর থেকে এলএফ রূপান্তর করে।

require 'fileutils'

if ARGV.size != 3
  puts "a git-path must be provided"
  puts "a filename must be provided"
  puts "a result-dir must be provided"
  puts "example:"
  puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"
  exit(1)
end

gitpath = ARGV[0]
filename = ARGV[1]
resultdir = ARGV[2]

unless FileTest.exist?(".git")
  puts "this command must be run in the same dir as where .git resides"
  exit(1)
end

if FileTest.exist?(resultdir)
  puts "the result dir must not exist"
  exit(1)
end
FileUtils.mkdir(resultdir)

10.times do |i|
  revision = "^" * i
  cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"
  puts cmd 
  system cmd
end

Answers

আপনি যদি Eclipse ব্যবহার করেন, তবে আপনি ^M File > Convert Line Delimiter To > Unix (LF, \n, 0A, ¶) সেট করে git diff থেকে অদৃশ্য হয়ে যেতে পারেন।


এছাড়াও দেখুন:

core.whitespace = cr-at-eol

অথবা সমানভাবে,

[core]
    whitespace = cr-at-eol

whitespace একটি ট্যাব চরিত্র দ্বারা পূর্বে হয় যেখানে।


উইন্ডোজ ডেভেলপ করার সময়, আমি git tfs ব্যবহার করার সময় এই সমস্যাটি দৌড়েছিলাম। আমি এই ভাবে সমাধান:

git config --global core.whitespace cr-at-eol

এটি মূলত গিটকে বলে যে একটি শেষ-অফ-লাইন সিআর কোনও ত্রুটি নয়। ফলস্বরূপ, যারা বিরক্তিকর ^M অক্ষর আর git diff শেষে git diff , git show ইত্যাদিতে উপস্থিত হয় না।

এটি যেমন- হয় অন্যান্য সেটিংস ছেড়ে চলে আসে বলে মনে হচ্ছে; উদাহরণস্বরূপ, একটি রেখার শেষে অতিরিক্ত স্পেসগুলি এখনও diff (red তে হাইলাইট) হিসাবে দেখায়।

(অন্যান্য উত্তরগুলি এই বিষয়ে ইঙ্গিত করেছে, তবে --global ঠিক সেটাকে কীভাবে সেট করতে হয়। কেবলমাত্র একটি প্রকল্পের জন্য সেটিং সেট করতে, - --global বাদ দিন।)

সম্পাদনা করুন :

অনেক লাইন-শেষ ট্র্যাভেলের পরে, আমার এই নেটওয়ার্কে নেটওয়ার্কে কাজ করার সময় সেরা ভাগ্য ছিল:

  • কোন core.eol সেটিং
  • কোন core.whitespace সেটিং
  • কোন core.autocrlf সেটিং
  • Windows এর জন্য গিট ইনস্টলার চলাকালীন, আপনি এই তিনটি বিকল্প পাবেন:
    • চেকআউট উইন্ডোজ-স্টাইল, ইউনিক্স-স্টাইল লাইন শেষ করুন <- এটি নির্বাচন করুন
    • চেকআউট হিসাবে, ইউনিক্স-শৈলী লাইন শেষ commit
    • হিসাবে চেকআউট হয়, হয় হিসাবে প্রতিশ্রুতিবদ্ধ

হোয়াইটস্পেস সেটিংটি ব্যবহার করার প্রয়োজন হলে আপনাকে অবশ্যই এটি প্রতি-প্রজেক্ট ভিত্তিতে সক্রিয় করতে হবে যদি আপনার TFS এর সাথে যোগাযোগ করতে হয়। শুধু --global বাদ --global :

git config core.whitespace cr-at-eol

যদি আপনি কিছু কোর। * সেটিংস মুছে ফেলতে চান তবে এই কমান্ড চালানোর সবচেয়ে সহজ পদ্ধতি হল:

git config --global -e

এটি আপনার বিশ্বব্যাপী .gitconfig ফাইলটি একটি টেক্সট এডিটরতে খোলে এবং আপনি যে লাইনগুলি সরাতে চান সেগুলি সহজেই মুছতে পারেন। (অথবা আপনি তাদের মন্তব্য করতে তাদের সামনে '#' রাখতে পারেন।)


কেন আপনি আপনার git diff মধ্যে এই ^M পেতে পারি?

আমার ক্ষেত্রে আমি উইন্ডোজ এ তৈরি একটি প্রকল্পে কাজ করছিলাম এবং আমি ওএস এক্স ব্যবহার করতাম। যখন আমি কিছু কোড পরিবর্তন করেছিলাম, তখন আমি দেখলাম ^M git diff শেষে আমি git diff । আমি মনে করি ^M দেখানো হয়েছে কারণ তারা বাকি ফাইলের চেয়ে বিভিন্ন লাইন শেষ ছিল। যেহেতু বাকি ফাইলটি উইন্ডোজটিতে বিকশিত হয়েছিল তাই এটি CR লাইনের শেষ ব্যবহার করে এবং ওএস এক্স এ এটি LF লাইনের শেষ ব্যবহার করে।

দৃশ্যত, উইন্ডোজ বিকাশকারী Git ইনস্টলেশনের সময় " চেকআউট উইন্ডোজ-স্টাইল, ইউনিক্স-স্টাইল লাইন শেষ " বিকল্প ব্যবহার করে না।

তাই আমরা এই সম্পর্কে কি করা উচিত?

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

আপনি যদি এই বিকল্পটির জন্য যান তবে আপনাকে অবশ্যই বর্তমান ফাইলগুলি ঠিক করতে হবে (কারণ তারা এখনও CR লাইনের শেষ ব্যবহার করছেন)। আমি এই পদক্ষেপগুলি অনুসরণ করে এটি করেছি:

  1. সংগ্রহস্থল থেকে সমস্ত ফাইল মুছে ফেলুন, কিন্তু আপনার ফাইল সিস্টেম থেকে নয়।

    git rm --cached -r .
    
  2. একটি .gitattributes ফাইল যুক্ত করুন যা লাইন শেষ হিসাবে একটি LF ব্যবহার করতে নির্দিষ্ট ফাইলগুলিকে প্রয়োগ করে। এই ফাইলটি রাখুন:

    *.ext text eol=crlf
    

    প্রতিস্থাপন করুন। ফাইল এক্সটেনশানগুলির সাথে আপনি মিলতে চান।

  3. আবার সব ফাইল যোগ করুন।

    git add .
    

    এটি এই রকম বার্তা প্রদর্শন করবে:

    warning: CRLF will be replaced by LF in <filename>.
    The file will have its original line endings in your working directory.
    
  4. আপনি যতক্ষণ না " .gitattributes -শৈলী, .gitattributes উইন্ডো-স্টাইল, ইউনিক্স-স্টাইল লাইন শেষ " বিকল্পটি ব্যবহার করতে চান না এমন .gitattributes উইন্ডোজ ব্যবহারকারী না হওয়া পর্যন্ত আপনি .gitattributes ফাইলটি সরাতে পারেন।

  5. Commit এবং এটি সব ধাক্কা।

  6. সমস্ত সিস্টেম যেখানে তারা ব্যবহার করা হয় প্রযোজ্য ফাইল সরান এবং চেকআউট। উইন্ডোজ সিস্টেমগুলিতে, নিশ্চিত করুন যে তারা এখন " চেকআউট উইন্ডোজ-স্টাইল ব্যবহার করুন , ইউনিক্স-স্টাইল লাইন শেষ করুন " বিকল্পটি ব্যবহার করুন। আপনি এই কাজগুলি চালানোর জন্য এই সিস্টেমেও এটি করতে হবে কারণ আপনি যখন ফাইলগুলি যোগ করেছেন তখন জিট বলেছেন:

    The file will have its original line endings in your working directory.
    

    ফাইলগুলি সরাতে আপনি এরকম কিছু করতে পারেন:

    git ls | grep ".ext$" | xargs rm -f
    

    এবং তারপর এই সঠিক লাইন শেষের সাথে তাদের ফিরে পেতে:

    git ls | grep ".ext$" | xargs git checkout
    

    অবশ্যই প্রতিস্থাপন। এক্সটেনশান আপনি চান সঙ্গে।

এখন আপনার প্রকল্প লাইন শেষের জন্য কেবলমাত্র LF অক্ষর ব্যবহার করে এবং কদর্য CR অক্ষরগুলি কখনই ফিরে আসবে না :)।

অন্য বিকল্প উইন্ডোজ স্টাইল লাইন শেষ প্রয়োগ করা হয়। আপনি এই জন্য। .gitattributes ফাইল ব্যবহার করতে পারেন।

আরও তথ্য: https://help.github.com/articles/dealing-with-line-endings/#platform-all


"ডিসচার্জ করার সময় ^ এম ^ এমাইনাইন হিসাবে নতুন একটি বিকল্প" আছে কি?

গিট 2.16 (Q1 2018) এর সাথে এক হবে, কারণ " diff " কমান্ডের পরিবারগুলি লাইনের শেষে গাড়ি ফেরতের পার্থক্যগুলি উপেক্ষা করতে শিখেছে।

Junio ​​সি Hamano ( gitster ) দ্বারা e9282f0 (26 অক্টোবর 2017) কমিট দেখুন।
সাহায্য করেছেন: জোহানস dscho ( dscho )
( জুনিয়ো সি হামানো - gitster - 10f65c2 , 27 নভেম্বর 2017)

diff: --ignore-cr-at-eol

একটি নতুন বিকল্প --ignore-cr-at-eol একটি সম্পূর্ণ (সম্পূর্ণ) লাইনের শেষে একটি ক্যারেজ-রিটার্ন চিকিত্সা করার জন্য ভিন্ন যন্ত্রপাতিকে বলে, যেমন এটি বিদ্যমান না।

বিভিন্ন ধরণের হোয়াইটস্পেস পার্থক্যগুলি উপেক্ষা করতে অন্যান্য " --ignore-* " বিকল্পগুলির মতই, এটি আপনার সম্পাদক প্রোগ্রাম দ্বারা তৈরি করা CRLF<->LF রূপান্তর দ্বারা বিভ্রান্ত না করে তৈরি করা প্রকৃত পরিবর্তনগুলি পর্যালোচনা করতে সহায়তা করবে।


GitHub প্রস্তাব করে যে আপনি শুধুমাত্র git- পরিচালিত রেপোতে একটি নতুন অক্ষর হিসাবে \ n ব্যবহার করতে ভুলবেন না। স্বয়ংক্রিয় রূপান্তর করার একটি বিকল্প আছে:

$ git config --global core.autocrlf true

অবশ্যই, এটি crlf কে lf রূপান্তর করতে বলা হয়, যখন আপনি cr to lf রূপান্তর করতে চান। আমি এই এখনও কাজ আশা করি ...

এবং তারপর আপনার ফাইল রূপান্তর করুন:

# Remove everything from the index
$ git rm --cached -r .

# Re-add all the deleted files to the index
# You should get lots of messages like: "warning: CRLF will be replaced by LF in <file>."
$ git diff --cached --name-only -z | xargs -0 git add

# Commit
$ git commit -m "Fix CRLF"

core.autocrlf মানুষের পৃষ্ঠায় বর্ণনা করা হয়


টি এল; ডিআর

core.pager পরিবর্তন করুন "tr -d '\r' | less -REX" , সোর্স কোড নয়

এ জন্যই

দেখানো যারা pesky ^ এম রঙিনকরণ এবং pager একটি artifact হয়। এটি less -R , একটি ডিফল্ট গিট প্যাজার বিকল্প দ্বারা সৃষ্ট। (জিটি এর ডিফল্ট পেজার less -REX )

উল্লেখ্য প্রথম জিনিসটি হল git diff -b সাদা স্থানটিতে পরিবর্তনগুলি দেখাবে না (যেমন \ r \ n বনাম \ n)

সেটআপ:

git clone https://github.com/CipherShed/CipherShed
cd CipherShed

একটি ইউনিক্স ফাইল তৈরি এবং লাইন শেষ পরিবর্তন করার জন্য একটি দ্রুত পরীক্ষা git diff -b সাথে কোনও পরিবর্তন দেখাবে না:

echo -e 'The quick brown fox\njumped over the lazy\ndogs.' > test.txt
git add test.txt
unix2dos.exe test.txt
git diff -b test.txt

আমরা মনে করি যে কমপক্ষে একটি পাইপ জোরপূর্বক ^ এম দেখায় না, তবে রঙ এবং less -R সক্রিয় সক্ষম করে:

git diff origin/v0.7.4.0 origin/v0.7.4.1 | less
git -c color.ui=always diff origin/v0.7.4.0 origin/v0.7.4.1 | less -R

আউটপুট থেকে \ r (^ M) ফাঁকা করার জন্য একটি পাইপ ব্যবহার করে ফিক্সটি দেখানো হয়:

git diff origin/v0.7.4.0 origin/v0.7.4.1
git -c core.pager="tr -d '\r' | less -REX"  diff origin/v0.7.4.0 origin/v0.7.4.1

একটি অকার্যকর বিকল্প less -r ব্যবহার করা হয়, কারণ এটি কেবলমাত্র কোড কোডগুলিতে নয়, সমস্ত নিয়ন্ত্রণ কোডের মধ্য দিয়ে যাবে।

আপনি যদি সরাসরি আপনার জিটি কনফিগার ফাইলটি সম্পাদনা করতে চান তবে এটি আপডেট / যোগ করার জন্য এন্ট্রি:

[core]
        pager = tr -d '\\r' | less -REX

আমি দীর্ঘ সময়ের জন্য এই সমস্যা সঙ্গে সংগ্রাম। যতদূর সহজতম সমাধান হল ^ এম অক্ষর সম্পর্কে চিন্তা করা এবং শুধুমাত্র একটি চাক্ষুষ diff সরঞ্জাম ব্যবহার করুন যা তাদের পরিচালনা করতে পারে।

টাইপ করার পরিবর্তে:

git diff <commitHash> <filename>

চেষ্টা করে দেখুন:

git difftool <commitHash> <filename>

যেহেতু কোনও উত্তর সঠিক বিকল্প সংমিশ্রণটি আমি ব্যবহার করি না সেগুলি এখানে উল্লেখ করে, এখানে এটি হল:

git clean -dfx
git checkout .

এটি ব্যবহৃত git clean বিকল্পগুলির জন্য অনলাইন সহায়তা পাঠ্য:

-d

অট্যাকড ফাইল ছাড়াও অট্যাকড ডিরেক্টরি সরান। একটি অট্যাক্যাকড ডিরেক্টরি ভিন্ন জিট রিপোজিটরি দ্বারা পরিচালিত হলে, এটি ডিফল্টরূপে সরানো হয় না। যদি আপনি সত্যিই এই ধরনের ডিরেক্টরি মুছে ফেলতে চান তাহলে -f বিকল্পটি দুবার ব্যবহার করুন।

-f

Git কনফিগারেশন পরিবর্তনশীল clean.requireForce যদি false সেট না থাকে তবে clean.requireForce , -n , অথবা -i দেওয়া না থাকলে Git পরিচ্ছন্ন ফাইল বা ডিরেক্টরি মুছে ফেলতে অস্বীকার করবে। .git সাবডিরেক্টরি অথবা ফাইলের মধ্যে ডিরেক্টরি মুছে ফেলতে অস্বীকার করবে, যদি না একটি দ্বিতীয় .git দেওয়া হয়।

-x

.gitignore (প্রতি নির্দেশিকা) এবং $GIT_DIR/info/exclude থেকে উপেক্ষা নিয়মগুলি ব্যবহার করবেন না, তবে এখনও -e বিকল্পগুলির সাথে প্রদত্ত উপেক্ষা নিয়মগুলি ব্যবহার করবেন। এই বিল্ড পণ্য সহ, সমস্ত untracked ফাইল অপসারণ করতে পারবেন। এটি একটি পরিষ্কার বিল্ড পরীক্ষা করার জন্য একটি প্রিজাইন ওয়ার্কিং ডিরেক্টরি তৈরি করতে (সম্ভবত git reset সাথে যুক্ত করে) ব্যবহার করা যেতে পারে।

এছাড়াও, git checkout . repo রুট করা প্রয়োজন।





git diff newline git-diff