Comecei um projeto há alguns meses e armazenei tudo em um diretório principal. No meu diretório principal "Project", existem vários subdiretórios contendo coisas diferentes: Project / paper contém um documento escrito em LaTeX Project / sourcecode / RailsApp contains my app rails.
"Projeto" é GITified e tem havido muitos commits nos diretórios "paper" e "RailsApp". Agora, como gostaria de usar cruisecontrol.rb para meu "RailsApp", gostaria de saber se há uma maneira de fazer um submódulo fora de "RailsApp" sem perder o histórico.
git
git-submodules
Cœur
fonte
fonte
Respostas:
Hoje em dia há uma maneira muito mais fácil de fazer isso do que manualmente usando git filter-branch: git subtree
Instalação
NOTE
git-subtree
agora faz partegit
(se você instalar o contrib) a partir de 1.7.11, então você pode já tê-lo instalado. Você pode verificar executandogit subtree
.Para instalar git-subtree da fonte (para versões anteriores do git):
Ou se você quiser as páginas de manual e tudo
Uso
Divida um maior em pedaços menores:
Para documentação detalhada (página man), por favor leia
git-subtree.txt
.fonte
git rm -rf ./foo
removefoo
a partirHEAD
, mas não filtramy-project
's história completa. Então,git submodule add [email protected]:my-user/new-project.git foo
só fazfoo
um submódulo a partir deHEAD
. Nesse aspecto, o scriptfilter-branch
é superior, pois permite "fazer como se subdir fosse um submódulo desde o início"Verifique o git filter-branch .
A
Examples
seção da página do manual mostra como extrair um subdiretório em seu próprio projeto, mantendo todo o seu histórico e descartando o histórico de outros arquivos / diretórios (exatamente o que você está procurando).fonte
Uma maneira de fazer isso é o inverso - remova tudo, exceto o arquivo que deseja manter.
Basicamente, faça uma cópia do repositório e use
git filter-branch
para remover tudo, exceto os arquivos / pastas que deseja manter.Por exemplo, tenho um projeto do qual desejo extrair o arquivo
tvnamer.py
para um novo repositório:Isso costuma
git filter-branch --tree-filter
passar por cada confirmação, executar o comando e confirmar novamente o conteúdo do diretório resultante. Isso é extremamente destrutivo (então você só deve fazer isso em uma cópia do seu repositório!), E pode demorar um pouco (cerca de 1 minuto em um repositório com 300 commits e cerca de 20 arquivos)O comando acima apenas executa o seguinte script de shell em cada revisão, que você teria que modificar, é claro (para excluí-lo do seu subdiretório em vez de
tvnamer.py
):O maior problema óbvio é que ele deixa todas as mensagens de commit, mesmo que não estejam relacionadas ao arquivo restante. O script git-remove-empty-commits corrige isso ..
Você precisa usar o
-f
argumento force executadofilter-branch
novamente com qualquer coisa emrefs/original/
(que basicamente é um backup)Claro que isso nunca será perfeito, por exemplo, se suas mensagens de commit mencionarem outros arquivos, mas é o mais próximo que um git atual permite (pelo menos pelo que eu sei).
Novamente, apenas execute isso em uma cópia do seu repositório! - mas em resumo, para remover todos os arquivos, exceto "thisismyfilename.txt":
fonte
git filter-branch
tem (hoje em dia?) uma opção embutida para remover commits vazios, a saber--prune-empty
. Um guia melhorgit filter-branch
está nas respostas a esta pergunta: stackoverflow.com/questions/359424/…Ambos CoolAJ86 e apenwarr respostas são muito semelhantes. Eu fui para frente e para trás entre os dois tentando entender partes que estavam faltando em qualquer um. Abaixo está uma combinação deles.
Primeiro, navegue no Git Bash até a raiz do repositório git a ser dividido. No meu exemplo aqui, isso é
~/Documents/OriginalRepo (master)
Abaixo está uma cópia de acima com os nomes personalizáveis substituídos e usando https. A pasta raiz é agora
~/Documents/_Shawn/UnityProjects/SoProject (master)
fonte
Se você deseja transferir algum subconjunto de arquivos para um novo repositório, mas manter o histórico, basicamente acabará com um histórico completamente novo. A maneira como isso funcionaria é basicamente a seguinte:
Deve ser um tanto simples automatizar isso se você não se importar em escrever um script pequeno, mas complicado. Simples, sim, mas também doloroso. As pessoas já reescreveram a história no Git no passado, você pode fazer uma busca por isso.
Alternativamente: clone o repositório e exclua o papel do clone, exclua o aplicativo do original. Isso levaria um minuto, é garantido que funcione, e você pode voltar a coisas mais importantes do que tentar purificar seu histórico do git. E não se preocupe com o espaço do disco rígido ocupado por cópias redundantes da história.
fonte