Получение Git для подтверждения ранее перемещенных файлов

Я перемещал кучу файлов вручную, не задумываясь, и не могу найти способ получить git, чтобы распознать, что файлы просто перемещены, а не на самом деле разные файлы. Есть ли способ сделать это, кроме удаления старого и добавления нового (и, следовательно, потери истории), или повторного изменения всех изменений с помощью git -mv?

Ответы

Ответ 1

Я думаю, что это уже делается. Теперь я могу ошибаться, но я прочитал, что git отслеживает файлы на основе их содержимого, не основываясь на их позиции в файловой системе или на основе дельта/различий. В стеке я думаю, что это показывает, что файлы удаляются, а затем снова добавляются, но я думаю, что однажды пробовал это, и он все еще сохранил историю из-за вышеупомянутого способа, которым git отслеживает вещи.

Тем не менее, было бы полезно, если бы кто-то подтвердил, правильно я или нет. Извините, если я неправильно понял ваш вопрос.

Ответ 2

Чтобы git удалить файлы, которые были удалены или перемещены уже, просто введите

git add -u

Ответ 3

git не отслеживает историю отдельных файлов и не обрабатывает специальные движения и копии специально, то есть нет специальных метаданных, указывающих на то, что произошел переход или копия. Вместо этого каждый git commit представляет собой полный снимок рабочего дерева.

Если вы хотите видеть перемещения в git log, вы можете указать -M в дополнение к опции, в которой перечислены файлы, которые были изменены, например

git log --summary -M

git будет смотреть на соседние деревья в истории фиксации и выводить, если какие-либо файлы, перемещенные каждым фиксатором.

Чтобы найти копии, а также переименовать, вы можете использовать параметр -C, вы можете предоставить его дважды, чтобы сделать git более сложным для возможных источников копирования за счет некоторой производительности.

git log --summary -M -C -C

Обратите внимание, что поскольку git не сохраняет историю файлов (только историю фиксации), даже если вы сделали git rm и git mv файл, вы не потеряете историю. Все изменения в пути будут записываться и отображаться в git log.

Ответ 4

Чтобы лучше понять, почему Git делает обнаружение переименования вместо (более общего) явного переименования и как git log ограничение пути работает, вы можете прочитать прочитайте Linus конечный инструмент отслеживания контента blog post by Junio ​​C Hamano, сопровождающий Git (и ссылки в нем).