Mengapa git log tidak menampilkan riwayat file yang dipindahkan, dan apa yang dapat saya lakukan?

91

Saya telah mengganti nama beberapa file menggunakan git mv, used git stash, melihat sekilas HEAD (tanpa mengubahnya) lalu melakukannya git stash popuntuk mendapatkan semuanya kembali. Perpindahan saya telah menghilang dari daftar komit, jadi saya mengulanginya git rmdan pesan komit mengklaim bahwa git telah melihat penggantian nama adalah ganti nama. Jadi saya tidak memikirkannya lagi.

Tapi sekarang, pasca-komit, saya tidak bisa melihat riwayat file yang dipindahkan! Inilah yang dikatakan git tentang komit yang dimaksud:

~/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%

Sekarang saya mencoba mendapatkan riwayat dari salah satu file yang dipindahkan ini, sehingga saya dapat melihat versi lama, tetapi saya tidak mendapatkan sesuatu yang sangat berguna:

~/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% 

(Saya juga mencobanya tanpa -M, -Cdan --find-copies-harder, tetapi tidak berhasil.)

Saya bisa mendapatkan sejarahnya dengan nama lamanya, yang berhenti pada titik itu dihapus dari lokasi lamanya:

~/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%

Jadi saya tidak sepenuhnya terjebak kali ini, tetapi saya tidak akan suka melakukan hal semacam ini sepanjang waktu. (Saya mengantisipasi memiliki cukup banyak file yang akan dipindahkan setidaknya sekali dalam hidup mereka.)

Apakah saya melakukan sesuatu yang salah? Salinan lama file dan salinan baru 98,8% sama (2 baris dari 166 diubah). Pemahaman saya adalah bahwa git harus dapat melacak file dalam kasus ini, karena ini menyimpulkan operasi ganti nama daripada menyimpannya secara eksplisit, dan file tersebut cukup mirip sehingga saya yakin harus menganggapnya sama.

Apakah ada yang bisa saya lakukan untuk memperbaikinya?


sumber
Tebak: Apakah ini berfungsi jika Anda menjalankan perintah di dalam ~ / projects / daripada ~ / projects / system / runtime / src?
Douglas
Tidak, saya mendapatkan hasil yang sama. (Secara umum, git tampaknya cukup bagus tentang membiarkan Anda berada di folder mana pun ...)
Itu memberi saya ide, dan saya memperbarui pertanyaan dengan temuan saya. Terima kasih atas komentarnya!
saya menggunakan "tortoiseGit 1.5.8.0" bersama dengan "1.7.3.1.msysgit.0" di mswindows. Ketika saya mengganti nama + melakukan file di explorer saya melihat di gui saya "status = Ganti nama". Saya tidak cukup tahu tentang git bagaimana melakukan ini dalam baris perintah untuk menjawab "bagaimana melakukan itu" tetapi tortoiseGit melakukan sesuatu untuk saya yang berfungsi seperti yang Anda harapkan.
k3b
3
Apakah ini penipu? stackoverflow.com/questions/2314652/…
cregox

Jawaban:

28

Yah, saya melihat penggantian nama saya dengan git log -M --summary..

pengguna502515
sumber
git log -M --summarytidak memberikan informasi penggantian nama jika Anda hanya melihat riwayat dari beberapa file yang diberikan, yaitu dengan argumen file.
vinc17
17

Menjawab pertanyaan saya sendiri, karena saya telah berhasil meredakan kekhawatiran saya, meskipun saya belum menyelesaikan masalah saya dengan tepat. (Namun, git log --followtetap tidak berhasil untuk saya.)

Pertama, --summarylog untuk perubahan nama komit menyertakan deletebaris dengan nama lama file. Jadi jika mudah dikenali, Anda bisa menemukan nama lamanya dan git logdari sana.

Jika itu bagian dari beberapa komit besar, dan karena itu sedikit lebih sulit untuk dikenali - dan situasi ini adalah salah satu kekhawatiran saya - git blame -Cdapat digunakan dengan nama baru file pada revisi pasca-ganti nama pertama. Agaknya garis tetap dari file aslinya! - jadi git harus menemukan sumbernya, dan menampilkan nama file lama (dan hash komit untuk ukuran yang baik). Anda kemudian dapat melanjutkan perjalanan dengan git log.

Jadi, jika Anda memiliki minat pada sejarah file sebagai unit (untuk alasan apa pun) maka sepertinya itu dapat dilakukan dengan relatif mudah. Meskipun saya mendapat kesan git lebih suka Anda menggunakannya dengan benar.


sumber
6
Saya pikir Anda memerlukan opsi -M untuk benar-benar menampilkan ganti nama daripada hapus / tambahkan
Adrian Cornish
1
Baru saja mengalami masalah yang sama dan perhatikan bahwa direktori kerja Anda membuat perbedaan di git log --follow .mana direktori kerja adalah lokasi baru tidak berfungsi, sementara git log --follow path/to/new/dir, dijalankan dari direktori induk umum dari lokasi lama dan baru, berfungsi
akraf
1
The --followparameter tidak bekerja, tetapi Anda perlu melakukan:git log --follow -- ./path/to/file
Drumm
Saya baru saja mendapat masalah yang git -log filename.csberhenti pada komit gerakan file (dir saat ini diatur ke folder file). Namun jendela riwayat VS menunjukkan seluruh log perubahan file. Saya juga dapat melihat file tersebut telah dipindahkan dengan desktop Github. Tapi git log -10 --follow filename.csmenunjukkan log sebelum pindah komit juga.
oleksa
12
git log --follow ./path/to/file

Saya yakin inilah yang Anda cari.

janetkuo
sumber
3
Jawaban dari lima tahun sebelumnya memiliki informasi ini.
dotancohen