Git разделить и очистить

Я знаю, что это необычно, но один из моих репозиториев git, который действует как репозиторий «собери все», становится слишком большим, и я хотел бы разделить его на две части, на repoA и repoB.

Я нашел один способ разделения в "разветвлении подкаталога репозитория на GitHub и превращении его в часть моего собственного репозитория", однако это говорит только о разделении, я хочу, чтобы история также была разделена, поэтому repoA будет содержать только историю repoA, а не repoB, и наоборот. В противном случае я получу два репозитория, но удвою размер из-за всей истории, которую он хранит.

ОБНОВЛЕНИЕ:

Благодаря тому, что @ElpieKay указал на git filter-branch (вместо git clean, которое я нашел при поиске с помощью «git purge»), я нашел это:

https://help.github.com/articles/splitting-a-subfolder-out-into-a-new-repository/

это именно то, что я искал. Однако есть еще один вопрос — как удалить repoA содержимое из repoB? То есть при разделении repoA мне нужно сделать только,

git filter-branch --prune-empty --subdirectory-filter sub1/sub2/sub3 master 

Итак, в repoB, как удалить sub1/sub2/sub3, сохранив при этом все остальное?

Более того, эта команда в приведенном выше документе,

 git remote set-url origin https://github.com/USERNAME/NEW-REPOSITORY-NAME.git

Когда я попробовал это, он только обновил URL-адрес fetch, а push все еще указывает на старый. Что мне не хватает?


person xpt    schedule 27.07.2017    source источник
comment
git filter-branch дважды. Один для удаления repoA из истории, а другой для удаления repoB. Будут созданы две переписанные истории.   -  person ElpieKay    schedule 27.07.2017
comment
Спасибо @ElpieKay, вопрос OP сужен.   -  person xpt    schedule 27.07.2017


Ответы (1)


Итак, в repoB, как удалить sub1/sub2/sub3, сохранив при этом все остальное?

Вы делаете индексный фильтр:

cd repoB
git filter-branch --prune-empty --index-filter \
  'git rm -r -f -q --ignore-unmatch --cached sub1/sub2/sub3' --tag-name-filter cat -- --all

Это удалит sub1/sub2/sub3 из repoA.

Вам понадобится git push --force для обновления репозитория основной ветки (и удаления этих папок из repoA)

person VonC    schedule 27.07.2017
comment
Спасибо @Von. Я попробовал это, а затем использовал git log --stat для двойной проверки. Однако в нем все еще есть записи журнала, относящиеся к изменениям в sub1/sub2/sub3, хотя в выводе журнала нет связанных файлов. Есть ли дополнительные параметры, которые мы можем добавить, чтобы полностью удалить все журналы git, связанные с sub1/sub2/sub3? Спасибо. - person xpt; 27.07.2017
comment
@xpt вы можете попробовать ту же команду, но с --prune-empty, то есть git filter-branch --prune-empty ... - person VonC; 27.07.2017
comment
Да! --prune-empty делает свое дело! Пожалуйста, обновите ответ, и я приму его следующим. - person xpt; 28.07.2017
comment
@xpt Я согласен. Я включил эту команду в ответ для большей наглядности. - person VonC; 04.08.2017