Como usar o repositório Subversion dentro do repositório Git?


8

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?


À luz dos seus comentários abaixo, sua pergunta é / foi "posso fazer um check-out svn dentro de um repositório git?" - e a resposta simples é: sim. A resposta que você aceitou não responde a esta pergunta.
AD7six

Respostas:


13

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-svnferramenta. 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-svncheck-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.


1
Verifique para responder à pergunta: +1 para o dawg yo :)
Jonah

OK. A solução em que eu decidi é checkoutentrar na árvore do Git e excluir completamente a cópia de trabalho do SVN do repositório do Git .gitignore.
Jonah

Além de resumos sarcásticos de edição, a reputação existe para incentivar o bom comportamento e tornar o site um lugar melhor para todos; os comentários existem para destacar onde as melhorias podem ser feitas. Penso que com as suas edições a sua pergunta é muito mais útil, daí a reversão de uma seleção não útil para uma útil . Se eu não achasse que sua resposta se beneficiaria dos meus comentários, eu não os teria feito. Se eles fossem ofensivos para mim, eu teria sinalizado. Sendo assim, acho que todos nós nos beneficiamos com a melhoria das respostas. (Este comentário será auto-destruir em ...)
Mark Booth

Yo dawg, eu ouvi você gosta de svn, então eu coloquei svn em sua git, para que possa svn enquanto você git ...
Dave Arkell

O problema é que se o seu svn repo si contém externos, você pode esquecer usando git-svnporque não lidar com eles
Daniel Alder

3

Embora desanimado por Charles , acho que você realmente está procurando submódulos git :

O suporte ao sub-módulo do Git permite que um repositório contenha, como subdiretório, uma verificação de um projeto externo. Os submódulos mantêm sua própria identidade; o suporte ao submódulo apenas armazena o local do repositório do submódulo e confirma o ID, para que outros desenvolvedores que clonam o projeto que os contém ("superprojeto") possam facilmente clonar todos os submódulos na mesma revisão. É possível fazer checkouts parciais do superprojeto: você pode dizer ao Git para clonar nenhum, alguns ou todos os submódulos.

Embora Charles pareça pensar que os git submódulos são deficientes porque não podem funcionar como svn 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 entre gite svncomo qualquer outra coisa.

Dependendo de quando e onde você atualizou sua cópia de trabalho, os diretórios em diferentes pontos da svnhierarquia de diretórios de trabalho podem estar em diferentes revisões. Isso não é possível com git. Em gitsempre 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 gitparadigma 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 o svn submódulo manualmente e depois .gitignore.

  • Dada a maneira como svnfunciona, a maneira como os externos funcionam é perfeitamente aceitável.
  • Dada a maneira como gitfunciona, 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á.


2

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

$ mkdir ~/project
$ cd ~/project
$ git init
$ ...
$ git commit -va
[master (root-commit) xxxxxxx] Did something
 ...
$ mkdir vendors
$ cd vendors
$ svn checkout svnproject(url)
$ cd svnproject
$ ...
$ svn ci -m "committing to svnproject"

etc.

E depois gerencie svnprojectcomo faria normalmente. Obviamente, você pode usar git-svnpara interagir com seu svn repo usando os comandos git.

Você também pode fazer isso:

$ cd ~/projects
$ git add vendors/svnproject
$ git commit -m "adding svnproject source to main repo"

Nesse caso, as atualizações feitas nos arquivos svnprojectaparecerã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):

[andy@laptop:/tmp/gitproject/vendor/minify]$ vim README.txt 
[andy@laptop:/tmp/gitproject/vendor/minify]$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working     directory)
#
#   modified:   README.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[andy@laptop:/tmp/so/vendor/minify]$ svn status
M       README.txt
[andy@laptop:/tmp/so/vendor/minify]$

Se você costuma git-svninteragir com seu repositório dependente do svn, é possível mantê-lo sincronizado com as alterações que você fez no projeto pai git usando git-filter-branche, 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.


Acho que não quero que o Git rastreie a cópia de trabalho do SVN, porque isso seria redundante.
Jonah

Ele não vai, a menos que você adicioná-los explicitamente ao git repo Jonas
AD7six

1

O Git possui um wrapper svn. Aqui está um resumo rápido: Usando efetivamente o Git com o Subversion

Como muitas organizações que usam o Rails, pegamos a onda git e estamos em um estado de transição entre git e Subversion. Nosso trabalho de código aberto é armazenado em repositórios git, mas o trabalho de nosso cliente ainda é armazenado em repositórios do Subversion, e provavelmente será por algum tempo. Embora o git seja incrível, o Subversion ainda possui boas qualidades e é um excelente repositório centralizado, especialmente com seu ecossistema de ferramentas amigáveis.

A integração entre o git e o Subversion (git-svn) é tão bem feita que muitos de nós usamos o git como nossa interface para todos os nossos repositórios do Subversion. Fazer isso é bastante simples, mas existem alguns truques interessantes, então pensei em compartilhar um dia na vida do Viget com o git-svn ...


1
Eu encontrei esse link antes, mas parece ser sobre o uso do Git para gerenciar uma cópia de trabalho do Subversion. Quero colocar a cópia de trabalho do Subversion dentro de um repositório Git.
Jonah

você se importaria de explicar mais sobre o que faz e para que serve? "Respostas apenas para links" não são bem-vindas no Stack Exchange
gnat
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.