Как перенести несколько папок по разным путям из одного git хранилища в другое? - PullRequest
0 голосов
/ 21 февраля 2020

Допустим, у нас есть Repo-A и Repo-B. У меня есть структура папок в Repo-A следующим образом:

Repo-A /Folder-1 
       /Folder-2
       /Folder-3

Я хочу перенести Folder-1 и Folder-2 в Repo-B. Я понимаю, что могу перенести один каталог, используя метод, приведенный здесь - Как переместить файлы из одного git репо в другой (не клон), сохранив историю Так что я делаю это с Folder-1, однако когда я делаю то же самое снова для переноса второй папки, я получаю дублирующие коммиты, некоторые коммиты, которые влияли как на Folder-1, так и Folder-2 в прошлом. Как я могу решить эту проблему?

Я также попытался поместить все файлы, которые хочу перенести, в одну конкретную папку, но при переносе этой папки я теряю историю коммитов.

1 Ответ

1 голос
/ 21 февраля 2020

Похоже, вы хотите одну историю, содержащую все изменения файлов в двух папках. Вы не можете сделать это с --directory-filter, но вы все равно можете использовать filter-branch с --index-filter.

git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch -- :/:* :/!:Folder-1 :/!:Folder-2` --prune-empty -- --all

Использование git rm в качестве index-filter создает новый коммит из каждого оригинала Коммит, загружая исходный коммит в индекс, удаляя некоторые файлы и фиксируя новый индекс.

Каждый из параметров :/!:... говорит git rm не удалять именованную папку и ее содержимое, и :/:* приказывает удалить все остальное.

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

Вышеуказанные файлы сохраняются в их исходных каталогах. Если вы хотите что-то другое, вам может потребоваться использовать --tree-filter вместо --index-filter. Эта опция значительно медленнее (особенно если репо велико), но проще вносить более сложные изменения (потому что сценарий фильтра просто должен работать с файлами на диске, а не напрямую преобразовывать индекс).

Тем не менее, с недавних пор в документации не рекомендуется использовать filter-branch. Я еще не знаком с инструментом, который они предлагают вместо этого.

Итак, вот filter-branch документы, из которых вы можете либо следовать предупреждению и найти другой инструмент, либо узнать больше о вышеописанной процедуре: https://git-scm.com/docs/git-filter-branch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...