Uma solução seria gerar cada um dos repositórios separadamente com svn2git ou apenas git svn
(é uma pequena ferramenta que já foi construída no git), e então conectá-los com git filter-branch
.
- Clona cada repositório svn individualmente.
- No repositório que você quer ser root, adicione os outros repositórios como remotos e busque suas ramificações que você deseja mesclar para esse repositório (você receberá avisos já que as ramificações não têm histórico comum; isso é esperado). / li>
- Execute
git filter-branch
nesses novos ramos, usando um filtro de índice para gerar um novo subdiretório para eles. - Mesclar as ramificações filtradas em
master
(ou qualquer ramificação desejada) no repositório raiz. A história completa seria preservada.
O comando para o passo 3 seria algo como isto:
git filter-branch --index-filter '
git ls-files -s |
perl -pe "s{\t\"?}{$&newsubdir/}" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info &&
mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE
' HEAD
A mágica, e toda vez que eu tenho que fazer isso, parece um pouco mágica, é a declaração perl
. git filter-branch
está filtrando o índice a cada confirmação e prefixando todos os caminhos de blob (ou seja, alterando os caminhos de arquivo da árvore de trabalho) com 'newsubdir'. Você pode ter que experimentar para obter os caminhos exatamente certos. Algumas lições aprendidas de alguém que está percorreu este caminho antes:
-
Faz backup de tudo.
git filter-branch
é um histórico destrutivo. Depois de alterá-lo, você não poderá alterá-lo facilmente. Faça backup de todas as cópias do repositório que você está usando. Nada é pior do que terminar uma operação complexa e descobrir que você perdeu um/
no caminho. - Rotule tudo. A menos que você tenha alguma habilidade séria; você não vai conseguir acertar da primeira vez. Roteiro cada passo individual como você concluí-lo, de modo que a execução de qualquer um deles é fácil. Além disso, se você descobrir que uma semana depois você errou uma bandeira, você pode replicar em instantes.
-
Gaste R $ 20 em uma instância de computação de cluster no EC2.
git filter-branch
é extremamente intensivo em CPU. Um filtro de índice em um histórico profundo pode levar horas para ser executado em seu ambiente local, mas uma fração desse tempo em um cluster da AWS exemplo. Claro, eles custam um pouco mais de $ 2 por hora, mas você só vai precisa de um por algumas horas. Salve-se de dor e use os scripts que você escreveu em hardware que tornam a operação trivial. Custa o preço de um bom almoço.