Venho fazendo todo o meu trabalho no Git e pressionando para o GitHub. Fiquei muito feliz com o software e o site, e não quero mudar minhas práticas de trabalho neste momento.
Meu orientador de doutorado está pedindo a todos os alunos que mantenham seu trabalho em um repositório SVN hospedado na universidade. Eu encontrei toneladas de documentação e tutoriais sobre como baixar um repositório SVN existente no Git, mas nada sobre enviar um repositório Git para um repositório SVN novo. Espero que haja alguma maneira de fazer isso com uma combinação de git-svn e um novo ramo, rebasing e todos esses termos maravilhosos, mas sou um novato no Git e não me sinto confiante com nenhum deles.
Desejo então executar apenas alguns comandos para enviar confirmações ao repositório SVN quando eu escolher. Desejo continuar usando o Git e ter apenas o espelho do repositório SVN que está no Git.
Serei a única pessoa que se comprometerá com o SVN, se isso fizer alguma diferença.
Respostas:
Eu também precisava disso, e com a ajuda da resposta de Bombe + algumas brincadeiras, consegui que funcionasse. Aqui está a receita:
Importar Git -> Subversion
Após o nº 3, você receberá uma mensagem enigmática como esta:
Apenas ignore isso.
Quando você executa o número 5, pode ter conflitos. Resolva-os adicionando arquivos com o estado "não imerso" e retomando a rebase. Eventualmente, você estará pronto; sincronize novamente com o repositório SVN, usando
dcommit
. Isso é tudo.Mantendo repositórios sincronizados
Agora você pode sincronizar do SVN para o Git, usando os seguintes comandos:
E para sincronizar do Git para o SVN, use:
Nota final
Você pode tentar isso em uma cópia local, antes de aplicar em um repositório ativo. Você pode fazer uma cópia do seu repositório Git para um local temporário; basta usar
cp -r
, pois todos os dados estão no próprio repositório. Em seguida, você pode configurar um repositório de teste baseado em arquivo usando:E verifique uma cópia de trabalho usando:
Isso permitirá que você brinque com as coisas antes de fazer alterações duradouras.
Adendo: Se você errar
git svn init
Se você executar acidentalmente
git svn init
com o URL errado e não for inteligente o suficiente para fazer um backup do seu trabalho (não pergunte ...), não poderá simplesmente executar o mesmo comando novamente. No entanto, você pode desfazer as alterações emitindo:E remova a seção de
[svn-remote "svn"]
seção.Você pode executar
git svn init
novamente.fonte
Veja como o fizemos funcionar:
Clone seu repositório Git em algum lugar da sua máquina.
Abra .git / config e adicione o seguinte (em Mantendo um espelho SVN somente leitura de um repositório Git ):
Agora, em uma janela do console, digite:
Agora, se ele quebrar aqui por qualquer motivo, digite estas três linhas:
E, finalmente, você pode se comprometer com o SVN:
Nota: Eu sempre rasco essa pasta depois.
fonte
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.Usar
git rebase
diretamente perderá o primeiro commit. O Git trata diferente e não pode refazê-lo.Existe um procedimento que preservará o histórico completo: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
Vou transcrever a solução aqui, mas os créditos são para Björn.
Inicialize o git-svn:
O --prefix fornece ramificações de rastreamento remoto como "svn / trunk", o que é legal porque você não recebe nomes ambíguos se chamar a ramificação local apenas como "trunk". E
-s
é um atalho para o layout padrão de troncos / tags / ramos.Busque o material inicial do SVN:
Agora, procure o hash do seu commit raiz (deve mostrar um único commit):
Em seguida, obtenha o hash do tronco vazio commit:
Crie o enxerto:
Agora, o "gitk" deve aparecer
svn/trunk
como o primeiro commit no qual sua ramificação principal se baseia.Tornar o enxerto permanente:
Solte o enxerto:
O gitk ainda deve aparecer
svn/trunk
na ancestralidade do mestre.Linearize seu histórico sobre o tronco:
E agora "git svn dcommit -n" deve lhe dizer que ele irá se comprometer com o tronco.
fonte
Crie um novo diretório no repositório Subversion para o seu projeto.
Mude para o seu projeto gerenciado pelo Git e inicialize o git-svn.
Isso criará uma única confirmação porque o diretório do projeto SVN ainda está vazio. Agora, refaça tudo o que foi confirmado
git svn dcommit
e você deverá concluir. Isso vai atrapalhar seriamente suas datas de confirmação.fonte
Git -> SVN com histórico completo de consolidação
Eu tinha um projeto Git e tive que movê-lo para o SVN. Foi assim que eu fiz, mantendo todo o histórico de confirmação. A única coisa que se perde é o tempo de confirmação original, já que o libSVN definirá o horário local quando o fizermos
git svn dcommit
.Como:
Tenha um repositório SVN para o qual queremos importar nossas coisas e cloná-lo com git-svn:
Vá ali:
Adicione o controle remoto do repositório Git (neste exemplo, estou usando C: /Projects/repo.git ). Você deseja enviar para o SVN e dar o nome old-git:
Busque as informações da ramificação principal do repositório git antigo para o repositório atual:
Faça o checkout da ramificação principal do controle remoto antigo-git em uma nova ramificação chamada antiga no repositório atual:
Rebase para colocar o HEAD em cima do old-git / master. Isso manterá todos os seus commits. O que isso faz basicamente é pegar todo o seu trabalho realizado no Git e colocá-lo em cima do trabalho que você está acessando no SVN.
Agora volte ao seu ramo principal:
E você pode ver que possui um histórico de consolidação limpo. É isso que você deseja enviar para o SVN.
Envie seu trabalho para o SVN:
Isso é tudo. É muito limpo, sem hackers, e tudo funciona perfeitamente fora da caixa. Aproveitar.
fonte
git svn
preparações são necessárias.Eu proporia uma instrução muito curta em 4 comandos usando SubGit . Veja este post para detalhes.
fonte
Eu precisava comprometer meu repositório Git existente em um repositório SVN vazio.
Foi assim que consegui fazer isso:
Funcionou sem problemas. Espero que isso ajude alguém.
Como tive que me autorizar com um nome de usuário diferente para o repositório SVN (meu
origin
uso de autenticação de chave pública / privada), tive que usar a--username
propriedadefonte
git-svn
antes isso é possível, ver stackoverflow.com/questions/527037/git-svn-not-a-git-commandSe você quiser continuar trabalhando com o Git como seu repositório principal e apenas precisar "exportar" as revisões para o SVN de tempos em tempos, poderá usar o Tailor para manter o repositório SVN sincronizado. Ele pode copiar revisões entre diferentes sistemas de controle de origem e atualiza o SVN com as alterações feitas no Git.
Eu não tentei uma conversão de Git para SVN, mas para um exemplo de SVN -> SVN, veja esta resposta .
fonte
Mais uma sequência que funcionou (com alguns comentários em cada etapa):
Instalar
git-svn
esubversion
kits de ferramentas:Mudar dentro do
PROJECT_FOLDER
Crie o caminho do projeto no servidor Subversion (infelizmente o
git-svn
plugin atual tem um defeito em comparação com o TortoiseSVN). Não é possível armazenar o código-fonte diretamente noPROJECT_FOLDER
. Em vez disso, por padrão, ele fará o upload de todo o códigoPROJECT_FOLDER/trunk
.svn mkdir --parents protocol: /// caminho / para / repo / PROJECT_FOLDER / trunk -m "criando espaço reservado para o repositório git"
Este é o local onde
trunk
no final do caminho é obrigatórioInicialize o
git-svn
contexto do plug - in dentro da.git
pastaEste é o lugar onde
trunk
no final do caminho é desnecessárioBuscar uma
Subversion
informação de repositório vaziaEsta etapa está ajudando a sincronizar o servidor Subversion com o
git-svn
plug - in. É o momento em que ogit-svn
plug-in estabelece oremotes/origin
caminho e o associa àtrunk
subpasta no lado do servidor.O rebase de confirmações antigas do Git aconteceu antes do
git-svn
envolvimento do plug-in no processo (esta etapa é opcional )Adicione arquivos novos / modificados para confirmar (esta etapa é regular para atividades do Git e é opcional )
Confirme arquivos adicionados recentemente no repositório Git local (esta etapa é opcional e só é aplicável se a etapa 7 tiver sido usada):
Enviando todo o histórico de alterações do projeto para o servidor Subversion:
fonte
Você pode criar um novo repositório SVN. Exporte seu projeto Git (detalhando os arquivos .git). Adicione-o ao repositório SVN (inicializando o repositório com o que você tinha até agora no Git). Em seguida, use as instruções para importar repositórios SVN em um novo projeto Git.
Mas isso perderá seu histórico anterior do Git.
fonte
Se você não precisar usar nenhum SVN específico e estiver usando o GitHub, poderá usar o conector SVN.
Mais informações estão aqui: Colaborando no GitHub com Subversion
fonte
Gostaria de compartilhar uma ótima ferramenta que está sendo usada na comunidade WordPress chamada Scatter
Plugins do Git WordPress e um pouco de dispersão da sanidade
Isso permite que os usuários possam enviar seu repositório Git para o wordpress.org SVN automaticamente. Em teoria, esse código pode ser aplicado a qualquer repositório SVN.
fonte
Recentemente, tive que migrar vários repositórios Git para o SVN e, depois de tentar todas as soluções que pude encontrar, o que finalmente funcionou para mim foi o Mercurial (sim, usando um terceiro VCS). Usando este guia , criei o seguinte processo (no Linux, mas a idéia básica também deve funcionar no Windows).
Os pacotes necessários:
O Mercurial precisa ser configurado adicionando o seguinte a
~/.hgrc
:Crie alguns diretórios de trabalho temporários (eu tinha vários repositórios para migrar, então criei diretórios para as versões SVN e Git, para mantê-los separados):
Faça um repositório SVN local vazio:
Clone o repositório Git existente:
Deixe o Mercurial fazer a sua coisa:
Agora, o repositório SVN deve conter o histórico completo de consolidação, mas não com registros de data e hora originais. Se isso não for um problema, pule a próxima parte para a etapa 11.
Com um pouco de trabalho, a data e hora de cada confirmação podem ser alteradas . Como meus repositórios são pequenos, era possível fazê-lo manualmente. Primeiro, crie um
pre-revprop-change
gancho no repositório SVN com o seguinte conteúdo, para permitir que a propriedade necessária seja modificada:Este script deve ser tornado executável:
O Mercurial criou uma cópia de trabalho do repositório SVN, chamada projeto -wc, portanto, alterne para ele e edite os tempos de confirmação:
Digite a data e a hora corretas (preste atenção aos fusos horários!) E salve. Você deve receber uma mensagem dizendo "Definir novo valor para a propriedade svn: date na revisão 1".
Agora, enxágue e repita para todas as outras revisões.
Opcionalmente, verifique o histórico de confirmação para garantir que tudo esteja correto:
Volte um nível acima:
Despejar o repositório:
E carregue o dump no seu servidor Subversion. Feito!
Esse processo provavelmente também funcionaria diretamente entre repositórios remotos, mas achei mais fácil trabalhar com repositórios locais. Corrigir os tempos de consolidação foi muito trabalhoso, mas no geral o processo foi muito mais direto do que qualquer outro método que encontrei.
fonte
existem três métodos:
rebase: como as outras respostas
commit id: encontre svn primeiro commit id e git primeiro commit id, faça eco em .git / info / grafts:
echo "git_id svn_id}" > .git/info/grafts
thengit svn dcommit
confira cada commit do git, copie os arquivos para svn_repo, svn commit
demonstração do bash: demonstração do github
v1.x: use rebase e confirme o ID
v2.x: use arquivos de cópia e, em seguida, svn commit
fonte
No meu caso, tive que iniciar um projeto limpo do SVN
adicione todas as fontes do seu projeto ...
fonte
Eu só quero compartilhar um pouco da minha experiência com a resposta aceita. Eu fiz todas as etapas e tudo estava bem antes de executar a última etapa:
Encontrei o thread https://github.com/nirvdrum/svn2git/issues/50 e, finalmente, a solução que apliquei no arquivo a seguir na linha 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm
Eu troquei
com
Isso corrigiu meu problema.
fonte
E se você não quiser comprometer todos os commit que fizer no Git, no repositório SVN? E se você apenas quiser enviar seletivamente confirmações pelo canal? Bem, eu tenho uma solução melhor.
Eu mantenho um repositório Git local onde tudo o que faço é buscar e mesclar no SVN. Dessa forma, posso garantir que estou incluindo todas as mesmas alterações que o SVN, mas mantenho meu histórico de consolidação separado do SVN por completo.
Em seguida, mantenho uma cópia local de trabalho SVN separada, que está em uma pasta separada. É o que eu faço confirmado no SVN e simplesmente uso o utilitário de linha de comando do SVN para isso.
Quando estou pronto para confirmar o estado do meu repositório Git local no SVN, simplesmente copio toda a bagunça de arquivos na cópia de trabalho local do SVN e o confirmo a partir daí usando o SVN em vez do Git.
Dessa forma, eu nunca tenho que fazer nenhum rebaseamento, porque rebasear é como base livre.
fonte