Як я можу перешкодити git думати, що я перейменував


79

У мене є два файли index.htmlі template.html. Я переніс більшу частину index.htmlв, template.htmlі тепер git думає, що зробив перейменування, додавши обидва файли. Чи можна запобігти цьому в конкретних випадках?


25
Git насправді не зберігає той факт, що він вважає, що ви перейменували. Фактична база даних об’єктів зберігає лише повні знімки вашого проекту, і немає поняття diff / перейменування / переміщення. Той факт, що Git каже, що ви перейменували файл, походить від пост-аналізу бази даних.
Jacob Groundwater

5
@JacobGroundwater О, я розумію, так що це просто не має значення. Дякую. :)
Kit Sunde

Відповіді:


22

Існує "прийнята" відповідь, але вона не дає жодних натяків на те, як відповісти на питання.

Правильна відповідь із git-log (1) та git-diff (1):

   --no-renames
       Turn off rename detection, even when the configuration
       file gives the default to do so.

4
Хоча це буде працювати в деяких випадках використання, оригінальне оригінальне запитання було: "Чи можна запобігти цьому [виявленню перейменування] в конкретних випадках?" Прапор, який ви використовуєте, вимикає його скрізь, коли знаходиться в ~ / .gitconfig , або протягом усього поточного запуску, коли знаходиться в командному рядку. Навіть предмети з індексом подібності> = 99% не будуть розглядатися як перейменування, що, як правило, не очікується людьми і може порушити принцип найменшого здивування. Тим не менше, існують випадки використання прапора, інакше він не існував би. Дякуємо, що вказали на це тут!
Тодд А. Джейкобс,

64

Чому Git думає, що ваші файли - це копії

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>.

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


5
Я хотів би лише зазначити, що ця відповідь є набагато кориснішою та описовішою, ніж будь-яка з відповідей на інше питання
Кайл Кочіс,

1
Цей двоступеневий процес перед комітом буде працювати: git reset неоднозначний файл, git commit, git add неоднозначний файл, git commit.
Василь Муса

21

Якщо ви знаходитесь у момент безпосередньо перед комітом, і "вам погано, що 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" означає Перейменований. Зверніть увагу, що тут не існує перейменованого.


3
Чи git commitпотрібно другому мати --amendпрапор, щоб включити зміну до того самого коміту? Я додав прапор, і це спрацювало для мене, щоб обійти виявлення перейменування.
BillyBBone

1
Якщо вони опиняться в одному коміті, то в якийсь момент щось вирішить, що вони були перейменовані. Єдиний спосіб по-справжньому запобігти цьому - назавжди тримати їх в окремих комітах.
Miral

0

Якщо ви змінили файли A, B та C; і видалений файл D, E і F; є ймовірність, що git вважає, що D перейменовано на A, або щось подібне.

Найпростішим рішенням є розділення модифікацій та видалень файлів на два коміти.


-1

Щоб обійти git, думаючи, що це перейменування в коміті "one".

  1. Створіть і внесіть зміни, які не викликають помилкового перейменування
  2. Поетапно залиште файли, які змусили git думати, що він був перейменований та зафіксований git commit --amend

1
Це не працює. Він все ще вважає, що я відредагував один із файлів. За допомогою --editя бачу, що, на його думку, відбувається в (нових) коментарях у повідомленні коміту.
іконоборців
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.