Як git виявляє подібні файли для виявлення перейменування?


92

Вікіпедія пояснює автоматичне визначення перейменування:

Коротко кажучи, для файлу в версії N файл із однойменною версією N − 1 є його попередником за замовчуванням. Однак, коли в редакції N − 1 немає файлу з однаковим іменем, Git шукає файл, який існував лише у версії N − 1 і дуже схожий на новий файл.

Виявлення перейменування, очевидно, зводиться до подібного виявлення файлів. Цей алгоритм де-небудь задокументований? Було б непогано знати, які види перетворень виявляються автоматично.


Відповіді:


93

Git відстежує вміст файлів, а не імена файлів. Отже, перейменування файлу без зміни його вмісту легко виявити git. (Git не відслідковує, але виконує виявлення , використовуючи git mvабо git rmі git add. Фактично те ж саме)

Коли файл додається до сховища, ім’я файлу знаходиться в об’єкті дерева. Фактичний вміст файлу додається до сховища як двійковий великий об’єкт ( BLOB ). Git не додасть інший BLOB-файл для додаткових файлів, що містять той самий вміст. Насправді Git не може, оскільки вміст зберігається у файловій системі, перші два символи хешу - це ім'я каталогу, а решта - ім'я файлу в ньому. Отже, виявлення перейменувань - це питання порівняння хешів.

Для виявлення невеликих змін у перейменованому файлі Git використовує певні алгоритми та порогове обмеження, щоб побачити, чи це перейменування. Наприклад, подивіться на -Mпрапор для git diff. Існують також такі значення конфігурації, як merge.renameLimit(кількість файлів, які слід враховувати під час виявлення перейменування під час злиття).

Щоб зрозуміти, як git поводиться з подібними файлами (тобто, які перетворення файлів вважаються перейменуваннями), вивчіть доступні параметри конфігурації та прапори, як згадано вище. Вам не потрібно враховувати, як. Щоб зрозуміти, як git насправді виконує ці завдання, подивіться на алгоритми пошуку відмінностей у тексті та прочитайте вихідний код git.

Алгоритми застосовуються лише для цілей diff, merge та log - вони не впливають на те, як git їх зберігає. Будь-яка незначна зміна вмісту файлу означає, що до нього додано новий об’єкт. На цьому рівні не відбувається дельти або різниці. Звичайно, пізніше об’єкти можуть бути упаковані там, де дельти зберігаються у файлах пакунків, але це не пов’язано з виявленням перейменування.


58
"Вас не потрібно враховувати як". - Я думав, що це питання?
bain

2

Існує багато алгоритмів, які виявляють схожість між текстами, і системи контролю версій часто використовують їх вже для зберігання лише різниці між двома версіями. Такі інструменти, як WinMerge, досить розумні, щоб виявляти відмінності навіть у межах рядків, тому я не бачу причини, чому ці алгоритми не використовувались би для цього виявлення перейменування.

Ось дискусія про алгоритми виявлення подібних текстів . Деякі з цих алгоритмів можуть бути оптимізовані для природних мов, тоді як інші можуть працювати краще для вихідного коду, але по суті вони дуже схожі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.