Git ค้นหาสตริงในประวัติไฟล์เดียว


172

ดังนั้นถ้าฉันมีไฟล์ชื่อfoo.rbและมันทำให้ฉันมีข้อผิดพลาดสำหรับวิธีที่ขาดหายไปที่เรียกว่าbarดังนั้นฉันต้องการค้นหาประวัติของfoo.rbเพื่อหาสตริงbarเพื่อดูว่ามันเคยถูกกำหนดไว้ในอดีตหรือไม่

ฉันพบสิ่งนี้ค้นหาประวัติ Git ทั้งหมดสำหรับสตริงหรือไม่?

แต่มันจะค้นหาไฟล์ทั้งหมด ฉันแค่ต้องการค้นหาในไฟล์เดียว


6
เช่นเดียวกับ FYI คุณสามารถต่อท้าย-- filenameคำสั่ง git จำนวนมากหากคุณต้องการ จำกัด เพียงไฟล์เดียว
Karl Bielefeldt

คำตอบ:


234

เพื่อจุดประสงค์นี้คุณสามารถใช้ตัวเลือก -S เพื่อบันทึก git:

git log -S'bar' -- foo.rb

39
หรือgit log -G'bar' -- foo.rbเพื่อค้นหา diff ที่มี 'bar' แทนการกระทำที่เปลี่ยนจำนวนการเกิดขึ้นของ 'bar' (ดู git-log manpage)
Jakub Narębski

1
มันไม่ได้ทำงานให้ฉันด้วยคำพูดที่ผมใช้-Sbarมันเพื่อค้นหาบาร์ อาจจะมีบางอย่างเกี่ยวข้องกับฉันโดยใช้บรรทัดคำสั่ง Windows
zbr

พูดอีกอย่าง-Gก็คือสำหรับการค้นหา regex ... นี่เป็นการอ้างอิงที่ดีเช่นกัน: stackoverflow.com/a/4472267/2586761
ptim

17

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

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

จริง ๆ แล้วมันจะค้นหาเนื้อหาไฟล์และไม่ยอมรับข้อความ / โปรแกรมแก้ไขสำหรับการเกิดขึ้นของแถบ


สำหรับ windows: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(คอยดูเครื่องหมายคำพูดคู่หากชื่อไฟล์หรือวลีค้นหามีช่องว่าง)
21415

1
สำหรับผมใน Windows มันไม่ได้ทำงานโดยไม่ต้อง "ทำ" for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (นาฬิกาสำหรับราคาสองครั้งถ้าชื่อไฟล์หรือค้นหาวลีมีช่องว่าง)
xberger

2

มีการแทนที่สำหรับคำสั่งบันทึก git (จากคู่มือ ):

$ git log Makefile      # commits that modify Makefile

ดังนั้นคุณสามารถใช้:

git log foo.rb | grep "bar"

2
ขอบคุณ แต่นี่เป็นการค้นหาประวัติการส่งมอบไม่ใช่ประวัติของแหล่งที่มาของไฟล์
JD Isaacks

2
จริงๆแล้วมีการแทนที่อื่นที่ค้นหาการเปลี่ยนแปลงข้อมูลสตริง: git log -S'foo () '# กระทำการที่เพิ่มหรือลบข้อมูลไฟล์ใด ๆ ที่ตรงกับสตริง' foo () '
Dmitry Reznik

1
คุณสามารถลองใช้พารามิเตอร์ --full-diff บันทึกไม่เพียง แต่แสดงประวัติการกระทำ แต่ยังแตกต่าง
Dmitry Reznik

@DmitriyReznik - เห็นได้ชัดว่า--full-diffใช้งานไม่ได้ (ในขณะที่ไม่มีการแสดง diff) โดยไม่มี-pอย่างน้อยก็ใน git 1.7.9.5
sdaau

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