Como posso mover um único diretório de um repositório git para um novo repositório, mantendo a história?
-
03-07-2019 - |
Pergunta
Eu herdei um repositório git que contém vários projetos em diretórios separados. Eu gostaria de dividir o repositório em novos repositórios individuais, um para cada projeto e, em seguida, tem o repositório mestre contêm os projetos como submódulos. Eu gostaria de fazer tudo isso mantendo o histórico de revisão dos projectos individuais, se possível.
Eu poderia clonar o repositório para cada projeto e remover todos os outros projectos de cada vez, mas há uma maneira melhor para evitar que a história clonado em cada novo repositório do projeto?
Solução
Você pode usar git filter-branch
para reescrever a história de um projeto. A partir da documentação:
Para reescrever o repositório para olhar como se foodir / tinha sido a sua raiz do projeto, e descartar todos os outros história:
git filter-branch --subdirectory-filter foodir -- --all
Faça várias cópias do seu repo, fazer isso para cada subdiretório que deseja dividir para fora, e você deve acabar com o que você está procurando.
Outras dicas
Para exportar uma pasta como um novo repositório que você precisa:
- Para clonar o repositório onde a pasta que deseja exportar é.
- Para criar um repositório vazio no seu provedor de hospedagem como GitHub, para armazenar a pasta exportada.
-
Abra a pasta do repositório clonado e execute este comando:
git subtree push --prefix=YourFolderNameToExport https://github.com/YourUserName/YourNewCleanRepoName master
O ponto de git é que a história é incorporada em cada commit por hashing o pai cometeu. Você pode "repetir" os commits (isto é, essencialmente, como funciona o SVN importador) em um novo repositório, e apenas mantendo cada sub-projeto. Isso, no entanto, iria destruir o significado da cometem hashes. Se você não tem nenhum problema com isso, então que assim seja.
No passado eu acabei clonado lo e segui em frente. Isso torna as coisas maiores, mas o espaço em disco é barato; meu tempo é caro.
Eu também não sei de nenhuma ferramenta para emendar um diretório. Eu suponho que você poderia git-log no diretório para encontrar todos os commits sobre ele, então repetir os commits com algo como git-fast-exportação?