Original Article: Subtree merge as an alternative to submodules with git svn
Author: Aaron Gustafson

Subtree se fundem como uma alternativa aos submódulos com git svn

Nós usamos Subversão como o nosso sistema de controle de versão para todo o trabalho do cliente aqui no Easy porque adoramos absolutamente Serviço de subversão hospedado de Springloops, mas usamos Git para todos os nossos projetos de código aberto porque, bem, o Git é muito mais divertido de trabalhar e amamos a comunidade construída em torno de Github. Para ter o melhor dos dois mundos ao trabalhar em projetos de clientes, usamos git-svn como nosso front-end para o Subversion. É uma ótima ferramenta, mas não é sem suas limitações. Uma dessas limitações é a incapacidade de traduzir Git submodules em svn:externals. Felizmente, o Git oferece uma alternativa que é comparável e joga bem com o Subversion: the subtree merge.

Ao tentar dcommit um repositório Git contendo um submódulo, você provavelmente receberá uma mensagem como esta:

952bee47201e87b0b0e851bcbe6c8940d429cda0 doesn’t exist in the repository at /usr/local/git/libexec/git-core/git-svn line 3787 Failed to read object 952bee47201e87b0b0e851bcbe6c8940d429cda0 at /usr/local/git/libexec/git-core/git-svn line 480

Essa mensagem irritante é o lembrete doloroso de que você precisa encontrar outra maneira de adicionar conteúdo de outro projeto ao seu repositório. Subtree se fundem no resgate!

Se você já bateu o erro, vá em frente e exclua a (s) pasta (s) do submódulo e o arquivo .gitmodules e cometer as alterações em seu repositório para tornar o caminho disponível novamente. Em seguida, a partir de um shell na raiz do seu repositório Git, insira esses comandos no prompt (substituindo as frases em maiúsculas com suas informações relevantes):

  1. git remote add -f LOCAL_NAME PATH/TO/GIT/REPOSITORY
  2. git merge -s ours --no-commit LOCAL_NAME/BRANCH_NAME
  3. git read-tree --prefix=PATH/I/WANT/IT/IN/ -u LOCAL_NAME/BRANCH_NAME
  4. git commit -m "Merge of PROJECT"
  5. git pull -s subtree LOCAL_NAME master

Para fornecer um exemplo totalmente detalhado para você, usei o seguinte para mesclar o ramo principal do eCSStender no caminho vendedores / ecsstender dentro de outro projeto.

  1. git remote add -f eCSStender git://github.com/easy-designs/eCSStender.js.git
  2. git merge -s ours --no-commit eCSStender/master
  3. git read-tree --prefix=vendors/ecsstender/ -u eCSStender/master
  4. git commit -m "Merge of eCSStender into the vendors directory"
  5. git pull -s subtree eCSStender master

A beleza disso é que você pode usar essa última linha para puxar a versão mais recente do projeto externo e então tudo que você precisa fazer é dcommit as mudanças para levá-los ao Subversion. Problema resolvido.