git-diff เพื่อละเว้น ^ M


474

ในโครงการที่ไฟล์บางไฟล์มี ^ M เป็นตัวคั่นบรรทัดใหม่ เห็นได้ชัดว่าการกระจายไฟล์เหล่านี้เป็นไปไม่ได้เนื่องจาก git-diff เห็นว่าไฟล์ทั้งหมดเป็นเพียงบรรทัดเดียว

หนึ่งแตกต่างจากรุ่นก่อนหน้าอย่างไร

มีตัวเลือกเช่น "ถือ ^ M เป็นบรรทัดใหม่เมื่อแตกต่าง" หรือไม่?

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>

UPDATE:

ตอนนี้ฉันได้เขียนสคริปต์ Ruby ที่ตรวจสอบการแก้ไข 10 ครั้งล่าสุดและแปลง CR เป็น LF

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

7
คุณอาจต้องการgit diff -b- ฉันแสดงสิ่งนี้ในstackoverflow.com/a/46265081/58794
Jason Pyeron

6
ด้วย Git 2.16 (ไตรมาสที่ 1 ปี 2018) git diff --ignore-cr-at-eolคุณจะมี ดูคำตอบของฉันด้านล่าง
VonC

7
@JasonPyeron และชาว Google ในอนาคตผมต้องเงยหน้าขึ้นมองว่าเป็นเหมือนgit diff -b git diff --ignore-space-change
Gogowitsch

คำตอบ:


392

GitHub แนะนำว่าคุณควรใช้ \ n เป็นอักขระขึ้นบรรทัดใหม่ใน repos ที่จัดการโดย git เท่านั้น มีตัวเลือกในการแปลงโดยอัตโนมัติ:

$ git config --global core.autocrlf true

แน่นอนว่านี่เป็นการแปลง crlf เป็น lf ในขณะที่คุณต้องการแปลง crl เป็น 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 อธิบายไว้ในหน้าคน


1
ไม่แน่นอนไม่เมื่อมีการตั้งค่าแล้วมันจะทำการแปลงอย่างเงียบ ๆ หากทุกอย่างทำงานวิธีที่ผมคิดว่ามันไม่นั่นคือ ...
nes1983

1
ปัญหาคือฉันมีไฟล์บางไฟล์ในที่เก็บที่มีตอนจบ CRLF และไฟล์อื่นที่ไม่มี ฉันสงสัยว่า Adobe Flash เพิ่ม CRLF แม้ว่าฉันจะใช้รุ่น Mac ฉันต้องเปรียบเทียบกับการแก้ไขไฟล์เก่าเหล่านี้ การแปลงจุดสิ้นสุดบรรทัดที่เริ่มต้นนับจากนี้ไปจะไม่ช่วยแก้ปัญหาด้วยการแก้ไขที่เก่ากว่า: - /
neoneye

65
คุณไม่ได้ทำงานกับไฟล์ CRLF ที่นี่อย่างน้อยก็ไม่ใช่ในตัวอย่างที่คุณโพสต์ เป็นไฟล์ mac แบบเก่า (เพียงใช้ \ r สำหรับ EOL) นั่นเป็นสาเหตุที่ทำให้ diff ต่างแสดงในหนึ่งบรรทัด ไฟล์ที่ใช้ dos EOL จะแสดงแต่ละบรรทัดอย่างชัดเจนพร้อมกับส่วนท้าย ^ M ซึ่งคุณสามารถบอกให้จัดการgit config core.whitespace cr-at-eolได้
27499 jamessan

12
ฉันพยายามทำสิ่งนี้ แต่ฉันwarning: LF will be replaced by CRLFกลับwarning: CRLF will be replaced by LFมาเรื่อย ๆ และฉันอยู่ใน Linux มีความคิดอะไรไหม ฉันต้องการให้จบด้วย LF ไม่ใช่ CRLF!
trusktr

5
@trusktr มันเกิดขึ้นแบบเดียวกันกับฉัน ในลินุกซ์ด้วย CRLF อุบัติเหตุการใช้งานgit config --global core.autocrlf inputให้ทำตามขั้นตอนในคำตอบนี้ (RM, เพิ่มกระทำ) warning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.และคุณจะได้รับ ลบไฟล์ (เพราะพวกเขามีต้นฉบับ CRLF ผิด) และชำระเงินพวกเขาอีกครั้งจากการกระทำ "แก้ไข CRLF" ครั้งล่าสุด
jmmut

370

การพัฒนาบน Windows, git tfsฉันวิ่งเข้าไปในปัญหานี้เมื่อใช้ ฉันแก้ไขมันด้วยวิธีนี้:

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

สิ่งนี้บอก Git โดยทั่วไปว่า CR-end-of-line ไม่ใช่ข้อผิดพลาด เป็นผลให้น่ารำคาญ^Mตัวละครที่ไม่ปรากฏในตอนท้ายของสายในgit diff, git showฯลฯ

ดูเหมือนว่าจะออกจากการตั้งค่าอื่น ๆ ตามที่เป็นอยู่; ตัวอย่างเช่นช่องว่างพิเศษที่ส่วนท้ายของบรรทัดยังคงแสดงเป็นข้อผิดพลาด (เน้นด้วยสีแดง) ในส่วนต่าง

(คำตอบอื่น ๆ มีการพาดพิงถึงสิ่งนี้ แต่ข้างต้นเป็นวิธีการตั้งค่าการตั้งค่าในการตั้งค่าสำหรับหนึ่งโครงการเท่านั้นให้ละเว้น--global.)

แก้ไข :

หลังจากการเดินทางหลายครั้งสิ้นสุดลงฉันได้รับโชคดีที่สุดเมื่อทำงานกับทีม. NET ด้วยการตั้งค่าเหล่านี้:

  • ไม่มีการตั้งค่า core.eol
  • ไม่มีการตั้งค่า core.whitespace
  • ไม่มีการตั้งค่า core.autocrlf
  • เมื่อรันโปรแกรมติดตั้ง Git สำหรับ Windows คุณจะได้รับสามตัวเลือกดังนี้:
    • ชำระเงินสไตล์ Windows ยอมรับการสิ้นสุดบรรทัดสไตล์ Unix <- เลือกอันนี้
    • ชำระเงินตามที่เป็นอยู่กระทำการสิ้นสุดบรรทัดสไตล์ Unix
    • ชำระเงินตามสภาพกระทำกระทำตามสภาพ

หากคุณต้องการใช้การตั้งค่าช่องว่างคุณควรเปิดใช้งานเฉพาะในแต่ละโครงการหากคุณต้องการโต้ตอบกับ TFS เพียงละเว้น--global:

git config core.whitespace cr-at-eol

หากคุณต้องการลบการตั้งค่าแกน * วิธีที่ง่ายที่สุดคือการเรียกใช้คำสั่งนี้:

git config --global -e

สิ่งนี้จะเปิดไฟล์. gitconfig ทั่วโลกของคุณในโปรแกรมแก้ไขข้อความและคุณสามารถลบบรรทัดที่คุณต้องการลบได้อย่างง่ายดาย (หรือคุณสามารถใส่ '#' ไว้ข้างหน้าเพื่อแสดงความคิดเห็นได้)


30
สำหรับผู้ที่พบสิ่งนี้ในตอนนี้ก็เป็นที่น่าสังเกตว่าCheckout Windows-style จะทำหน้าที่สร้างบรรทัด Unix ในรูปแบบอัตโนมัติcore.autocrlfเพื่อtrue
K. Carpenter

14
โปรดทราบว่าสายgit config --global core.whitespace cr-at-eolจะปิดการตั้งค่าอื่น ๆ ที่เป็นค่าเริ่มต้น มีสามค่าเริ่มต้น: blank-at-eol, blank-at-eof และ space-before-tab ดังนั้นเพื่อเปิดใช้งาน CR-at-EOL ขณะที่การรักษาอื่น ๆ git config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eolที่คุณจะต้องใช้
Zitrax

2
สำหรับโครงการของฉัน (คือชำระเงินใน Windows และฉันกำลังดูบน Linux) ให้cr-at-eolกำจัด^Mส่วนท้ายของบรรทัดgit diffทั้งหมด แต่ GIT ยังคงแสดงบรรทัดเหล่านั้นแตกต่างกันแม้ว่าการสิ้นสุดบรรทัดนั้นแตกต่างกันเท่านั้น
Jānis Elmeris

SourceInsight ผลักดันอักขระ ^ M อย่างต่อเนื่องและ git ยังคงแสดงความแตกต่างที่จุดสิ้นสุดบรรทัด @ คำสั่งของ Zitrax คือคำตอบที่ถูกต้องสำหรับเคสของฉัน git diff แสดงผลลัพธ์ที่ดีและสะอาด
Lê Quang Duy

3
ฉันคิดว่าคอมไพล์ต้องการความซับซ้อนเพิ่มขึ้นอีกเล็กน้อยการตั้งค่าที่ขัดแย้งกันอีกเล็กน้อยสำหรับจุดสิ้นสุดของบรรทัด ผมคิดว่าคอมไพล์ควรจะเพิ่มเติมความกังวลเกี่ยวกับช่องว่างของฉัน ตัวอย่างเช่นโยนข้อผิดพลาดร้ายแรงที่ไม่เกี่ยวข้องและปล่อยให้ที่เก็บอยู่ในสถานะเสียหายเมื่อพบจุดสิ้นสุดของบรรทัด Mac บนเครื่อง Windows (แต่ไม่ใช่ Linux) ฉันหมายถึงเหตุใดฉันจึงใช้ VCS ที่คำนึงถึงเรื่องของธุรกิจและให้ฉันใช้ว่าจะใช้ตอนท้ายบรรทัดไหน ฉันเห็นว่าพวกเขากำลังพยายามอยู่ แต่พวกเขาควรโยนพฤติกรรมการสิ้นสุดบรรทัดอีกครึ่งโหลเพื่อแก้ปัญหาที่ไม่มีอยู่ พวกเขาเกือบจะถึงแล้ว! ให้ทัน
Rolf

125

ลองgit diff --ignore-space-at-eolหรือหรือgit diff --ignore-space-changegit diff --ignore-all-space


22
ไม่มีสิ่งใดที่ส่งผลกระทบต่อตัวละครที่ระบุบรรทัดใหม่จริงๆ
nes1983

4
ฉันยังลองด้วย "-w" แต่ไม่มีโชค แต่ก็ยังถือว่าเป็นบรรทัดเดียว โครงการต่อไปฉันต้องจำไว้ว่าจะไม่เคยได้รับ CR ใด ๆ ลงในซอร์สโค้ด
neoneye

3
เพียงจำไว้ว่าการกำหนดค่าคอมไพล์ --global core.autocrlf จริงหรือข้อผิดพลาด folks Git จนกว่าพวกเขาจะทำให้มันเริ่มต้น :)
nes1983

10
วิธีนี้แก้ไขปัญหาของฉันโดยไม่ต้องเปลี่ยนautocrlfการตั้งค่า ขอบคุณ!
nneonneo

11
ธงเหล่านี้ไม่มีผลสำหรับฉัน ... ยังคงแสดงให้เห็นว่า ^ M ต่างกัน
แมกนัส

103

ดูเพิ่มเติมที่:

core.whitespace = cr-at-eol

หรือเทียบเท่า

[core]
    whitespace = cr-at-eol

ที่whitespaceนำหน้าด้วยอักขระแท็บ


4
ใช่สิ่งนี้ทำให้เครื่องมือ diff git (ยังใช้ในgit show) หยุด bugging ฉันเกี่ยวกับ^Ms บนบรรทัดที่เปลี่ยนแปลง! :)
Rijk

2
ไม่ว่าด้วยเหตุผลใดก็ตามสิ่งนี้ไม่ได้ผลสำหรับฉัน ลองทั้งที่มีเครื่องหมาย = และ no = git diffยังคงแสดงอักขระ ^ M
เดนนิส

6
สองวิธีในการทำเช่นนี้หนึ่งวิธีเพิ่มบรรทัดด้านบนคำต่อคำใน. gitconfig ของคุณทั้งใน. git / config หรือใน ~ / .gitconfig; สอง, git config --global core.whitespace cr-at-eol(โดยที่ - โกลบอลเป็นตัวเลือกถ้าคุณแค่ต้องการมันบน repo ที่คุณอยู่)
เค. คาร์เพนเตอร์

สิ่งนี้ใช้ได้กับฉันใน Windows 7 แม้ว่าฉันจะวางไว้ด้านล่าง[core]เพื่อให้ฉันสามารถแทนที่core.คำนำหน้าด้วยอักขระ TAB ได้
Rufflewind

คำถามนี้อยู่เหนือวิธีการซ่อน^Mในgit diffไม่เกี่ยวกับวิธีการได้ใส่ใน ^ M ในสถานที่แรก นั่นหมายความว่าคำตอบที่ยอมรับได้ของการเปลี่ยนแปลงcore.autocrlfนั้นไม่ได้ดีที่สุดเพราะมันจะทำการเปลี่ยนแปลงไฟล์โดยไม่มีการยืนยันจากผู้ใช้
deddebme

45

ทำไมคุณถึงได้รับสิ่งเหล่านี้^Mในตัวคุณgit diff?

ในกรณีของฉันฉันได้ทำงานในโครงการที่ได้รับการพัฒนาใน Windows และฉันใช้ OS X ได้เมื่อฉันเปลี่ยนรหัสบางอย่างที่ผมเห็นในตอนท้ายของเส้นที่ผมเพิ่มใน^M git diffฉันคิดว่า^Mมันแสดงขึ้นมาเพราะมันเป็นจุดสิ้นสุดบรรทัดที่แตกต่างจากส่วนที่เหลือของไฟล์ เนื่องจากไฟล์ส่วนที่เหลือได้รับการพัฒนาใน Windows จึงใช้การCRสิ้นสุดบรรทัดและใน OS X จึงใช้การLFสิ้นสุดบรรทัด

เห็นได้ชัดว่าผู้พัฒนา Windows ไม่ได้ใช้ตัวเลือก " ชำระเงินสไตล์ Windows ยอมรับการสิ้นสุดบรรทัดสไตล์ Unix " ในระหว่างการติดตั้ง Git

แล้วเราควรทำอย่างไรกับเรื่องนี้?

คุณสามารถให้ผู้ใช้ Windows ติดตั้งคอมไพล์และใช้ตัวเลือก " ชำระเงินสไตล์ Windows ยอมรับการสิ้นสุดบรรทัดสไตล์ Unix " นี่คือสิ่งที่ฉันต้องการเพราะฉันเห็นว่า Windows เป็นข้อยกเว้นในตัวอักษรที่ลงท้ายด้วยบรรทัดและ Windows จะแก้ไขปัญหาของตัวเองด้วยวิธีนี้

หากคุณเลือกตัวเลือกนี้คุณควรแก้ไขไฟล์ปัจจุบัน (เนื่องจากไฟล์เหล่านั้นยังคงใช้การCRสิ้นสุดบรรทัด) ฉันทำสิ่งนี้โดยทำตามขั้นตอนเหล่านี้:

  1. ลบไฟล์ทั้งหมดออกจากที่เก็บ แต่ไม่ลบออกจากระบบไฟล์ของคุณ

    git rm --cached -r .
    
  2. เพิ่ม.gitattributesไฟล์ที่บังคับใช้ไฟล์บางไฟล์เพื่อใช้LFเป็นจุดสิ้นสุดบรรทัด ใส่ไว้ในไฟล์:

    *.ext text eol=crlf
    

    แทนที่.extด้วยนามสกุลไฟล์ที่คุณต้องการจับคู่

  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ไฟล์ออกได้เว้นแต่คุณจะมีผู้ใช้ Windows ที่ดื้อรั้นที่ไม่ต้องการใช้ตัวเลือก " ชำระเงินสไตล์ Windows, ยอมรับการสิ้นสุดบรรทัดสไตล์ Unix "

  5. มุ่งมั่นและผลักดันมันทั้งหมด

  6. ลบและชำระเงินไฟล์ที่ใช้งานได้ในทุกระบบที่พวกเขากำลังใช้ บนระบบ Windows ตรวจสอบให้แน่ใจว่าพวกเขาใช้ตัวเลือก " ชำระเงินสไตล์ Windows ยอมรับการสิ้นสุดบรรทัดสไตล์ Unix " คุณควรทำเช่นนี้ในระบบที่คุณทำงานเหล่านี้เพราะเมื่อคุณเพิ่มไฟล์ git กล่าวว่า:

    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
    

    แน่นอนแทนที่.extด้วยนามสกุลที่คุณต้องการ

ตอนนี้โปรเจ็กต์ของคุณใช้เฉพาะLFอักขระสำหรับการสิ้นสุดบรรทัดและCRอักขระที่น่ารังเกียจจะไม่กลับมา :)

ตัวเลือกอื่นคือการบังคับใช้การสิ้นสุดบรรทัดลักษณะของ windows คุณยังสามารถใช้.gitattributesไฟล์นี้ได้

ข้อมูลเพิ่มเติม: https://help.github.com/articles/dealing-with-line-endings/#platform-all


4
ในการแก้ไขปัญหาตอนจบทุกบรรทัดในไฟล์เฉพาะถ้าใช้ Sublime ข้อความ, คุณสามารถไปที่View-> และคลิกที่Line Endings Unix
Topher Hunt

สิ่งนี้^Mหมายความว่าอย่างไร มันขึ้นบรรทัดใหม่ของ windows หรือ linux หรือไม่? หรือมันเป็นเพียงแค่ "ขึ้นบรรทัดใหม่" ที่แตกต่างเมื่อเทียบกับบรรทัดใหม่อื่น ๆ ในไฟล์?
buhtz

ดีหนึ่งฉันคิดว่ามันเป็นแค่ "แตกต่าง" ขึ้นบรรทัดใหม่ (แตกต่างจากคนอื่น ๆ ส่วนใหญ่)
gitaarik

-1 เนื่องจากการติดตั้งคอมไพล์เพื่อให้สำเร็จgit config --global core.autocrlf trueนั้นเกินความจริงและการต่อต้าน Windows / anti- CRcampaign ดูเหมือนจะเป็นคำถามเดียวกัน
RJFalconer

41

มีตัวเลือกเช่น "ถือ ^ M เป็นบรรทัดใหม่เมื่อแตกต่าง" หรือไม่?

จะมีหนึ่งใน Git 2.16 (ไตรมาสที่ 1 ปี 2018) เนื่องจากdiffตระกูลคำสั่ง "" ได้เรียนรู้ที่จะเพิกเฉยต่อความแตกต่างของการคืนรถที่ท้ายบรรทัด

ดูกระทำ e9282f0 (26 ตุลาคม 2017) โดยJunio C Hamano (gitster )
ช่วยโดย: โยฮันเน Schindelin (dscho )
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 10f65c2 , 27 พฤศจิกายน 2017)

diff: --ignore-cr-at-eol

ตัวเลือกใหม่--ignore-cr-at-eolจะบอกให้เครื่องจักรต่าง ๆ ปฏิบัติกับการคืนรถที่จุดสิ้นสุดของบรรทัด (สมบูรณ์) ราวกับว่าไม่มีอยู่

เช่นเดียวกับ--ignore-*ตัวเลือกอื่น ๆ " " ที่จะเพิกเฉยต่อความแตกต่างของช่องว่างที่หลากหลาย" " ซึ่งจะช่วยตรวจสอบการเปลี่ยนแปลงที่แท้จริงของคุณโดยไม่เบี่ยงเบนความสนใจจากการCRLF<->LFแปลงที่ทำโดยโปรแกรมแก้ไขของคุณ


@kaartic ขอบคุณสำหรับการแก้ไขคำตอบและการอ้างอิงการกระทำที่ถูกต้อง!
VonC

3
แม้ว่าโดยทั่วไปแล้วจะเป็นการดีที่จะกำหนดgit config --global core.autocrlf trueให้เป็นเหมือนคำตอบที่ยอมรับได้ แต่นี่เป็นการตอบคำถามของ OP โดยตรงมากกว่า: 'มีตัวเลือกเช่น "ถือว่า ^ M เป็นบรรทัดใหม่เมื่อแตกต่าง" หรือไม่?
drkvogel

1
ในฐานะของ Git 2.20 นี่ไม่ได้ซ่อน ^ M's
user1944491

@ user1944491 ฉันไม่ได้สังเกตการถดถอยใด ๆ หมายความว่างัวละเว้น eol เมื่อแตกต่างกับตัวเลือกนี้ใน Git 2.26
VonC

@VonC การใช้อาร์กิวเมนต์นี้ในคำสั่ง git diff ไม่ทำงาน และไม่ได้ตั้งค่า core.whitespace ของฉันgit version 2.20.1 (Apple Git-117)แต่เพิ่มคำตอบ core.pager ของ Jason Pyeron แก้ไขมัน YMMV เห็นได้ชัด
user1944491

26

TL; DR

เปลี่ยนcore.pagerไป"tr -d '\r' | less -REX"ไม่รหัสที่มา

นี่คือเหตุผล

pesky ^ M ที่แสดงเป็นสิ่งประดิษฐ์ของ colorization และ pager ป้อนคำอธิบายรูปภาพที่นี่ มันเกิดจากless -Rตัวเลือกเพจเจอร์ git เริ่มต้น (เพจเจอร์เริ่มต้นของ git คือless -REX)

สิ่งแรกที่ควรทราบคือgit diff -bจะไม่แสดงการเปลี่ยนแปลงในพื้นที่สีขาว (เช่น \ r \ n vs \ n)

ติดตั้ง:

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

การทดสอบอย่างรวดเร็วเพื่อสร้างไฟล์ unix และเปลี่ยนการสิ้นสุดบรรทัดจะไม่แสดงการเปลี่ยนแปลงด้วย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

เราทราบว่าการบังคับให้ไปป์น้อยกว่าจะไม่แสดง ^ M แต่เปิดใช้งานสีและ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เพราะจะผ่านรหัสควบคุมทั้งหมดไม่ใช่เฉพาะรหัสสี

หากคุณต้องการแก้ไขไฟล์ git config ของคุณโดยตรงนี่คือรายการเพื่ออัปเดต / เพิ่ม:

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

ฉันมีปัญหานี้ใน repo ที่ไฟล์บางไฟล์มีการ\r\nสิ้นสุดบรรทัดและบางส่วนมีการ\nสิ้นสุดบรรทัด (ฉันไม่ทราบว่าเกี่ยวข้องหรือไม่) diffs ของอดีตแสดงให้เห็นว่า^Mในสายการแก้ไข (นั่นคือ+เส้น) ถูกกำหนดให้core.autocrlf trueทำงานgit config core.pager "tr -d '\r' | less -REX"ได้กำจัดน่ารำคาญ^Ms ขอบคุณ!
labreuer

5
ขอบคุณสำหรับสิ่งนี้. นี่เป็นคำตอบเดียวถ้าคุณต้องทำงานกับจุดสิ้นสุดของบรรทัดที่แตกต่างกันใน repo ของคุณ - เช่นคุณใช้การชำระเงินตาม - คือกระทำตามที่เป็นจริง
Mike

git diff -bเป็นสิ่งที่ฉันกำลังมองหา แต่ฉันขอขอบคุณคำอธิบายอย่างละเอียด
Martin Burch

นี่คือคำตอบ! ขอบคุณ. แฟล็ก -b ไม่ได้ผลสำหรับฉัน
Chris

ใช่ จากคำตอบทั้งหมดของคำถามนี้การแก้ไข[core]ส่วนของไฟล์ git "config" โดยการเพิ่มpager = tr -d '\\r' | less -REXเป็นคำตอบเดียวที่เหมาะกับฉัน ขอบคุณ!
Rashiki

13

ฉันต่อสู้กับปัญหานี้มาเป็นเวลานาน การแก้ปัญหาที่ง่ายที่สุดคือไม่ต้องกังวลกับตัวอักษร ^ M และใช้เครื่องมือภาพที่สามารถจัดการได้

แทนที่จะพิมพ์:

git diff <commitHash> <filename>

ลอง:

git difftool <commitHash> <filename>

1
ขอบคุณ! นอกจากนี้ฉันเพิ่งวิ่ง "git difftool" และมันก็เปรียบเทียบไฟล์ที่เปลี่ยนแปลงทั้งหมดในลูป
Bhanuprakash D


2

ตามที่ระบุไว้โดย VonC สิ่งนี้ได้รวมอยู่ใน git 2.16+ แล้ว น่าเสียดายที่ชื่อของตัวเลือก ( --ignore-cr-at-eol) แตกต่างจากที่ใช้โดย GNU ต่างจากที่ฉันคุ้นเคยกับ ( --strip-trailing-cr)

เมื่อฉันเผชิญหน้ากับปัญหานี้วิธีแก้ปัญหาของฉันคือการเรียก GNU ต่างแทนการติดตั้งในตัวของคอมไพล์เพราะคอมไพล์ของฉันเก่ากว่า 2.16 ฉันทำอย่างนั้นโดยใช้บรรทัดคำสั่งนี้:

GIT_EXTERNAL_DIFF='diff -u --strip-trailing-cr "$2" "$5";true;#' git diff --ext-diff

ที่อนุญาตให้ใช้--strip-trailing-crและตัวเลือกต่าง ๆ ของ GNU อื่น ๆ

นอกจากนี้ยังมีวิธีอื่น:

git difftool -y -x 'diff -u --strip-trailing-cr'

แต่ไม่ได้ใช้การตั้งค่าเพจเจอร์ที่กำหนดไว้ซึ่งเป็นเหตุผลที่ฉันชอบอดีต


ทางเลือกที่น่าสนใจสำหรับคำตอบของฉัน upvoted
VonC
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.