хирургия мерзавца - разбиение одного хранилища на множество хранилищ - PullRequest
3 голосов
/ 12 января 2011

У меня есть существующий репозиторий git:

my-repo/
  .git/
  foo/
    foo-content-goes-here
  bar/
    bar-content-goes-here

Я хочу получить следующие структуры репозитория:

my-foo-repo/
  .git/
  foo-content-goes-here

my-bar-repo/
  .git
  bar-content-goes-here

Я смотрел на Отделить (переместить) подкаталогв отдельный репозиторий Git .Это почти делает то, что мне нужно.

Я выполнил следующие команды:

$ cd path/to/my-repo/../
$ git clone --no-hardlinks my-repo foo-repo
$ cd foo-repo
$ git remote rm origin
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
      --prune-empty -- --all
$ git reset --hard
$ git gc --aggressive
$ git prune

Я говорю, что это почти работает.Отмеченные проблемы:

  1. Шаг git gc --aggressive занимает более 2 часов для моего хранилища.У меня есть 13 репозиториев, которые нужно извлечь из моего текущего единственного репозитория.Я могу написать сценарий этого процесса, но был бы признателен за любые способы ускорить его?
  2. git log и gitk покажите мне ожидаемые коммиты для нового foo-repo. gitX показывает мне ожидаемые коммиты, а также отключенное дерево со старой историей.Размер каталога foo-repo намного больше, чем я ожидал, так что, вероятно, у меня остались некоторые вещи, которые нужно очистить.Я не уверен, как избавиться от этого материала?Нужно ли вообще избавляться от нее перед нажатием?

1 Ответ

3 голосов
/ 12 января 2011

Вы можете попробовать это наоборот: отфильтровать нужный каталог в рабочей ветке на исходном рабочем месте, а затем отправить только эту ветку в новый репозиторий.

$ cd /path/to/global-repo

$ git branch work-foo master
$ git filter-branch --tag-name-filter cat --subdirectory-filter foo \
      --prune-empty work-foo

$ cd /path/to
$ mkdir foo-repo
$ cd foo-repo
$ git init
$ git pull /path/to/global-repo work-foo

Вы делаете не хотите использовать --all для filter-branch, если вы идете по этому пути.

...