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):
git remote add -f LOCAL_NAME PATH/TO/GIT/REPOSITORY
git merge -s ours --no-commit LOCAL_NAME/BRANCH_NAME
git read-tree --prefix=PATH/I/WANT/IT/IN/ -u LOCAL_NAME/BRANCH_NAME
git commit -m "Merge of PROJECT"
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.
git remote add -f eCSStender git://github.com/easy-designs/eCSStender.js.git
git merge -s ours --no-commit eCSStender/master
git read-tree --prefix=vendors/ecsstender/ -u eCSStender/master
git commit -m "Merge of eCSStender into the vendors directory"
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.