Переместить файл / каталог, но легко объединить изменения? - PullRequest
20 голосов
/ 16 ноября 2009

Я читал в различных часто задаваемых вопросах, что git явно не отслеживает переименования / перемещения, предпочитая искать идентичные (или в некоторых ситуациях похожие?) Файлы. Это здорово, но справится ли он с этой ситуацией: в удаленном репозитории друга появилась новая функция (i18n), включающая некоторые новые файлы на debian/po/*.po. У меня есть свой собственный форк этого проекта, и я хочу объединить эту функцию, но поместите файлы в po/*.po (я могу сделать это в виде двух коммитов, или как угодно). Я ожидаю, что удаленное хранилище продолжит получать обновления функции, и я хочу просто объединить / выбрать эти коммиты и применить их к файлам в моем новом местоположении. Может ли git сделать это, возможно, с каким-то отображением «эти файлы переместились сюда сейчас»? Или это больше боли, чем стоит, и я должен просто принять немного странный debian путь в моем репо?

Ответы [ 3 ]

45 голосов
/ 16 ноября 2009

используйте git mv и все будет AOK.

Почему бы просто не попробовать, а не спросить? Вы всегда можете легко сбросить в Git. :)

3 голосов
/ 18 июня 2011

В Git отсутствует механизм для указания того, что вы ожидаете путь переименования и обновления при выполнении различий между двумя проектами / ветвями и т. Д.

Существуют различные варианты переименования файла (например, -M и --patience), но они могут быть медленными.

Как уже говорилось, переименование пути не влияет на сам репозиторий, потому что это просто снимок вашего контента (BLOB-объектов) и структуры (узлов дерева). Если все, что вы сделали, это добавили дополнительный каталог верхнего уровня, то все деревья и BLOB-объекты ниже не изменились и не требуют дополнительного хранилища. Все, что вам нужно, это один узел дерева для вашего коммита и один узел дерева для нового tld. Смертельно просто. Git обрабатывает эту часть без проблем.

Только тогда, когда вы хотите сделать сравнение (и любые исправления), это имеет значение. Было бы неплохо иметь опцию -P, которая указывает, что вы ожидаете, что некоторые пути переименовываются, и, таким образом, diff легко справляется. Нехорошо видеть 200 удаленных файлов и 200 новых файлов; -)

Узнать, как добавить опцию -P, - это еще один из моих пунктов списка дел (надеюсь, у меня будет время).

2 голосов
/ 18 ноября 2009

Либо переименуйте файлы, используя mv, и вызовите git add --all, чтобы выполнить все операции удаления и добавить неотслеживаемые файлы (новые имена файлов). Без --all вы должны явно выполнять операции удаления и новые имена файлов отдельно. Также не используйте git add --update, так как это будет выполнять все операции удаления, но не добавит новые имена файлов.

Обратите внимание, что вы, вероятно, захотите выполнить эти операции в локальной ветке, чтобы вы не случайно push не отправили их в основную ветку вашего друга, или ваш друг не pull перевел их в свою основную ветку. 1009 *

...