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.
Jawaban:
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 mv
ataugit rm
dangit add
secara 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
-M
bendera untukgit diff
. Ada juga nilai konfigurasi sepertimerge.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.
sumber
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.
sumber