Git, yeniden adlandırma algılaması için benzer dosyaları nasıl algılar?


92

Wikipedia otomatik yeniden adlandırma algılamasını açıklıyor:

Kısaca, revizyon N'deki bir dosya verildiğinde, revizyon N − 1'deki aynı ada sahip bir dosya varsayılan atasıdır. Bununla birlikte, revizyon N-1'de benzer adlandırılmış dosya yoksa Git, yalnızca revizyon N − 1'de var olan ve yeni dosyaya çok benzeyen bir dosyayı arar .

Algılamayı yeniden adlandır, görünüşe göre benzer dosya algılamasına indirgeniyor. Bu algoritma herhangi bir yerde belgelendi mi? Hangi tür dönüşümlerin otomatik olarak algılandığını bilmek güzel olurdu.


Yanıtlar:


93

Git dosya adlarını değil dosya içeriğini izler. Bu nedenle, içeriğini değiştirmeden bir dosyayı yeniden adlandırmak git'in algılaması kolaydır. (Git izlemez, ancak algılama gerçekleştirir ; git mvveya kullanarak git rmve git addetkin olarak aynıdır.)

Depoya bir dosya eklendiğinde, dosya adı ağaç nesnesindedir. Gerçek dosya içerikleri , depoya ikili büyük nesne ( blob ) olarak eklenir . Git, aynı içeriği içeren ek dosyalar için başka bir blob eklemeyecektir. Aslında, içerik dosya sisteminde saklandığı için, hash'in ilk iki karakteri dizin adı ve geri kalanı içindeki dosyanın adı olduğu için Git olamaz. Dolayısıyla, yeniden adları tespit etmek, karmaları karşılaştırmaktan geçer.

Yeniden adlandırılmış bir dosyadaki küçük değişiklikleri tespit etmek için Git, bunun bir yeniden adlandırma olup olmadığını görmek için belirli algoritmalar ve bir eşik sınırı kullanır. Örneğin, -Mbayrağına bir göz atın git diff. merge.renameLimit(Birleştirme sırasında yeniden adlandırma algılaması gerçekleştirirken dikkate alınacak dosya sayısı) gibi yapılandırma değerleri de vardır .

Git'in benzer dosyalara nasıl davrandığını anlamak için (yani, hangi dosya dönüşümlerinin yeniden ad olarak kabul edildiğini) anlamak için , yukarıda belirtildiği gibi yapılandırma seçeneklerini ve mevcut bayrakları inceleyin. Nasıl olduğunu bilmenize gerek yok. Git'in bu görevleri gerçekte nasıl gerçekleştirdiğini anlamak için, metindeki farklılıkları bulmaya yönelik algoritmalara bakın ve git kaynak kodunu okuyun.

Algoritmalar yalnızca fark, birleştirme ve günlük amaçları için uygulanır - git'in bunları saklama şeklini etkilemezler. Dosya içeriğindeki herhangi bir küçük değişiklik, onun için yeni bir nesnenin eklendiği anlamına gelir. Bu seviyede herhangi bir delta veya fark yoktur. Elbette, daha sonra nesneler deltaların paket dosyalarında depolandığı yerde paketlenebilir, ancak bu yeniden adlandırma algılamasıyla ilgili değildir.


59
"Nasıl olduğunu bilmenize gerek yok." - Sorunun bu olduğunu sanıyordum?
bain

2

Metinler arasındaki benzerlikleri algılayan birçok algoritma vardır ve sürüm kontrol sistemleri genellikle bunları yalnızca iki sürüm arasındaki farkı depolamak için kullanır. WinMerge gibi araçlar, satırlar içinde bile farklılıkları algılayacak kadar akıllıdır, bu yüzden bu algoritmaların bu yeniden adlandırma tespiti için kullanılmaması için bir neden göremiyorum.

İşte benzer metinleri tespit etmek için algoritmalar hakkında bir tartışma . Bu algoritmalardan bazıları doğal diller için optimize edilebilirken, diğerleri kaynak kodu için daha iyi çalışabilir, ancak özünde birbirine çok benziyorlar.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.