Estou desenvolvendo um projeto no Git. A TI depende de outro projeto, que está em um repositório Subversion. Eu gostaria de poder fazer alterações no projeto do Subversion na árvore e me comprometer com / atualizar a partir do repositório do Subversion de dentro do projeto Git. Isso é possível?
8
Respostas:
Eu não posso ser o único a pensar no meme de itens aninhados do Xzibit , certo? De qualquer forma...
Uma das outras coisas legais que o Subversion faz é chamada de "externas". É uma maneira de apontar para um ramo ou diretório específico em outro repositório svn. Você pode até fixá-lo a uma versão específica de um diretório específico. Os externos são realmente bacanas e resolveriam esse problema em um instante, pois as alterações feitas em um diretório externo são automaticamente enviadas de volta à fonte ao realizar uma confirmação.
Externals também é algo que falta no git. O Git possui submódulos , mas eles não funcionam da mesma maneira, pois estão vinculados a um commit específico. Isso significa efetivamente que não há solução nativa para o problema de ter repositórios "aninhados" que podem ser lidos e gravados ao mesmo tempo e permanecem perfeitamente sincronizados, não menos repositórios aninhados usando back-end diferentes.
Se você não quiser fazer a revisão de submódulo fixando a dança , há outra solução alternativa.
O Git possui emulação de svn decente na
git-svn
ferramenta. Você provavelmente já está usando. A pergunta SO "Como mantenho um svn: external atualizado usando git-svn?" nos oferece uma opção útil ao abusar dessa ferramenta.A resposta aceita foi simplesmente usar o
git-svn
check-out do repositório do Subversion fora da árvore controlada pelo git , usando simplesmente um link simbólico para apontá-lo para dentro da árvore. Há um pouco mais de trabalho manual envolvido neste, pois você precisará se lembrar de confirmar esse repositório específico toda vez que fizer uma alteração nele. No entanto, é simples, é direto e é conhecido por funcionar.Outra opção inteiramente estaria olhando do Mercurial subrepositories , que podem acomodar tanto git e SVN. Não tenho certeza se você realmente quer ir três níveis de profundidade.
fonte
checkout
entrar na árvore do Git e excluir completamente a cópia de trabalho do SVN do repositório do Git.gitignore
.git-svn
porque não lidar com elesEmbora desanimado por Charles , acho que você realmente está procurando submódulos git :
Embora Charles pareça pensar que os
git
submódulos são deficientes porque não podem funcionar comosvn
externos (referenciando o cabeçalho de um ramo em vez de uma revisão específica), acho que isso se deve principalmente à diferença no fluxo de trabalho esperado entregit
esvn
como qualquer outra coisa.Dependendo de quando e onde você atualizou sua cópia de trabalho, os diretórios em diferentes pontos da
svn
hierarquia de diretórios de trabalho podem estar em diferentes revisões. Isso não é possível comgit
. Emgit
sempre que você atualizar para uma revisão, você atualizar toda a sua cópia de trabalho para a revisão - você espera que quando você vai para 123abc revisão que você vai ter exatamente o mesmo código como a última vez que você check-out 123abc, e isso inclui qualquer e todos os submódulos que a revisão possa ter.Se você deseja atualizar um submódulo , é necessário atualizá-lo e, em seguida, faça uma nova confirmação no super-módulo para atualizá-lo para usar a nova revisão no submódulo . Isso significa que os submódulos são menos flexíveis que os externos , mas reforça o
git
paradigma primário de um instantâneo amplo do repositório.Se você deseja que os
svn
externos sempre usem a funcionalidade de revisão mais recente , estará praticamente sozinho. Como mencionado, você só precisa verificar osvn
submódulo manualmente e depois.gitignore
.svn
funciona, a maneira como os externos funcionam é perfeitamente aceitável.git
funciona, o modo como os submódulos funcionam é perfeitamente aceitável.Aliás, até onde eu entendi, os sub-repositórios Mercurial funcionam da mesma maneira que os sub-módulos Git , então isso também não ajudará.
fonte
Você está procurando
git-svn
? Por depende, você quer dizer que a versão pai está em svn ou tem fornecedores que são projetos svn?Assumindo por depende, você quer dizer dependência:
Você pode colocar qualquer tipo de repositório dentro de um repositório git sem problemas. por exemplo
etc.
E depois gerencie
svnproject
como faria normalmente. Obviamente, você pode usargit-svn
para interagir com seu svn repo usando os comandos git.Você também pode fazer isso:
Nesse caso, as atualizações feitas nos arquivos
svnproject
aparecerão como svn e git diffs. Um exemplo em que/tmp/gitproject
é um projeto .. git e/tmp/gitproject/vendor/minify
é um svn checkout (aleatório):Se você costuma
git-svn
interagir com seu repositório dependente do svn, é possível mantê-lo sincronizado com as alterações que você fez no projeto pai git usandogit-filter-branch
e, portanto, não precisa se comprometer com cada repositório individualmente.Como um aparte: da experiência de manter um projeto git e svn sincronizado é geralmente bastante problemático, a menos que um ou outro seja somente leitura.
fonte
O Git possui um wrapper svn. Aqui está um resumo rápido: Usando efetivamente o Git com o Subversion
fonte