คอมไพล์ไฟล์, เปิดไฟล์ diff ทั้งหมดทันที, ไม่ได้อยู่ในซีเรียล


240

พฤติกรรม diff git เริ่มต้นคือการเปิดแต่ละไฟล์ diff ในอนุกรม (รอให้ปิดไฟล์ก่อนหน้าก่อนที่จะเปิดไฟล์ถัดไป)

ฉันกำลังมองหาวิธีเปิดไฟล์ทั้งหมดในครั้งเดียว - ใน BeyondCompare เช่นนี้จะเปิดไฟล์ทั้งหมดในแท็บภายในหน้าต่าง BC เดียวกัน

สิ่งนี้จะทำให้ง่ายต่อการตรวจสอบชุดการเปลี่ยนแปลงที่ซับซ้อน ปัดกลับและส่งต่อระหว่างไฟล์ต่าง ๆ และข้ามไฟล์ที่ไม่สำคัญ


"git diff" หรือ "git difftool" หรือไม่ คุณอาจต้องการโพสต์คำขอ (เปิดสำหรับทุกคนและด้วยเว็บอินเตอร์เฟสที่หลากหลาย) รายการส่งเมล git: git@vger.kernel.org
Jakub Narębski

ฉันใช้ "git difftool" เพื่อเรียกใช้แอปพลิเคชัน diff ภายนอก ขอบคุณสำหรับแนวคิดของรายชื่อผู้รับจดหมาย
Seba Illingworth

มันจะมีประโยชน์หากรู้แพลตฟอร์ม บนแพลตฟอร์มที่ใช้ Unix ฉันจะเขียนสคริปต์เพื่อดำเนินการ diff และสั่งให้คอมไพล์ใช้สคริปต์นั้น ในสคริปต์ฉันจะเรียกใช้ diff ในพื้นหลังแล้วปล่อยให้สคริปต์ตาย
Chris Cleeland

แพลตฟอร์ม Windows แต่ขอบคุณสำหรับแนวคิดคริส
Seba Illingworth

คำตอบ:


214

เริ่มต้นด้วยgitv1.7.11 คุณสามารถใช้git difftool --dir-diffเพื่อสร้างไดเรกทอรีที่แตกต่าง

คุณลักษณะนี้ทำงานได้ดีกับ Meld 3.14.2 และช่วยให้คุณเรียกดูไฟล์ที่แก้ไขทั้งหมด:

git difftool --dir-diff --tool=meld HEAD~ HEAD

นี่คือฟังก์ชั่นทุบตีที่มีประโยชน์:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

คำตอบต่อไปนี้นำไปใช้กับgitการติดตั้งที่เก่ากว่า v1.7.11


คำถามเดียวกันนี้ถูกถามเกี่ยวกับการรายการจดหมายคอมไพล์

ฉันรวบรวมเชลล์สคริปต์ตามเธรดอีเมลนั้นซึ่งมีไดเรกทอรีแตกต่างกันระหว่างการคอมมิท

เริ่มต้นด้วย git v1.7.10 git-diffallสคริปต์จะรวมอยู่ในการcontribติดตั้ง git มาตรฐาน

สำหรับรุ่นก่อน v1.7.10 คุณสามารถติดตั้งจากgit-diffallโครงการGitHub

นี่คือรายละเอียดโครงการ:

สคริปต์ git-diffall จัดเตรียมกลไกการกระจายไดเรกทอรีตามสำหรับ git สคริปต์พึ่งพาตัวเลือกการกำหนดค่า diff.tool เพื่อกำหนดว่าจะใช้ตัวแสดง diff แบบใด

สคริปต์นี้เข้ากันได้กับทุกรูปแบบที่ใช้เพื่อระบุช่วงของการแก้ไขที่ต่างกัน:

1) git diffall: การแสดง diff ระหว่างต้นไม้การทำงานและการจัดฉากการเปลี่ยนแปลง
2) git diffall --cached [<commit>]: การแสดง diff ระหว่างฉากการเปลี่ยนแปลงและHEAD (หรือชื่ออื่น ๆ ที่กระทำ)
3) git diffall <commit>: การแสดง diff ระหว่างต้นไม้ทำงานและตั้งชื่อกระทำ
4) git diffall <commit> <commit>: diff แสดงระหว่างสองชื่อกระทำ
5) git diffall <commit>..<commit>: เดียวกัน
6 ข้างต้นgit diffall <commit>...<commit>: แสดงการเปลี่ยนแปลงในสาขาที่มีและมากถึงวินาทีโดยเริ่มจากบรรพบุรุษร่วมของทั้งสอง<commit>

หมายเหตุ: แบบฟอร์มทั้งหมดใช้ตัว จำกัด เส้นทางที่เป็นตัวเลือก [--] [<path>]

สคริปต์นี้จะขึ้นอยู่กับตัวอย่างที่จัดไว้ให้โดยโทมัส Rast ในรายการ


ความแตกต่างระหว่าง git-diffall และgithub.com/wmanley/git-meldคืออะไร ฉันลองทั้งสองอย่างแล้วและดูเหมือนว่าพวกเขาจะมีฟังก์ชั่นที่เหมือนกันในครั้งแรก
kynan

5
ฉันขอขอบคุณสคริปต์ของคุณอย่างมาก ตรงไปตรงมาฉันไม่สามารถเข้าใจได้ว่าทำไม Git ถึงไม่ทำสิ่งที่ถูกต้องในเรื่องนี้ (Mercurial ทำและทำมาหลายปีแล้ว) และฉันไม่สามารถเข้าใจถึงการขาดความสนใจจากชุมชน Git ได้
Douglas

6
อัปเดต (เกี่ยวกับgit difftool --dir-diffและเปรียบเทียบเปรียบเทียบ): ฉันติดต่อซอฟต์แวร์สกูตเตอร์ (ผู้เขียนเกินเปรียบเทียบ) และพวกเขาบอกว่านั่นbcompare.exeไม่ใช่วิธีการแก้ไขที่รองรับและอาจทำให้เกิดปัญหาหากเปิดมากกว่าหนึ่งครั้ง พวกเขาวางแผนที่จะเพิ่มการสนับสนุนสำหรับโฟลเดอร์ที่แตกต่างbcomp.exeในรุ่นอนาคต (ในระหว่างนี้ฉันจะใช้ต่อไปbcompare.exeในฐานะวิธีแก้ปัญหาที่ไม่ได้รับการสนับสนุน)
Peter Rust

4
@coin ฉันเพิ่งทดสอบกับ Beyond Compare 4 และ --dir-diff ดูเหมือนว่าจะทำงานกับ bcomp.exe ที่รองรับ
Peter Rust

5
เพียงแค่แสดงความคิดเห็นเพื่อพูดว่า--dir-diffทำงานได้อย่างสมบูรณ์กับ Meld จากตรงนั้นมันจะช่วยให้คุณเลือกและดูส่วนต่างสำหรับแต่ละไฟล์
mkasberg

61

นี่คือสิ่งที่ฉันตัดสิน ...

คัดลอกรหัสต่อไปนี้ไปยังไฟล์ชื่อgit-diffall(ไม่มีนามสกุล):

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

วางไฟล์ในcmdโฟลเดอร์ของ gir install dir ของคุณ (เช่นC:\Program Files (x86)\Git\cmd)

และใช้อย่างที่คุณต้องการgit diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

หมายเหตุ: กุญแจสำคัญคือ& param ซึ่งบอกให้คำสั่ง diff ภายนอกทำงานในงานพื้นหลังเพื่อให้ไฟล์ถูกประมวลผลทันที ในกรณีของ BeyondCompare จะเปิดหนึ่งหน้าจอพร้อมกับแต่ละไฟล์ในแท็บของตัวเอง


ขอบคุณสำหรับการโพสต์ น่าเสียดายที่มันไม่ทำงานกับตัวเลือกของ WinMerge ไฟล์ temp ทั้งหมดยกเว้นการลบครั้งแรกก่อนที่ WinMerge จะมองไปที่พวกเขา
Carlos Rendon

Carlos: ฉันใช้ WinMerge กับ Git วิธีการของฉันคือการเพิ่ม 'sleep 1' หลังจากเปิดตัว WinMerge (ซึ่งในกรณีของฉันดูเหมือนว่าจะเปิดตัว "ในพื้นหลัง" แล้ว - ไม่จำเป็นต้อง &) วิธีนี้ไฟล์ชั่วคราวจะใช้งานได้นานพอที่ WinMerge จะรับมันหนึ่งครั้ง (ยกเว้นในกรณีแปลก ๆ ) นอกจากนี้ยังหมายความว่าใช้เวลา 1 วินาทีต่อไฟล์ในการเปิดทั้งหมด มันเป็นแฮ็คที่น่ารังเกียจ (ฉันจะไม่ให้มันเป็น "คำตอบ"!) แต่เป็นวิธีที่ง่ายและมีประสิทธิภาพพอสมควร
Woody Zenfell III

2
สำหรับการใช้งานบนลินุกซ์กับ Git 2.x, ฉันได้เพื่อให้การปรับเปลี่ยนเล็กน้อย: การเปลี่ยนแปลงไป"$filename" "../$filename"จากนั้นก็ทำงานได้อย่างสมบูรณ์แบบด้วย Beyond Compare
Dave C

1
@DaveC ในเธรดดั้งเดิมบอกว่า "เก็บไฟล์ไว้ในโฟลเดอร์ cmd ของการติดตั้งคอมไพล์ของคุณ" และดำเนินการกับตัวอย่างบน windows คุณเก็บไฟล์ "git-diffall" ไว้ใน Linux ที่ไหน
m4l490n

2
เราจำเป็นต้องรีสตาร์ท windows หลังจากเพิ่มgit-diffallไฟล์ไปยังC:\Program Files\Git\cmdโฟลเดอร์หรือไม่? ฉันทำตามที่ได้รับคำสั่ง แต่เมื่อทำ $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis

19

meld มีคุณสมบัติที่เรียบร้อยซึ่งถ้าคุณให้ไดเรกทอรีภายใต้การควบคุมแหล่ง (Git, Mercurial, Subversion, Bazaar และอื่น ๆ ) มันจะแสดงรายการไฟล์ที่เปลี่ยนแปลงทั้งหมดโดยอัตโนมัติและคุณสามารถดับเบิลคลิกเพื่อดูความแตกต่างของแต่ละบุคคล

IMO มันง่ายมากที่จะพิมพ์meld .และมีมันคิดออก VCS กว่ากำหนดค่า VCS meldของคุณเพื่อเปิดตัว ยิ่งไปกว่านั้นคุณสามารถใช้คำสั่งเดียวกันไม่ว่าโครงการของคุณจะเกิดอะไรขึ้นกับ VCS ซึ่งดีมากถ้าคุณสลับไปมาระหว่างสิ่งต่างๆ

ข้อเสียเพียงอย่างเดียวคือมันช้ากว่าที่ meld สแกนหาการเปลี่ยนแปลงกว่าจะผ่านการเปลี่ยนแปลงจาก git / hg / svn ถึงแม้ว่ามันจะช้าพอที่จะเป็นปัญหาหรือไม่ขึ้นอยู่กับว่าคุณใช้มันอย่างไร


4
สำหรับฉันข้อเสียเปรียบหลักคือ meld (ด้วยเหตุผลใดก็ตาม) เปิด diff ในหน้าต่างใหม่แทนแท็บใหม่และหลังจากปิด diff ไฟล์ในไดเรกทอรีทำงานจะเปิดขึ้นในแท็บใหม่พร้อมกับข้อความป๊อปอัปที่น่ารำคาญมาก่อน
kynan

เครื่องมือที่ดี แต่ติดตั้ง Windows ที่น่ากลัว (ตั้งแต่ต้นปี 2012)
Wernight

@ kynan ดูเหมือนว่าเป็นโซลูชั่นที่สมบูรณ์แบบสำหรับวิธีการไม่เชื่อเรื่องพระเจ้า VCS ของ diffing หากไม่ได้สำหรับสิ่งที่ป๊อปอัพหน้าต่างคู่ที่น่ารำคาญ มันเป็นความอัปยศ :(
PKKid

คุณลักษณะที่ยอดเยี่ยมของ meld คือตัวกรองต่าง: ละเว้นการเปลี่ยนแปลงเช่นในความคิดเห็นหรือเพิ่ม / ลบบรรทัดว่างที่git diffไม่มีให้
kynan

1
ฉันใช้วิธีนี้มาหนึ่งปีหรือมากกว่านั้น มันใช้งานได้ดีสำหรับโครงการขนาดเล็ก แต่เมื่อคุณมีโครงการขนาดใหญ่ (เช่นไฟล์จำนวนมาก) มันจะช้ากว่าปกติเนื่องจากมันจะ "สแกน" สำหรับ git diffs ด้วยตนเอง (ไม่แน่ใจว่าทำไมมันใช้วิธีนี้เมื่อ git ชัดเจนสามารถให้รายการ ไฟล์โดยตรง ... )
namuol

3

ฉันค้นหาวิธีนี้ (GitDiff.bat และ GitDiff.rb) ที่คัดลอกไฟล์ออกไปยังเทมเพลตเก่า / ใหม่และจากนั้นโฟลเดอร์จะเปรียบเทียบกับมัน

แต่ฉันอยากจะดูไฟล์การทำงานโดยตรง (จากผู้ใช้ที่กำลังทำงาน) เนื่องจาก BeyondCompare มีคุณสมบัติที่สะดวกในการแก้ไขไฟล์จากในหน้าต่างต่างซึ่งเหมาะสำหรับการสะสางอย่างรวดเร็ว

แก้ไข: วิธีที่คล้ายกันที่นี่เพื่อตอบคำถามของฉันในรายชื่อผู้รับจดหมาย git


3

git meld=> https://github.com/wmanley/git-meldเป็นสคริปต์ที่ยอดเยี่ยมซึ่งจะเปิดไฟล์ต่าง ๆ ทั้งหมดในหน้าต่างเดียว


ใช้งานได้ดี! ในฐานะที่เป็นโบนัสที่เพิ่มเข้ามามันทำงานเหมือนกับ hg meld ขอบคุณ!
PKKid

2

สังเกตที่นี่ว่า Araxis Merge มีตัวเลือกคำสั่ง '-nowait':

-nowait ป้องกันการเปรียบเทียบจากการรอให้การเปรียบเทียบถูกปิด

บางทีนี่อาจจะส่งคืนรหัสออกทันทีและจะใช้ได้ทุกคนที่ประสบปัญหานี้ ไม่พบตัวเลือกที่คล้ายกันสำหรับ BeyondCompare ...


2

การกระจายยังมีการรวม VCS มันทำงานร่วมกับ VCS อื่น ๆ มากมายรวมถึง SVN, Mercurial, Bazaar, ... สำหรับ Git มันจะแสดงบานหน้าต่างสามบานหากมีการเปลี่ยนแปลงบ้าง แต่ไม่ใช่ทั้งหมด ในกรณีที่มีข้อขัดแย้งจะมีบานหน้าต่างสี่บาน

ภาพหน้าจอของการกระจายด้วยการแก้ไขแบบฉากและแบบไม่มีการแก้ไข

เรียกใช้ด้วย

diffuse -m

ในสำเนาการทำงาน Git ของคุณ

หากคุณถามฉันภาพที่ดีที่สุดต่างไปจากที่ฉันเคยเห็นมาสิบปี (และฉันก็ลองรวมกันด้วย)


คุณสามารถบอกได้ว่าคุณชอบส่วนใดของการแพร่กระจาย
musiphil

@musiphil: ฉันชอบความเรียบง่าย - ดูเหมือนว่าจะมีชุดคุณสมบัติที่แน่นอนที่จำเป็นในการแก้ปัญหาไม่มาก แต่ก็ไม่น้อยกว่า (เช่นเดียวกับการจัดตำแหน่งความแตกต่างและความกว้างของขนาดแท็บใหม่) ฉันจำไม่ได้ว่าทำไมฉันจึงเปลี่ยนจาก meld และฉันไม่ได้ใช้ meld ตั้งแต่นั้นมาดังนั้นฉันจึงไม่สามารถเปรียบเทียบได้ในขณะนี้
krlmlr

1
Diffuse ทำงานกับ git โดยไม่ต้องกำหนดค่าใด ๆ Diffuse -m เปิดหน้าต่างเดียวด้วย git diffs ในแท็บต่าง ๆ ในขณะที่เครื่องมืออื่น ๆ ต้องการการกำหนดค่ามากเกินไปในการเริ่มต้น
mosh

1

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

vi $ (สถานะ git | sed -n '/.*modified: * / s /// p')

หากคุณกำลังทำ "ชุดการเปลี่ยนแปลงที่ซับซ้อน" คุณอาจต้องการพิจารณาเวิร์กโฟลว์ของคุณอีกครั้ง หนึ่งในคุณสมบัติที่ดีมากของ git ก็คือทำให้นักพัฒนาซอฟต์แวร์สามารถลดการเปลี่ยนแปลงที่ซับซ้อนไปเป็นชุดแพทช์ง่าย ๆ แทนที่จะพยายามแก้ไขไฟล์ทั้งหมดที่แก้ไขในปัจจุบันคุณอาจต้องการตรวจสอบ

git เพิ่ม --patch
ซึ่งจะช่วยให้คุณเลือกนักล่าบนเวที


1

ฉันเขียนสคริปต์ powershell ที่จะทำซ้ำแผนผังการทำงานสองต้นและเปรียบเทียบกับ DiffMerge ดังนั้นคุณสามารถทำได้:

GitNdiff master~3 .

เพื่อเปรียบเทียบการเช็คอินสาขาหลักสามครั้งที่ผ่านมากับแผนผังการทำงานปัจจุบัน

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

http://github.com/fschwiet/GitNdiff


1

สำหรับผู้ที่สนใจในการใช้ git-diffall บน Mac OS X กับ Araxis ฉันได้แยกโครงการ git-diffall บน github และเพิ่ม AppleScript ที่ล้อมรอบคำสั่ง Araxis Merge หมายเหตุ: นี่เป็นโคลนที่มีการดัดแปลงเล็กน้อยของaraxisgitdiffไฟล์ที่มาพร้อมกับ Araxis Merge สำหรับ Mac OS X

https://github.com/sorens/git-diffall


1

การทำงานต่อไปนี้กับ meld และ kdiff3

git difftool --dir-diff origin/branch1..origin/branch2

เปิดไฟล์ทั้งหมดในหน้าต่างที่คุณสามารถเรียกดูได้อย่างง่ายดาย สามารถใช้กับเซ็ตการแก้ไขแทนที่ Origin / Branch-name

เช่น: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

คุณสามารถใช้gitkและดูความแตกต่างทั้งหมดในเวลาเดียวกัน


3
ใช่ฉันพบ gitk ประโยชน์ แต่เมื่อมันมาถึง diff ไอเอ็นจีบีซีคือสิ่งที่ฉันต้องการที่จะเห็น :)
Seba Illingworth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.