Bagaimana git mendeteksi file serupa, untuk deteksi ganti namanya?

92

Wikipedia menjelaskan deteksi penggantian nama otomatis:

Singkatnya, file dalam revisi N, file dengan nama yang sama dalam revisi N − 1 adalah leluhur defaultnya. Akan tetapi, jika tidak ada file dengan nama yang mirip di revisi N − 1, Git mencari file yang hanya ada di revisi N − 1 dan sangat mirip dengan file baru.

Deteksi ganti nama tampaknya bermuara pada deteksi file serupa. Apakah algoritme itu didokumentasikan di mana saja? Alangkah baiknya mengetahui jenis transformasi apa yang terdeteksi secara otomatis.

mahemoff
sumber

Jawaban:

93

Git melacak konten file, bukan nama file. Jadi, mengganti nama file tanpa mengubah isinya mudah dideteksi oleh git. (Git tidak melacak, tetapi melakukan deteksi ; menggunakan git mvatau git rmdan git addsecara efektif sama.)

Ketika sebuah file ditambahkan ke repositori, nama file tersebut ada di objek pohon. Konten file sebenarnya ditambahkan sebagai objek besar biner ( blob ) di repositori. Git tidak akan menambahkan blob lain untuk file tambahan yang berisi konten yang sama. Nyatanya, Git tidak bisa karena isinya disimpan dalam sistem berkas dengan dua karakter pertama dari hash menjadi nama direktori dan sisanya adalah nama berkas di dalamnya. Jadi untuk mendeteksi penggantian nama adalah masalah membandingkan hash.

Untuk mendeteksi perubahan kecil pada file yang diganti namanya, Git menggunakan algoritme tertentu dan batas ambang untuk melihat apakah ini adalah penggantian nama. Misalnya, lihat -Mbendera untuk git diff. Ada juga nilai konfigurasi seperti merge.renameLimit(jumlah file yang perlu dipertimbangkan saat melakukan deteksi ganti nama selama penggabungan).

Untuk memahami bagaimana git memperlakukan file serupa (misalnya, transformasi file apa yang dianggap sebagai ganti nama), jelajahi opsi konfigurasi dan flag yang tersedia, seperti yang disebutkan di atas. Anda tidak perlu diperhatikan dengan caranya. Untuk memahami bagaimana git sebenarnya menyelesaikan tugas-tugas ini, lihat algoritme untuk menemukan perbedaan dalam teks, dan baca kode sumber git.

Algoritme diterapkan hanya untuk tujuan diff, merge, dan log - algoritme tidak memengaruhi cara git menyimpannya. Setiap perubahan kecil dalam konten file berarti objek baru ditambahkan untuknya. Tidak ada delta atau perbedaan yang terjadi di tingkat itu. Tentu saja, nanti, objek mungkin dikemas di mana delta disimpan dalam file paket, tapi itu tidak terkait dengan deteksi penggantian nama.

manojlds
sumber
59
"Kamu tidak perlu dipikirkan dengan bagaimana." - Saya pikir itu pertanyaannya?
bain
2

Ada banyak algoritme yang mendeteksi kemiripan antara teks, dan sistem kontrol versi sering menggunakan ini untuk hanya menyimpan perbedaan antara dua versi. Alat seperti WinMerge cukup pintar untuk mendeteksi perbedaan, bahkan dalam baris, jadi saya tidak melihat alasan mengapa algoritma ini tidak akan digunakan untuk deteksi penggantian nama ini.

Berikut adalah pembahasan tentang algoritma untuk mendeteksi teks serupa . Beberapa dari algoritma ini mungkin dioptimalkan untuk bahasa alami, sementara yang lain mungkin bekerja lebih baik untuk kode sumber, tetapi pada dasarnya mereka sangat mirip.

GolezTrol
sumber