ในการค้นหาการคอมมิชชันเนื้อหา (เช่นบรรทัดแหล่งที่มาที่แท้จริงซึ่งตรงข้ามกับการยอมรับข้อความและสิ่งที่คล้ายกัน) คุณต้องทำ:
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <expression>
จะทำงานได้หากคุณพบข้อผิดพลาด "รายการอาร์กิวเมนต์ยาวเกินไป"
หากคุณต้องการ จำกัด การค้นหาเฉพาะทรีย่อย (ตัวอย่างเช่น "lib / util") คุณจะต้องส่งสิ่งนั้นไปยังคำrev-list
สั่งย่อยและgrep
เช่นกัน:
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
นี้จะ grep regexp
ผ่านทุกกระทำของคุณข้อความสำหรับ
เหตุผลสำหรับการส่งผ่านเส้นทางในคำสั่งทั้งเป็นเพราะrev-list
จะกลับรายการการแก้ไขที่มีการเปลี่ยนแปลงทั้งหมดที่จะlib/util
เกิดขึ้น แต่ยังคุณต้องผ่านไปเพื่อให้มันจะค้นหาในgrep
lib/util
ลองนึกภาพสถานการณ์ต่อไปนี้: grep
อาจพบไฟล์เดียวกัน<regexp>
ที่อยู่ในการแก้ไขเดียวกันที่ส่งคืนโดยrev-list
(แม้ว่าจะไม่มีการเปลี่ยนแปลงกับไฟล์นั้นในการแก้ไขนั้น)
นี่คือวิธีที่มีประโยชน์อื่น ๆ ในการค้นหาแหล่งที่มาของคุณ:
ค้นหาแผนผังการทำงานสำหรับข้อความที่ตรงกับการแสดงออกปกติ regexp:
git grep <regexp>
ค้นหาแผนผังการทำงานของบรรทัดข้อความที่ตรงกับการแสดงออกปกติ regexp1 หรือ regexp2:
git grep -e <regexp1> [--or] -e <regexp2>
ค้นหาแผนผังการทำงานของบรรทัดข้อความที่ตรงกับการแสดงออกปกติ regexp1 และ regexp2 รายงานเส้นทางไฟล์เท่านั้น:
git grep -l -e <regexp1> --and -e <regexp2>
ค้นหาแผนผังการทำงานสำหรับไฟล์ที่มีบรรทัดของข้อความที่ตรงกับนิพจน์ปกติ regexp1 และบรรทัดของข้อความที่ตรงกับนิพจน์ปกติ regexp2:
git grep -l --all-match -e <regexp1> -e <regexp2>
ค้นหาแผนผังการทำงานของบรรทัดที่เปลี่ยนแปลงของรูปแบบการจับคู่ข้อความ:
git diff --unified=0 | grep <pattern>
ค้นหาการแก้ไขทั้งหมดสำหรับข้อความที่ตรงกับการแสดงออกปกติ regexp:
git grep <regexp> $(git rev-list --all)
ค้นหาการแก้ไขทั้งหมดระหว่าง rev1 และ rev2 เพื่อค้นหาข้อความที่ตรงกับการแสดงออกปกติ regexp:
git grep <regexp> $(git rev-list <rev1>..<rev2>)
git log -S
และตำหนิ) * [สนุกกับ "git log --grep"] [2] (ค้นหาข้อความยืนยัน ) * [สนุกกับ "git grep"] [3] [2]: gitster.livejournal.com/30195.html [3]: gitster.livejournal.com/27674.html