วิธีรับ git ที่แตกต่างด้วยบริบททั้งหมด?


115

วิธีสร้างแพทช์ที่เหมาะสำหรับการตรวจสอบในเบ้าหลอม?

git diff branch master --no-prefix > patch

สิ่งนี้สร้างบริบทเพียง 3 บรรทัด ดังนั้นฉันจึงทำสิ่งต่อไปนี้

git diff --unified=2000 branch master --no-prefix > patch

หวังว่าไฟล์ทั้งหมดจะมีน้อยกว่า 2,000 บรรทัด มีวิธีบอกให้ git รวมบรรทัดทั้งหมดในไฟล์สำหรับ patch โดยไม่ต้องระบุบรรทัดสูงสุดหรือไม่?


3
ฉันโพสต์ตัวเลือก -U <infinity> เพื่อแสดงทั้งไฟล์เป็นคำถามแยกต่างหากstackoverflow.com/questions/28727424/…
Aleksandr Levchuk

คำตอบ:


55

ฉันรู้ว่านี่เก่า แต่ฉันก็ไม่ชอบโซลูชันที่เข้ารหัสด้วยเช่นกันดังนั้นฉันจึงทดสอบสิ่งนี้:

git diff -U$(wc -l MYFILE)

การใช้ -U ดูเหมือนจะเป็นวิธีเดียวในการแก้ไขปัญหา แต่การใช้การนับบรรทัดสัญญาว่าจะใช้ได้แม้กระทั่งการเปลี่ยนแปลงเล็กน้อยในไฟล์ที่มีขนาดใหญ่มาก


1
<ไม่จำเป็น. git diff -U$(wc -l MYFILE) MYFILE
balki

2
ขอบคุณ @balki ฉันลองทำตามคำแนะนำของคุณและสังเกตว่า <pre> $ (wc -l MYFILE) </pre> ขยายเป็นจำนวนบรรทัดตามด้วยชื่อไฟล์ดังนั้นการใช้ชื่อไฟล์ครั้งที่สองจึงสามารถละเว้นได้เช่นกัน ฉันกำลังอัปเดตคำตอบเพื่อแสดงถึงสิ่งนี้
Ezra

4
มันเป็นความแตกต่างมีสองเวอร์ชันของไฟล์ จะเกิดอะไรขึ้นถ้าเวอร์ชันที่ไม่อยู่ในดิสก์ยาวเป็นสองเท่า? ไม่ใช่ -U ที่มีจำนวนมากปลอดภัยกว่าจริงหรือ?
Eloff

@ เอลอฟเป็นความจริงวิธีที่ดีที่สุดคือการกำหนดความยาวให้มากที่สุดเนื่องจากตัวเลขจำนวนมากยังคงมีปัญหาตรงกันข้าม วิธีนี้ถือว่าไม่มีการลบต่อเนื่องที่ใหญ่กว่าขนาดไฟล์ปัจจุบันบนดิสก์
Ezra

3
git diff -U$(wc -l MYFILE | awk '{print $1}') MYFILEเป็นคำตอบที่ดีกว่าที่จะแยกวิเคราะห์ผลลัพธ์อย่างถูกต้องwcโดยรับเฉพาะจำนวนบรรทัดโดยไม่มีช่องว่างไม่ต้องอาศัยเอาต์พุตที่ไม่ได้ใส่เครื่องหมายคำพูดของ subshell เพื่อสร้างอาร์กิวเมนต์สองรายการและทำงานบน macOS / BSD
anishpatel

95

นี้ดูเหมือนว่าจะทำงานอย่างสวย:

git diff --no-prefix -U1000

ด้วยข้อแม้:

-Uธงระบุสายของบริบท คุณอาจต้องเพิ่มค่านี้หากมีมากกว่า 1,000 บรรทัดระหว่างการเปลี่ยนแปลงของคุณ


16
-Uตัวเลือกที่คุณแนะนำคือเช่นเดียวกับ--unified=ตัวเลือกที่ใช้โดยผู้ถาม ข้อแตกต่างเพียงอย่างเดียวคือคุณระบุบรรทัดของบริบทน้อยกว่า 1,000 บรรทัดกว่าผู้ถามที่ใช้คือ 2000 @balki ต้องการทราบวิธีเพิ่มจำนวนเป็นอนันต์ แต่คุณแนะนำให้ตัดจำนวนลงครึ่งหนึ่ง ทำไม?
LS

4
@LS: ใช่ฉันรู้แล้ว แต่มองข้ามไปเมื่อสองสามปีก่อน ถึงกระนั้นก็ชัดเจนว่าเกิดอะไรขึ้นมากกว่าในคำถามและดูเหมือนจะช่วยคนแปลก ๆ ที่มาที่นี่
c24w

ขอบคุณสำหรับสิ่งนี้มันยังใช้งานได้ดีด้วยgit show!
Shakeel

@ c24w เห็นด้วยยังคงทำให้ฉันได้รับสิ่งที่ฉันต้องการเห็นบนหน้าจอ
เชฟฟาโรห์

1
--no-prefixตัวเลือกที่ได้รับการกำจัดของ“/ a /” และ“/ b /” คำนำหน้าปลายทางที่แสดงโดยค่าเริ่มต้น (หน้าที่เชื่อมโยง)
luckydonald

10

หมายเหตุ: git1.8.1rc1 ประกาศ (8 ธันวาคม 2555)ประกอบด้วย:

diff.contextสามารถใช้ตัวแปรคอนฟิกูเรชันใหม่ " " เพื่อกำหนดจำนวนบรรทัดบริบทเริ่มต้นในเอาต์พุตแพตช์เพื่อแทนที่ค่าดีฟอลต์ที่เข้ารหัส 3 บรรทัด

เพื่อให้สามารถช่วยสร้างบริบทที่สมบูรณ์ยิ่งขึ้นได้ที่นี่


7
แต่ไม่มีตัวเลือกให้พูดว่า 'ทุกบรรทัดในไฟล์'
balki

3
ฉันสงสัยว่าการใส่ตัวเลขจำนวนมากนั่นจะเป็นการจำลอง "ทุกบรรทัด"
VonC

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

4

มีแรงบันดาลใจดังนั้นฉันจึงเพิ่มนามแฝงคอมไพล์

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>

ปรับปรุง:

เพิ่งพบว่า "git df" ใช้งานไม่ได้ในบางครั้งเนื่องจากมีการเปลี่ยนแปลงไดเรกทอรีเมื่อเรียกใช้ชื่อแทน git (ดูนามแฝง git ทำงานในไดเร็กทอรีที่ไม่ถูกต้อง ) นี่คือเวอร์ชันอัปเดต:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0


0

โซลูชันที่ยอมรับก่อนหน้านี้ไม่ได้ผลสำหรับฉันเมื่อดูไฟล์ / คอมมิตเฉพาะ ( -Uตัวเลือกดูเหมือนจะยุ่งกับการแยกวิเคราะห์ rev / path) แต่ใช้--inter-hunk-context=งานได้ในกรณีนี้ในgit version 2.24.0:

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

หากคุณไม่ทราบขนาดไฟล์คุณสามารถค้นหาได้โดยไม่wc -lต้องเข้ารหัส:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.