Как я могу переместить один каталог из репозитория git в новый, сохранив историю? - PullRequest
109 голосов
/ 01 мая 2009

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

Я мог бы клонировать хранилище для каждого проекта и каждый раз удалять все другие проекты, но есть ли лучший способ избежать клонированной истории в каждом новом хранилище проекта?

Ответы [ 3 ]

98 голосов
/ 01 мая 2009

Вы можете использовать git filter-branch, чтобы переписать историю проекта. Из документации:

Переписать репозиторий, чтобы он выглядел как если foodir / был корнем проекта, и откажитесь от всей другой истории:

git filter-branch --subdirectory-filter foodir -- --all

Сделайте несколько копий своего репо, сделайте это для каждого подкаталога, который вы хотите выделить, и вы должны получить то, что ищете.

3 голосов
/ 27 ноября 2016

Чтобы экспортировать папку как новый репозиторий, вам нужно:

  1. Для клонирования хранилища, в котором находится папка, которую вы хотите экспортировать.
  2. Чтобы создать пустой репозиторий на вашем хостинг-провайдере как GitHub, чтобы сохранить экспортированную папку.
  3. Откройте клонированную папку репозитория и выполните эту команду:

    git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
    
1 голос
/ 01 мая 2009

Суть git заключается в том, что история включается в каждый коммит путем хеширования родительского коммита. Вы можете «воспроизвести» коммиты (по сути, так работает svn-импортер) в новый репозиторий и сохранить только каждый подпроект. Это, однако, разрушило бы значение хэшей коммитов. Если у вас нет проблем с этим, пусть будет так.

В прошлом я просто клонировал его и пошел дальше. Это делает вещи больше, но дисковое пространство дешевое; мое время дорого.

Я также не знаю каких-либо инструментов для склейки каталога. Я полагаю, что вы можете выполнить git-log в каталоге, чтобы найти все коммиты в нем, а затем воспроизвести коммиты, например, git-fast-export?

...