วิธี grep Git คอมมิชชันหรือเนื้อหาสำหรับคำบางคำ?


622

ในที่เก็บรหัส Git ฉันต้องการแสดงรายการการกระทำทั้งหมดที่มีคำที่แน่นอน ฉันลองสิ่งนี้

git log -p | grep --context=4 "word"

แต่ไม่จำเป็นต้องให้ชื่อไฟล์กลับมา (ยกเว้นกรณีที่น้อยกว่า 5 บรรทัดจากคำที่ฉันค้นหาฉันยังลอง

git grep "word"

แต่มันให้เฉพาะไฟล์ที่ฉันนำเสนอไม่ใช่ประวัติ

ฉันจะค้นหาประวัติทั้งหมดเพื่อติดตามการเปลี่ยนแปลงของคำใดคำหนึ่งได้อย่างไร ฉันต้องการค้นหา codebase ของฉันเพื่อค้นหาคำเพื่อติดตามการเปลี่ยนแปลง (ค้นหาในประวัติไฟล์)


คำตอบ:


905

หากคุณต้องการค้นหาการกระทำทั้งหมดที่การส่งข้อความมีคำที่กำหนดให้ใช้

$ git log --grep=word

หากคุณต้องการค้นหาการกระทำทั้งหมดที่มีการเพิ่มหรือลบคำว่า "word" ในเนื้อหาไฟล์ (เพื่อให้แม่นยำยิ่งขึ้น: เมื่อจำนวนการเปลี่ยนแปลงของคำว่า "word") คือการค้นหาเนื้อหาที่ยอมรับใช้การค้นหา 'pickaxe' ด้วย

$ git log -Sword

ในคอมไพล์สมัยใหม่ยังมี

$ git log -Gword

เพื่อค้นหาความแตกต่างที่เพิ่มหรือลบบรรทัดที่ตรงกับ "คำ" (รวมถึงเนื้อหา )

โปรดทราบว่า-Gโดยค่าเริ่มต้นยอมรับ regex ในขณะที่-Sยอมรับสตริง แต่สามารถแก้ไขได้ที่จะยอมรับ regexes --pickaxe-regexใช้

หากต้องการแสดงความแตกต่างระหว่าง-S<regex> --pickaxe-regexและ-G<regex>ให้พิจารณาคอมมิตด้วย diff ต่อไปนี้ในไฟล์เดียวกัน:

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

ในขณะที่git log -G"regexec\(regexp"จะแสดงการกระทำนี้git log -S"regexec\(regexp" --pickaxe-regexจะไม่ (เพราะจำนวนการเกิดขึ้นของสตริงนั้นไม่เปลี่ยนแปลง)


ด้วย Git 2.25.1 (ก.พ. 2563) เอกสารดังกล่าวได้รับการชี้แจงรอบ regexes เหล่านั้น

ดูกระทำ 9299f84 (6 กุมภาพันธ์ 2020) โดยมาร์ติน Agren ( ``)
(รวมโดยJunio C Hamano - gitster-ในการกระทำ 0d11410 , 12 กุมภาพันธ์ 2020)

diff-options.txt: หลีกเลี่ยงการโอเวอร์โหลด "regex" ในตัวอย่าง

รายงานโดย: Adam Dinwoodie
ลงชื่อโดย: Martin Ågren
บทวิจารณ์โดย: Taylor Blau

เมื่อเราเป็นตัวอย่างความแตกต่างระหว่าง-Gและ-S(โดยใช้--pickaxe-regex) เราจะใช้ตัวอย่าง diff และgit diffการเรียกที่เกี่ยวข้องกับ "regexec", "regexp", "regmatch", ...

ตัวอย่างนี้ถูกต้อง แต่เราสามารถทำให้แก้ให้หายยุ่งได้ง่ายขึ้นโดยหลีกเลี่ยงการเขียน "regex. *" เว้นแต่จะจำเป็นต้องทำให้ประเด็นของเราเป็นจริง

ใช้คำที่สร้างขึ้นและไม่ใช่คำที่ไม่ใช่ regexy แทน

git diffเอกสารในขณะนี้รวมถึง:

หากต้องการแสดงความแตกต่างระหว่าง-S<regex> --pickaxe-regexและ -G<regex>ให้พิจารณาคอมมิตด้วย diff ต่อไปนี้ในไฟล์เดียวกัน:

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

ในขณะที่git log -G"frotz\(nitfol"จะแสดงการกระทำนี้git log -S"frotz\(nitfol" --pickaxe-regexจะไม่ (เพราะจำนวนการเกิดขึ้นของสตริงนั้นไม่เปลี่ยนแปลง)


3
@TankorSmash -S<string>ค้นหาความแตกต่างที่แนะนำหรือลบอินสแตนซ์ของ <string> -G<string>ค้นหาความแตกต่างที่เพิ่มหรือลบบรรทัดตรงกับ <regex> ที่กำหนด
m-ric

1
@ m-ric โอ้ฉันเข้าใจแล้วว่าเป็นสตริงตัวเดียวเทียบกับทั้งบรรทัด! ขอบคุณ
TankorSmash

3
@ m-ric, @TankorSmash: ความแตกต่างนั้น-S<string>เร็วกว่าเพราะจะตรวจสอบว่ามีจำนวนการ<string>เปลี่ยนแปลงเกิดขึ้นหรือไม่ในขณะที่-G<string>การค้นหาเพิ่มและลบบรรทัดในการคอมมิชชันทุกครั้ง
Jakub Narębski

3
หากคุณต้องการค้นหาคำที่มีช่องว่างระหว่าง, git log --grep="my words".
MEM

4
@MEM, --grepจะแตกต่างจากและ-S -Gคุณสามารถอ้างอิงสตริงให้กับแต่ละข้อโต้แย้งเหล่านี้
คิวเมนตัส

255

git logpickaxe ของจะค้นหาการกระทำที่มีการเปลี่ยนแปลงรวมถึง "word" ด้วย git log -Sword


60
มันไม่แม่นยำอย่างสิ้นเชิง -S <string> ค้นหาความแตกต่างที่แนะนำหรือลบอินสแตนซ์ของ <string> โปรดทราบว่านี่แตกต่างจากสตริงที่ปรากฏในเอาต์พุต diff
tymtam

4
ในขณะที่นี่เป็นคำตอบที่ถูกต้องโดยทั่วไปฉัน downvoted เพียงเพื่อสนับสนุนให้ผู้อื่นอ่านคำตอบนี้ ( stackoverflow.com/a/1340245/586983 ) ซึ่งมี 3 วิธีแตกต่างกันและอธิบายรายละเอียดปลีกย่อยของพวกเขา
jakeonrails

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

@ jakeonrails คำตอบนั้นน่าจะเป็นคำตอบที่เก่ากว่านี้ดังนั้นเราจึงไม่มีคำซ้ำที่น่ารำคาญเหล่านี้ แต่ผู้คนต้องการเพียงชื่อเสียงแทนที่จะเป็นหน้าคำตอบที่สะอาด
Iulian Onofrei

22

หลังจากการทดลองจำนวนมากฉันสามารถแนะนำสิ่งต่อไปนี้ซึ่งแสดงถึงการกระทำที่แนะนำหรือลบบรรทัดที่มี regexp ที่กำหนดและแสดงการเปลี่ยนแปลงข้อความในแต่ละรายการด้วยสีที่แสดงคำที่เพิ่มและลบ

git log --pickaxe-regex -p --color-words -S "<regexp to search for>"

ใช้เวลาสักครู่ในการทำงานแม้ว่า ... ;-)


2
นี่คือหนึ่งในขอบคุณที่ดีที่สุด คำแนะนำ: เพื่อแสดงรายการผลลัพธ์ทั้งหมดโดยไม่มีการแบ่งหน้าให้เติมคำสั่งด้วยGIT_PAGER=catหรือต่อท้ายด้วย| cat
Zack Morris

ระบุเส้นทางหรือไฟล์จะเร็วขึ้นมากgit log --pickaxe-regex -p --color-words -S "<regexp to search for>" <file or fiepath>
fangxing

10

คุณสามารถลองคำสั่งต่อไปนี้:

git log --patch --color=always | less +/searching_string

หรือใช้grepวิธีดังต่อไปนี้:

git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string'

รันคำสั่งนี้ในไดเร็กทอรีพาเรนต์ที่คุณต้องการค้นหา


2
ฉันชอบวิธีนี้เพราะความมุ่งมั่นที่ฉันกำลังมองหามีการเปลี่ยนแปลงที่ไม่เกี่ยวข้องหลายร้อยบรรทัดและฉันสนใจเฉพาะแพตช์จริงที่เกี่ยวข้องกับคำที่ฉันค้นหา git log --patch --color=always | less +/searching_stringที่จะได้รับการใช้สี
Radon Rosborough

9

อีกวิธีหนึ่ง / ไวยากรณ์ที่ต้องทำคือ: git log -S "word"
เช่นนี้คุณสามารถค้นหาตัวอย่างgit log -S "with whitespaces and stuff @/#ü !"


1

vim-fugitive ใช้งานได้หลากหลายสำหรับการตรวจใน Vim

ใช้:Ggrepทำสิ่งนั้น สำหรับข้อมูลเพิ่มเติมคุณสามารถติดตั้งเป็นกลุ่ม-ผู้ลี้ภัยและมองขึ้น turorial :help Grepโดย และตอนนี้: การสำรวจประวัติความเป็นมาของพื้นที่เก็บข้อมูลจะแนะนำให้คุณทำสิ่งนั้นทั้งหมด


1

ในการใช้ตัวเชื่อมต่อบูลีนในนิพจน์ทั่วไป:

git log --grep '[0-9]*\|[a-z]*'

นิพจน์ทั่วไปนี้ค้นหานิพจน์ทั่วไป [0-9] * หรือ [az] * ในการส่งข้อความ


-1

หากคุณต้องการค้นหาข้อมูลที่ละเอียดอ่อนเพื่อที่จะลบออกจากประวัติ git ของคุณ (ซึ่งเป็นเหตุผลที่ฉันลงจอดที่นี่) มีเครื่องมือสำหรับสิ่งนั้น Github เป็นหน้าช่วยเหลือเฉพาะสำหรับปัญหานั้น

นี่คือส่วนสำคัญของบทความ:

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

bfg --delete-files YOUR-FILE-WITH-SENSITIVE-DATA

หากต้องการแทนที่ข้อความทั้งหมดที่ระบุไว้ในรหัสผ่าน.txtไม่ว่าจะอยู่ที่ไหนในประวัติของที่เก็บของคุณให้เรียกใช้:

bfg --replace-text passwords.txt

ดูเอกสารประกอบของ BFG Repo-Cleanerสำหรับคำแนะนำการใช้งานเต็มรูปแบบและดาวน์โหลด


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