Чому git log може не відображати історію для переміщеного файлу, і що я можу з цим зробити?


91

Я перейменував пару файлів, використовуючи git mv, використовував git stash, швидко переглянув HEAD (не змінюючи його), а потім зробив, git stash popщоб повернути весь пакет знову. Мої ходи зникли зі списку комітів, тому я переробив їх за допомогою, git rmа повідомлення про коміт стверджувало, що git помітив, що перейменування було перейменуванням. Тож я більше про це не думав.

Але тепер, після фіксації, я не можу отримати історію переміщених файлів! Ось що говорить git про коммітований процес:

~/projects% git log --summary
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.h
 delete mode 100644 test/R_DebugUI_iOS.m
 create mode 100644 system/runtime/src/R_DebugUI_iOS.h
 create mode 100644 system/runtime/src/R_DebugUI_iOS.m

 <<snip older commits>>
 ~/projects%

Зараз я намагаюся отримати історію одного з цих переміщених файлів, тому я можу переглянути стару версію, але я не отримую нічого дуже корисного:

~/projects/system/runtime/src% git log --follow --find-copies-harder -M -C R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime
~/projects/system/runtime/src% 

(Я також пробував без -M, -Cі --find-copies-harder, але безрезультатно.)

Я можу отримати його історію під її старою назвою, яка зупиняється на тому етапі, коли вона була видалена зі свого старого місця:

~/projects% git log --summary --follow --find-copies-harder -M -C -- test/R_DebugUI_iOS.m
commit de6e9fa2179ae17ec35a5c368d246f19da27f93a
Author: brone
Date:   Wed Dec 8 22:37:54 2010 +0000

    Moved R_DebugUI into runtime

 delete mode 100644 test/R_DebugUI_iOS.m

commit 32a22d53c27e260714f759ecb3d3864e38b2e87f
Author: brone
Date:   Tue Dec 7 23:52:51 2010 +0000

    Can set debug UI's alpha.

<<snip older commits>>
~/projects%

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

Я щось роблю не так? Стара копія файлу та нова копія на 98,8% однакові (2 рядки із 166 змінено). Я розумію, що в цьому випадку git повинен мати можливість відстежувати файл, оскільки він передбачає перейменування операцій, а не зберігає їх явно, і файли досить схожі, що, на мою думку, вони повинні вважати їх однаковими.

Чи можу я щось зробити, щоб це виправити?


Здогадайтесь: чи працює це, якщо ви виконуєте команду всередині ~ / projects / замість ~ / projects / system / runtime / src?
Дуглас,

Ні, я отримую той самий результат. (Загалом, git здається досить хорошим, якщо дозволити вам бути в будь-якій папці ...)

Однак це дало мені уявлення, і я оновив питання своїми висновками. Дякую за коментар!

я використовую "tortoiseGit 1.5.8.0" разом із "1.7.3.1.msysgit.0" на mswindows. Коли я перейменовую + фіксую файл у провіднику, у своєму графічному інтерфейсі я бачу "status = Rename". Я недостатньо знаю про git, як це зробити в командному рядку, щоб відповісти "як це зробити", але tortoiseGit зробив для мене щось, що спрацювало так, як ти очікував.
k3b

Відповіді:



28

Ну, я бачу свої перейменування з git log -M --summary..


git log -M --summaryне дає жодної інформації про перейменування, якщо ви просто переглядаєте історію певного файлу, тобто за допомогою аргументу файлу.
vinc17

17

Відповідаючи на власне запитання, оскільки мені вдалося заспокоїти свої занепокоєння, навіть якщо я точно не вирішив свою проблему. ( git log --followвсе-таки мені не працює.)

По-перше, --summaryжурнал коміту перейменування включає deleteрядок із старою назвою файлу. Тож якщо це легко помітити, ви можете знайти його стару назву і git logзвідти.

Якщо це частина якогось великого коміту, і тому його трохи важче помітити - і ця ситуація була одним із моїх турбот - git blame -Cможна використовувати з новою назвою файлу при першій редакції після перейменування. Імовірно, рядки залишаються з вихідного файлу! - отже, git повинен знайти своє джерело та показати старе ім'я файлу (і хеш коміту на добру міру). Потім ви можете взяти стежку за допомогою git log.

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


6
Думаю, вам потрібна опція -M, щоб фактично показувати перейменування, а не видаляти / додавати
Адріан Корніш,

1
Тільки-но виникла та сама проблема, і я помітив, що у вашому робочому каталозі є різниця, git log --follow .де робочий каталог - нове розташування не працює, тоді як git log --follow path/to/new/dir, виконане із загального батьківського каталогу старого та нового розташування, працює
akraf

1
--followПараметр робить роботу, але вам потрібно зробити:git log --follow -- ./path/to/file
Drumm

У мене щойно виникла проблема, яка git -log filename.csзупиняється при фіксації руху файлу (поточний каталог встановлений у папку файлу). Однак у вікні історії VS відображається весь журнал змін файлів. Також я бачу, що файл переміщено за допомогою робочого столу Github. Але також git log -10 --follow filename.csвідображає журнал перед фіксацією переміщення.
oleksa

12
git log --follow ./path/to/file

Я вірю, що це те, що ви шукаєте.


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