Depois de converter com sucesso um repositório SVN em Git, agora tenho um repositório Git muito grande que quero dividir em vários repositórios menores e manter o histórico.
Então, alguém pode ajudar a quebrar um repo que pode ter a seguinte aparência:
MyHugeRepo/
.git/
DIR_A/
DIR_B/
DIR_1/
DIR_2/
Em dois repositórios semelhantes a este:
MyABRepo/
.git
DIR_A/
DIR_B/
My12Repo/
.git
DIR_1/
DIR_2/
Eu tentei seguir as instruções nesta pergunta anterior, mas realmente não se encaixa ao tentar colocar vários diretórios em um repositório separado (subdiretório Detach (mover) em repositório Git separado ).
git
split
repository
git-filter-branch
MikeM
fonte
fonte
Respostas:
Isso configurará o MyABRepo; você pode fazer o My12Repo da mesma forma, é claro.
Uma referência a .git / refs / original / refs / heads / master permanece. Você pode remover isso com:
Se tudo correr bem, você pode remover MyABRepo.tmp.
Se, por algum motivo, você receber um erro em relação a .git-rewrite, pode tentar o seguinte:
Isso criará e usará /tmp/git-rewrite.tmp como um diretório temporário, em vez de
.git-rewrite
. Naturalmente, você pode substituir qualquer caminho que desejar/tmp/git-rewrite.tmp
, desde que tenha permissão de gravação e o diretório ainda não exista.fonte
DIR_A
, por exemplo)?filter-branch
. Para quem não sabe, ele reescreve o histórico, portanto, se você planeja enviar o repo após ter feito isso, os hashes de commit serão diferentes agora e não funcionará.Você pode usar
git filter-branch --index-filter
comgit rm --cached
para excluir os diretórios indesejados de clones / cópias de seu repositório original.Por exemplo:
Você precisará deletar manualmente os branches ou tags desnecessários de cada repositório (por exemplo, se você tinha um branch feature-x-for-AB , então provavelmente deseja excluí-lo do repositório “12”).
fonte
:
não é um caractere de comentário no bash. Você deve usar em seu#
lugar.:
é um comando embutido tradicional ( também especificado no POSIX ). Ele está incluído no bash , mas não é um comentário. Eu o usei especificamente em preferência a#
porque nem todos os shells levam#
como introdutor de comentário em todos os contextos (por exemplo, zsh interativo sem a opção INTERACTIVE_COMMENTS habilitada). Usar:
torna todo o texto adequado para colar em qualquer shell interativo, bem como salvar em um arquivo de script.git remote rm origin
, que sempre parece retornar 1. Portanto, substituí&&
por por;
para esta linha.git remote add origin $TARGET; git push origin master
.O projeto git_split é um script simples que faz exatamente o que você está procurando. https://github.com/vangorra/git_split
Transforme os diretórios git em seus próprios repositórios em seu próprio local. Sem subárvore negócios engraçados. Este script pegará um diretório existente em seu repositório git e o transformará em um repositório independente próprio. Ao longo do caminho, ele copiará todo o histórico de alterações do diretório fornecido.
fonte
Aqui está um script ruby que fará isso. https://gist.github.com/4341033
fonte
Obrigado por suas respostas, mas acabei apenas copiando o repositório duas vezes e excluindo os arquivos que não queria de cada um. Vou usar o branch-filtro em uma data posterior para retirar todos os commits para os arquivos excluídos, uma vez que eles já têm versão controlada em outro lugar.
Isso funcionou para o que eu precisava.
EDIT: Claro, a mesma coisa foi feita no My12Repo contra o diretório A e B. Isso me deu dois repositórios com histórico idêntico até o ponto em que excluí os diretórios indesejados.
fonte