TortoiseGit: перемещение файлов в новую папку не распознается как перемещение

5164
Dries

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

Итак, что у меня есть эта структура:

repo_root/somefile.txt 

Что я хочу:

repo_root/new_folder/somefile.txt 

Конечно, «somefile.txt» представляет все файлы и папки, которые перемещаются.

6

2 ответа на вопрос

9
Yue Lin Ho

Помните одно: Git отслеживает только содержимое файла.

Из раздела « Перемещение файлов » в Pro Git book v2:

В отличие от многих других систем VCS, Git явно не отслеживает перемещение файлов. Если вы переименуете файл в Git, в Git не будет сохранено никаких метаданных, сообщающих, что вы переименовали файл. Тем не менее, Git довольно умен, чтобы выяснить это после факта

И перемещение и переименование - это то же самое в Git.

Итак, Git обнаруживает, что перемещение / переименование автоматически работает только при условии, что эти файлы не изменены .

Git делает эти вещи только при перемещении / переименовании файла:

  1. Отслеживаемый файл удаляется, git получает SHA-1 содержимого этого файла, предположим, что это значение abc.
  2. Добавлен файл без отслеживания, git вычисляет SHA-1 содержимого этого файла, предположим, что значение abcтоже.
  3. Если вы сделаете коммит в этот момент, git обнаружит, что они имеют одинаковое значение SHA-1, а затем обработает их как переименование.

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

Если вы действительно хотите, чтобы git отслеживал переименование / перемещение автоматически, вам нужно сделать :

Убедитесь, что вы НЕ изменяете файл (ы) и переименовываете / перемещаете файл (ы) только в одном коммите.


Если вы хотите изменить файл и переместить файл одновременно и хотите, чтобы git определял их как переименование / перемещение с помощью TortoiseGit, то в вашем случае:

  1. Щелкните правой кнопкой мыши по этому файлу и выберите TortoiseGit -> Rename...пункт контекстного меню.
  2. префикс new_folder\к имени файла, смотрите: enter image description here
  3. совершить

Примечание: вам нужно переименовывать файлы один за другим. Предположим, много работы. Так что лучше переименовывать только файлы.

Примечание 2: Если вы много изменяете файл, git не может понять, что это переименование / перемещение.

Отлично. Теперь это ** отличный ** ответ;) DavidPostill 8 лет назад 0
Не совсем точно. До определенной степени Git может обнаруживать ходы, даже если содержимое изменилось. Я читал где-то на SO, что вы можете изменить до 50% файла, и Git все равно обнаружит его как переименование, а некоторые параметры командной строки могут даже увеличить этот порог. Я не эксперт Git, но это то, что я знаю. Tsahi Asher 6 лет назад 0
0
Mike Gonzales

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

Кроме того, вы можете использовать git mv, если вы чувствуете себя в большей безопасности https://git-scm.com/docs/git-mv

Похожие вопросы