Как мне аккуратно разделить Git-репозиторий? - PullRequest
2 голосов
/ 20 августа 2010

Этот вопрос взял меня с пути, но я все еще что-то упускаю.

У меня есть однопользовательский репозиторий (поэтому нет проблем с переписыванием истории против push / pull) где я вместе разработал код продукта, код поддержки и документы.

После года или около того я наконец-то увидел свет и хочу разделить репо на две части.Вот что я попробовал:

  1. Создать две новые директории под корнем проекта;давайте назовем их Project / Code / и Project / Support /
  2. git mv все материалы кода в Code /
  3. git mv все вещи поддержки в Support /
  4. copy иизмените .gitignore соответствующим образом
  5. передайте все

Теперь, когда я запускаю то, что мне показалось правильной командой:

git filter-branch -d /cygdrive/z/temp/ --subdirectory-filter Code/ -- --all

Я просто получаю отдельную ветку содин коммит, моя оригинальная ветвь все еще там (как original/refs/head/brent), а все остальные ветки такие же, как были.

Что мне действительно нужно, так это что-то, чтобы переписать историю, как если бы каталог Code / был «всегда»там ", и поддержка / материал не был, и наоборот для другой стороны.

Я относительный Git Noob, поэтому я уверен, что я пропустил некоторые важные концепции - пожалуйста, заполнитеменя в.


ОК, я сделал это, и, кажется, делает то, что мне нужно, очень хорошо, за что большое спасибо.У меня есть пара дополнений:

  1. Я добавил -r, чтобы разрешить удаление полных каталогов.Это правильно?Фактическая команда, которую я использовал, была:

    git filter-branch --index-filter \
    'git rm -r --cached --ignore-unmatch' \
    - --all

  2. В хранилище теперь примерно в два раза больше коммитов, чем я ожидал.Они появляются в gitk как связанные с такими именами, как «original / refs /heads / TestSys».

Я предполагаю, что это исходное дерево коммитов;как мне от них избавиться?Они не отображаются в fsck, и ни prune, ни gc --aggressive не избавляются от них.


О-о, просто прочитайте прекрасное руководство;собираюсь попробовать git clone, чтобы обрезать флот.


Хорошо, теперь я сделал клон, и хранилище сократилось до его первоначального размера.Казалось, что клон копировал только информацию о ветвях для текущего (репо-источника) HEAD, и мне пришлось вручную настроить другие ветки с помощью этого:

for n in `git branch -r|grep -v 'HEAD'` ; do git branch ${n/origin?/} $n ; done 

Есть ли простой способ сделать это во время клонирования??

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

Есть ли простой способустранить это?

Очень благодарен за вашу помощь и терпение.

1 Ответ

3 голосов
/ 20 августа 2010

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

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <list of files that shouldnt be here>' -- --all
...