После успешного преобразования репозитория SVN в Git у меня теперь есть очень большой репозиторий Git, который я хочу разбить на несколько меньших репозиториев и сохранить историю.
Итак, может ли кто-нибудь помочь с разрывом репо, которое может выглядеть так:
MyHugeRepo/
.git/
DIR_A/
DIR_B/
DIR_1/
DIR_2/
В два репозитория, которые выглядят так:
MyABRepo/
.git
DIR_A/
DIR_B/
My12Repo/
.git
DIR_1/
DIR_2/
Я пробовал следовать указаниям в этом предыдущем вопросе, но это действительно не подходит при попытке поместить несколько каталогов в отдельное репо ( подкаталог Detach (move) в отдельный репозиторий Git ).
Ответы:
Это настроит MyABRepo; вы, конечно, можете сделать My12Repo аналогичным образом.
Ссылка на .git / refs / original / refs / Heads / master остается. Вы можете удалить это с помощью:
Если все прошло хорошо, вы можете удалить MyABRepo.tmp.
Если по какой-то причине вы получаете сообщение об ошибке .git-rewrite, вы можете попробовать следующее:
Это создаст и будет использовать /tmp/git-rewrite.tmp в качестве временного каталога вместо
.git-rewrite
. Естественно, вы можете заменить любой путь, который хотите/tmp/git-rewrite.tmp
, при условии, что у вас есть разрешение на запись, а каталог еще не существует.источник
DIR_A
, как)?filter-branch
. Для тех, кто не в курсе, он переписывает историю, поэтому, если вы планируете отправить репо после того, как это сделаете, хэши фиксации теперь будут другими, и это не сработает.Вы можете использовать
git filter-branch --index-filter
с,git rm --cached
чтобы удалить ненужные каталоги из клонов / копий вашего исходного репозитория.Например:
Вам нужно будет вручную удалить ненужные ветки или теги каждого репозитория (например, если у вас есть ветка feature-x-for-AB , вы, вероятно, захотите удалить ее из репозитория «12»).
источник
:
не является символом комментария в bash.#
Вместо этого вы должны использовать .:
- это традиционная встроенная команда ( также указанная в POSIX ). Он включен в bash , но не является комментарием. Я специально использовал его вместо этого,#
потому что не все оболочки используются#
в качестве средства представления комментариев во всех контекстах (например, интерактивный zsh без включенной опции INTERACTIVE_COMMENTS). Использование:
делает весь текст пригодным для вставки в любую интерактивную оболочку, а также для сохранения в файле сценария.git remote rm origin
, который всегда кажется , что возвращение 1. Поэтому я заменил&&
на;
эту строку.git remote add origin $TARGET; git push origin master
.Проект git_split - это простой скрипт, который делает именно то, что вы ищете. https://github.com/vangorra/git_split
Превратите каталоги git в их собственные репозитории в их собственном местоположении. Нет поддерева забавного дела. Этот сценарий возьмет существующий каталог в вашем репозитории git и превратит этот каталог в независимый репозиторий. Попутно он скопирует всю историю изменений для указанного вами каталога.
источник
Вот сценарий Ruby, который это сделает. https://gist.github.com/4341033
источник
Спасибо за ответы, но в итоге я просто дважды скопировал репозиторий, а затем удалил файлы, которые мне не нужны. Я собираюсь использовать ветвь filter позже, чтобы удалить все коммиты для удаленных файлов, поскольку они уже контролируются версией где-то еще.
Это сработало для того, что мне было нужно.
РЕДАКТИРОВАТЬ: Конечно, то же самое было сделано в My12Repo для каталогов A и B. Это дало мне два репозитория с идентичной историей до того момента, когда я удалил ненужные каталоги.
источник