เหตุใดบันทึก git จึงไม่แสดงประวัติของไฟล์ที่ย้ายและฉันจะทำอย่างไรกับมัน


91

ฉันเปลี่ยนชื่อไฟล์สองสามไฟล์โดยใช้git mvใช้git stashดู HEAD อย่างรวดเร็ว (โดยไม่ต้องเปลี่ยน) จากนั้นก็git stash popนำล็อตทั้งหมดกลับมาอีกครั้ง การเคลื่อนไหวของฉันหายไปจากรายการคอมมิตดังนั้นฉันจึงเปลี่ยนมันใหม่git rmและข้อความคอมมิตที่อ้างว่าคอมไพล์พบว่าการเปลี่ยนชื่อเป็นการเปลี่ยนชื่อ ดังนั้นฉันจึงไม่คิดอะไรอีกแล้ว

แต่ตอนนี้โพสต์คอมมิตฉันไม่สามารถรับประวัติของไฟล์ที่ย้ายได้! นี่คือสิ่งที่คอมไพล์พูดเกี่ยวกับการกระทำที่เป็นปัญหา:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

ตอนนี้ฉันกำลังพยายามหาประวัติของไฟล์ที่ถูกย้ายเหล่านี้ดังนั้นฉันสามารถดูเวอร์ชันเก่าได้ แต่ฉันไม่ได้รับประโยชน์อะไร

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(ฉันยังพยายามจะไม่-M, -Cและ--find-copies-harderแต่จะไม่มีประโยชน์.)

ฉันสามารถรับประวัติภายใต้ชื่อเก่าซึ่งหยุด ณ จุดที่มันถูกลบออกจากตำแหน่งเดิม:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

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

ฉันทำอะไรผิดหรือเปล่า? สำเนาเก่าของไฟล์และสำเนาใหม่มีความเหมือนกัน 98.8% (เปลี่ยน 2 บรรทัดจาก 166) ความเข้าใจของฉันคือ git ควรจะสามารถติดตามไฟล์ได้ในกรณีนี้เพราะมันอนุมานถึงการดำเนินการเปลี่ยนชื่อแทนที่จะเก็บไว้อย่างชัดเจนและไฟล์ก็คล้ายกันมากพอที่ฉันเชื่อว่ามันควรจะคิดว่ามันเหมือนกัน

มีอะไรที่ฉันสามารถแก้ไขได้หรือไม่?


เดา: มันใช้งานได้หรือไม่ถ้าคุณรันคำสั่งภายใน ~ / projects / แทนที่จะเป็น ~ / projects / system / runtime / src?
ดักลาส

ไม่ฉันได้รับผลลัพธ์เดียวกัน (โดยทั่วไปคอมไพล์ดูเหมือนจะค่อนข้างดีที่จะให้คุณอยู่ในโฟลเดอร์ใด ๆ ก็ตาม ... )

นั่นทำให้ฉันมีความคิดและฉันก็อัปเดตคำถามด้วยสิ่งที่ค้นพบ ขอบคุณสำหรับความคิดเห็น!

ฉันใช้ "tortoiseGit 1.5.8.0" ร่วมกับ "1.7.3.1.msysgit.0" บน mswindows เมื่อฉันเปลี่ยนชื่อ + คอมมิตไฟล์ใน explorer ฉันเห็นใน gui "status = Rename" ฉันไม่รู้มากพอเกี่ยวกับคอมมานด์ว่าจะทำอย่างไรใน commandline เพื่อตอบ "วิธีการทำ" แต่ tortoiseGit ทำบางอย่างให้ฉันซึ่งได้ผลตามที่คุณคาดไว้
k3b

3
นี่คือการหลอกลวงหรือไม่? stackoverflow.com/questions/2314652/…
cregox

คำตอบ:


120

โปรดลองใช้git log --followไฟล์ของคุณ ฉันเรียนรู้จากที่นี่เป็นไปได้ไหมที่จะย้าย / เปลี่ยนชื่อไฟล์ใน git และรักษาประวัติไว้


5
ถ้าคุณได้รับfatal: ambiguous argument 'file.txt': unknown revision or path not in the working treeลอง git log --follow - file.txt
nealmcb

28

ฉันเห็นการเปลี่ยนชื่อของฉันด้วยgit log -M --summary..


git log -M --summaryไม่ให้ข้อมูลการเปลี่ยนชื่อใด ๆ หากคุณเพียงแค่ดูประวัติของไฟล์บางไฟล์ที่ระบุเช่นด้วยอาร์กิวเมนต์ไฟล์
vinc17

17

ตอบคำถามของตัวเองเนื่องจากฉันจัดการเพื่อคลายข้อกังวลได้แล้วแม้ว่าจะยังไม่สามารถแก้ไขปัญหาได้อย่างตรงจุดก็ตาม ( git log --followยังไม่ได้ผลสำหรับฉัน)

ประการแรก--summaryบันทึกสำหรับการเปลี่ยนชื่อคอมมิตรวมdeleteบรรทัดที่มีชื่อเก่าของไฟล์ ดังนั้นหากสังเกตได้ง่ายคุณสามารถค้นหาชื่อเก่าและgit logจากที่นั่น

หากเป็นส่วนหนึ่งของคอมมิตขนาดใหญ่ดังนั้นจึงยากที่จะมองเห็น - และสถานการณ์นี้เป็นหนึ่งในความกังวลของฉัน - git blame -Cสามารถใช้กับชื่อใหม่ของไฟล์ในการแก้ไขภายหลังการเปลี่ยนชื่อครั้งแรก เส้นคงมาจากไฟล์ต้นฉบับ! - ดังนั้น git ควรค้นหาแหล่งที่มาและแสดงชื่อไฟล์เก่า (และคอมมิตแฮชเพื่อการวัดที่ดี) git logจากนั้นคุณสามารถเลือกเส้นทางที่มี

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


6
ฉันคิดว่าคุณต้องการตัวเลือก -M เพื่อแสดงการเปลี่ยนชื่อจริง ๆ แทนที่จะลบ / เพิ่ม
Adrian Cornish

1
เพิ่งมีปัญหาเดียวกันและสังเกตเห็นว่าไดเร็กทอรีการทำงานของคุณสร้างความแตกต่างgit log --follow .โดยที่ไดเร็กทอรีการทำงานเป็นตำแหน่งใหม่ไม่ทำงานในขณะที่git log --follow path/to/new/dirดำเนินการจากไดเร็กทอรีหลักทั่วไปของตำแหน่งเก่าและตำแหน่งใหม่ใช้งานได้
akraf

1
--followพารามิเตอร์ไม่ทำงาน แต่คุณต้องทำ:git log --follow -- ./path/to/file
ดรัมม์

ฉันเพิ่งมีปัญหาที่git -log filename.csหยุดการเคลื่อนไหวของไฟล์ (dir ปัจจุบันถูกตั้งค่าเป็นโฟลเดอร์ของไฟล์) อย่างไรก็ตามหน้าต่างประวัติ VS จะแสดงบันทึกการเปลี่ยนแปลงไฟล์ทั้งหมด นอกจากนี้ฉันยังเห็นไฟล์นั้นถูกย้ายด้วยเดสก์ท็อป Github แต่git log -10 --follow filename.csแสดงบันทึกก่อนย้ายคอมมิตด้วย
oleksa

12
git log --follow ./path/to/file

ฉันเชื่อว่านี่คือสิ่งที่คุณกำลังมองหา


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