วิธีการกรองคอมไพล์ตามนามสกุลไฟล์?


คำตอบ:


227

ใช่ถ้าคุณมั่นใจว่า git นั้นขยายวงกว้างมากกว่าที่เปลือกของคุณมันจะจับคู่กับทุกระดับดังนั้นบางสิ่งเช่นนี้ (คำพูดสำคัญ) ควรจะทำงานได้ดี

git diff -- '*.c' '*.h'

1
ตกลงเวอร์ชันคอมไพล์ของฉันเก่าเกินไป ทำงานตามที่โฆษณาไว้กับ 1.7.8 ยอดเยี่ยม
Mat

3
ฉันทำงานกับการขยายรั้ง, lagit diff -- *.{c,h,etc}
Matt Fletcher

9
เส้นประสองเส้นมีความสำคัญเช่น git diff master HEAD -- "*filename.txt"ยังมีประโยชน์คือgit diff master HEAD --name-only
neaumusic

คำพูดเดียว ( '') ก็มีความสำคัญเช่นกัน! git diff -- src/*.jsควรเป็นgit diff -- 'src/*.js'
Nickofthyme

1
และต้องทำสิ่งนี้ที่ไดเร็กทอรีรูทของที่เก็บ git
John Jiang

10

หากต้องการรวมไฟล์แบบเรียกซ้ำ (รวมถึง dir ปัจจุบัน) สิ่งนี้ใช้ได้สำหรับฉัน:

git diff -- '***.py'

1
สำหรับฉันมันเป็นทางออกที่ดีที่สุด คุณยังสามารถยกเว้นบางไฟล์ / ไดเรกทอรี ตัวอย่างเช่น:git diff -- '***.py' ':!.Trashes'
Bartosz

เครื่องหมายดอกจันสามดวงทำอะไร (เทียบกับเครื่องหมายดอกจันเดี่ยว)
Jann Poppinga

IIRC หมายถึงเครื่องหมายดอกจันคู่ (อาจเป็นไปได้) ไดเรกทอรีที่ซ้อนกัน (แม้แต่ว่างเปล่า) และเครื่องหมายดอกจันเดียวและ. py หมายถึงชื่อไฟล์ ดังนั้นควรเป็นไฟล์ * .py ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีใด ๆ ที่ซ้อนกัน
Bohumir Zamecnik

8

ใช้ globstar ของเชลล์ (ซึ่งจะทำการค้นหาแบบเรียกซ้ำ) 1 , 2 :

shopt -s globstar 
git diff -- *.py **/*.py

หรือใช้ค้นหา:

find -name '*.py' -print0 | xargs -0 git diff --

ทั้งสองนี้เป็นชื่อพิเศษและการพิสูจน์ช่องว่าง แม้ว่าคุณอาจต้องการกรองสำหรับไดเรกทอรีที่มีนามสกุล. py :)


1 ฉันชอบทำตามgit diff -- {.,**}/*.pyปกติ

2 เมื่อเปิดใช้งาน globstar อยู่git diff -- **/*.pyแล้วรวมอยู่./*.pyด้วย ใน manpage ของ Bash: 'ถ้าตามด้วย a /, * s สองอันที่อยู่ติดกันจะจับคู่เฉพาะไดเรกทอรีและไดเรกทอรีย่อย'


4

สำหรับรูปแบบไฟล์ธรรมดาสิ่งนี้ดูเหมือนจะใช้ได้:

$ git ls-files -zm '*.txt' | xargs --null git diff

ช่องว่างที่ปลอดภัยและคุณสามารถมีส่วนขยายได้หลายรายการเช่นกัน:

$ git ls-files -zm '*.h|*.c|*.cpp' | xargs --null git diff

3

อาร์กิวเมนต์บรรทัดคำสั่งสำหรับส่วนขยาย

git diff *.py

ในอีกทางหนึ่งคุณสามารถfindไปที่git diff:

find . -name '*.py' -type f | git diff --

โปรดทำให้คำตอบอ่านง่ายขึ้นอีกนิด คุณอาจจะได้พอเพียงกับgit diff *.pyและไม่มีการตะโกนหัว
sehe

1
ส่วนหัว 'ตะโกน' คือ # -comments ในเชลล์สคริปต์
hughdbrown

นี่เป็นทางออกเดียวที่ทำงานให้ฉันราคา (ฯลฯ ) ไม่ทำงานบนพรอมต์คำสั่งของ Windows
Ed Bayiates

1

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

git diff YourBranchName@{1} YourBranchName --name-only "*.YourFileExtionsion"

ตัวอย่างเช่น:

git diff master@{1} origin/master --name-only "*.cs"

1
มันทำงานสำหรับฉันเมื่อฉันให้ - ก่อนการขยายเช่นนี้git diff master@{1} origin/master --name-only -- "*.cs"
333

0

ดูเหมือนว่าคำตอบข้างต้นจะไม่เหมาะกับฉันgit bashที่ใช้ Windows ฉันไม่แน่ใจว่ามันเป็นรุ่น (ฉันใช้ 1.8.4) หรือ Windows / bash สิ่ง; ในกรณีของฉันฉันต้องการแยกสองสาขาซึ่งแต่ละสาขามีไฟล์เพิ่มเติมที่ไม่ปรากฏในสาขาอื่น

อย่างไรก็ตามสิ่งนี้ใช้ได้สำหรับฉัน (ในตัวอย่างของฉันกำลังมองหาส่วนต่างระหว่างไฟล์ไพ ธ อน):

git diff branch1 branch2 -- `git diff --summary branch1 branch2 | egrep '\.py$' | cut -d ' ' -f 5`

stackoverflow.com/a/8554987/4233229นี้ใช้งานได้ แต่จะต้องใช้เครื่องหมายคำพูดคู่แทนการใช้คำเดียวสำหรับ Windows
lcnittl

0

git diff จะแสดงความแตกต่างในไฟล์ที่ไม่มีการกำหนดสถานะเท่านั้น

ผมพบว่าคำถามนี้เพราะผมอยากที่จะไม่รวมไฟล์จาก.info git diffฉันทำสิ่งนี้ได้ด้วยการจัดเตรียมgit add *.infoไฟล์ซึ่งจะช่วยลดไฟล์ที่เหลือ


0

ฉันกระทบกับสิ่งนี้:

commit=<the_commit_hash_goes_here> && git diff --name-only $commit | grep -i Test | egrep -v '\.sql$' | xargs git diff $commit --

สิ่งนี้แสดงให้เห็นถึงความแตกต่างสำหรับการคอมมิทที่ระบุเฉพาะในกรณีที่ชื่อไฟล์มีคำว่า 'test' (case insensitive) และไม่สิ้นสุด.sqlให้แก้ไขไปป์ไลน์ตามความจำเป็นสำหรับกรณีของคุณ

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