У мене є два файли index.htmlі template.html. Я переніс більшу частину index.htmlв, template.htmlі тепер git думає, що зробив перейменування, додавши обидва файли. Чи можна запобігти цьому в конкретних випадках?
У мене є два файли index.htmlі template.html. Я переніс більшу частину index.htmlв, template.htmlі тепер git думає, що зробив перейменування, додавши обидва файли. Чи можна запобігти цьому в конкретних випадках?
Відповіді:
Існує "прийнята" відповідь, але вона не дає жодних натяків на те, як відповісти на питання.
Правильна відповідь із git-log (1) та git-diff (1):
--no-renames
Turn off rename detection, even when the configuration
file gives the default to do so.
Git відстежує вміст , а не імена файлів. Як результат, якщо два файли мають суттєво подібний вміст, git подумає, що ви скопіювали або перейменували файл. Якщо ви прочитаєте git-log (1), то дізнаєтесь:
Індекс подібності - це відсоток незмінних рядків, а індекс несхожості - відсоток змінених рядків. Це округлене ціле число, за яким слідує знак відсотка. Таким чином, значення індексу схожості 100% зарезервовано для двох рівних файлів, тоді як 100% несхожість означає, що жоден рядок зі старого файлу не потрапив у новий.
Отже, припускаючи, що ваш індекс подібності становить 100%, git подумає, що це копія. Найкраще додати розумне повідомлення журналу або примітку (докладніше про це див. Git-notes (1)), щоб пояснити, що відбувається, якщо ви не вважаєте, що git робить правильно.
Ви також можете спробувати відкоригувати значення, які використовує git для розгляду чогось як копії чи перейменування. У посібнику для git-log (1) сказано:
-M[<n>], --find-renames[=<n>]
If generating diffs, detect and report renames for each commit. For
following files across renames while traversing history, see --follow. If
n is specified, it is a threshold on the similarity index (i.e. amount
of addition/deletions compared to the file’s size). For example, -M90%
means git should consider a delete/add pair to be a rename if more than
90% of the file hasn’t changed.
-C[<n>], --find-copies[=<n>]
Detect copies as well as renames. See also --find-copies-harder.
If n is specified, it has the same meaning as for -M<n>.
Знову ж таки, це не допоможе вам, якщо файли в основному схожі, але ви, безсумнівно, можете використовувати ці значення, щоб налаштувати, наскільки схожими вони повинні бути, щоб їх можна було вважати копіями або перейменованими. Ваш пробіг може відрізнятися.
Якщо ви знаходитесь у момент безпосередньо перед комітом, і "вам погано, що git збожеволів", тоді просто скасуйте додавання неоднозначного файлу, який git вважав перейменованим, виконайте коміт, а потім додайте неоднозначний файл ще раз і виконайте коміт:
git reset ambiguous_file_git_thought_you_renamed
git commit
git add ambiguous_file_git_thought_you_renamed
git commit
Це спрацювало для мене.
Подвійна перевірка не перейменовувалась:
git diff --name-status -C HEAD^^ HEAD
M ambiguous_file_git_thought_you_renamed
M original_file
"М" на початку означає модифікований, "R" означає Перейменований. Зверніть увагу, що тут не існує перейменованого.
git commitпотрібно другому мати --amendпрапор, щоб включити зміну до того самого коміту? Я додав прапор, і це спрацювало для мене, щоб обійти виявлення перейменування.
Щоб обійти git, думаючи, що це перейменування в коміті "one".
git commit --amend--editя бачу, що, на його думку, відбувається в (нових) коментарях у повідомленні коміту.