Блог « Confluence, мерзотник, перейменування, злиття про мій ... » додає деяку цікаву інформацію , яка ілюструє Робі «сек відповідь (upvoted):
При спробі виявити перейменування git розрізняє точні та неточні перейменування за допомогою:
- перший - перейменування без зміни вмісту файлу та
- остання - перейменування, яке може включати зміни у вмісті файлу (наприклад, перейменування / переміщення класу Java).
Ця різниця важлива, оскільки алгоритм виявлення точних перейменувань є лінійним і завжди буде виконуватися, тоді як алгоритм виявлення неточного перейменування є квадратичним ( O(n^2)
), а git не намагається це зробити, якщо кількість файлів, що змінюються, перевищує певний поріг (1000 на за замовчуванням).
Якщо явно не встановлено, merge.renameLimit
за замовчуванням становить 1000 файлів або використовує значення diff.renameLimit
if, якщо встановлено. Впливає , і в той час як ставиться до спроб злиття ( , ) тільки.
diff.renameLimit
git diff
git show
git log
merge.renameLimit
git merge
git cherry-pick
Це гарна ідея змінити на merge.renameLimit
відміну від зміни diff.renameLimit
так, щоб git не намагався знаходити перейменування під час загальних операцій, таких як перегляд git diff
вихідних даних.
Щоб показати перейменування, команди, як git show
або git log
можуть бути використані з -M
опцією, яка вмикає виявлення перейменування.
Лінус згадує :
Так, ядро у мене є
[diff]
renamelimit=0
повністю вимкнути ліміт, оскільки ліміт за замовчуванням справді дуже низький. Git досить добре розпізнає перейменування.
Однак причина низького значення за замовчуванням полягає не в тому, що він недостатньо швидкий - це тому, що він може в кінцевому підсумку зайняти багато пам'яті (і якщо у вас мало пам'яті, обмін буде означати, що він переходить із "досить швидко" "повільний, як патока" - але він все одно не буде обмежений процесором, він просто підкачує, як божевільний).
too many files skipping inexact rename detection
.