Eu herdei um repositório git contendo vários projetos em diretórios separados. Gostaria de dividir o repositório em novos repositórios individuais, um para cada projeto e, em seguida, fazer com que o repositório principal contenha os projetos como submódulos. Eu gostaria de fazer tudo isso enquanto mantenho o histórico de revisão dos projetos individuais, se possível.
Eu poderia clonar o repositório para cada projeto e remover todos os outros projetos a cada vez, mas existe uma maneira melhor de evitar ter o histórico clonado em cada novo repositório de projeto?
git
git-submodules
cidra
fonte
fonte
Respostas:
Você pode usar
git filter-branch
para reescrever a história de um projeto. Da documentação:Faça várias cópias de seu repo, faça isso para cada subdiretório que deseja dividir e você deve terminar com o que está procurando.
fonte
--subdirectory-filter
várias vezes. EGgit filter-branch --subdirectory-filter foodir --subdirectory-filter bardir
, etc.--subdirectory
não leva vários diretórios, mas pode ser especificado várias vezes.foodir
projeto original, não reescrever seu histórico, apenasgit rm -r foodir
deve ser suficiente (isso também excluirá a cópia da sua árvore de trabalho; se você não quiser, use--cached
). Se você quiser removê-lo inteiramente do histórico (respondendo à pergunta de @ilius também), você quer algo comogit filter-branch --index-filter 'git rm -r --cached --ignore-unmatched foodir' -- --all
--index-filter
solução é mais rápida do que o--tree-filter
, como não precisa realmente fazer o check-out dos arquivos, ele pode apenas manipular o índice diretamente. No--tree-filter
entanto, isso pode ser um pouco mais fácil de usar, já que você pode usar operações comuns do sistema de arquivos em vez de ter que trabalhar com operações de manipulação de índice.Para exportar uma pasta como um novo repositório, você precisa:
Abra a pasta do repositório clonado e execute este comando:
fonte
git subtree
não está disponível como pacote Cygwin. Se você precisar: stackoverflow.com/a/27116828/2484903O ponto do git é que o histórico é incorporado em cada commit por hash no commit pai. Você pode "repetir" os commits (é essencialmente assim que o svn-importer funciona) em um novo repositório e apenas mantendo cada subprojeto. Isso, no entanto, destruiria o significado dos hashes de confirmação. Se você não tem nenhum problema com isso, então que seja.
No passado, eu apenas clonava e seguia em frente. Isso torna as coisas maiores, mas o espaço em disco é barato; meu tempo é caro.
Também não conheço nenhuma ferramenta para dividir um diretório. Suponho que você poderia fazer o git-log no diretório para encontrar todos os commits nele e depois reproduzir os commits com algo como git-fast-export?
fonte