Um repositório svn que estou espelhando por meio de git-svn mudou de URL.
Em vanilla svn, você apenas faria svn switch --relocate old_url_base new_url_base
.
Como posso fazer isso usando git-svn?
Simplesmente alterar o url svn no arquivo de configuração falha.
Respostas:
Isso lida muito bem com minha situação:
https://git.wiki.kernel.org/index.php/GitSvnSwitch
Eu clonei usando o
file://
protocolo e queria mudar para ohttp://
protocolo.É tentador editar a
url
configuração na[svn-remote "svn"]
seção de.git/config
, mas por si só isso não funciona. Em geral, você precisa seguir o seguinte procedimento:url
configuração svn-remote para o novo nome.git svn fetch
. Isso precisa buscar pelo menos uma nova revisão do svn!url
configuração svn-remote de volta para a URL original.git svn rebase -l
para fazer um rebase local (com as mudanças que vieram com a última operação de busca).url
configuração svn-remote de volta para a nova URL.git svn rebase
deve funcionar novamente.Almas aventureiras podem querer tentar
--rewrite-root
.fonte
Você pode ver se o seguinte funciona bem:
Se
svn-remote.svn.rewriteRoot
não existir no arquivo de configuração (.git/config
):Se
svn-remote.svn.rewriteUUID
não existir no arquivo de configuração:O
currentRepositoryUUID
pode ser obtido em.git/svn/.metadata
.git config svn-remote.svn.url <newRepositoryURL>
fonte
file://
, alternar parasvn+ssh
); apenas observando que: este procedimento não precisa "buscar pelo menos uma nova revisão do svn"; também./.git/svn/.metadata
após primeirosvn rebase
contém o<newRepository>
asreposRoot
- mas isso não é suficiente para remover asrewrite*
chaves.git/config
; portanto, essas chaves devem ser mantidas permanentemente lá, tanto quanto eu entendo.svn+ssh://
e nosso svn-server acabou de mudar o domínio de.se
para.com
para limpar nossa nomenclatura interna.Infelizmente, a maioria dos links nessas respostas não está funcionando, então vou duplicar um pouco de informação do wiki git para referência futura.
Esta solução funcionou para mim:
Edite o
svn-remote
url
(oufetch
caminho).git/config
para apontar para o novo domínio / url / caminhoExecute git
git svn fetch
. Isso precisa buscar pelo menos uma nova revisão do svn!Se você tentar
git svn rebase
agora, receberá uma mensagem de erro como esta:Acho que isso ocorre porque
git svn
está confuso pelo fato de que seu último commit anterior à busca terá umgit-svn-id
apontando para o caminho antigo, que não corresponde ao encontrado em.git/config
.Como solução alternativa, altere
svn-remote
url
(oufetch
caminho) de volta para o domínio / url / caminho originalAgora execute
git svn rebase -l
novamente para fazer um rebase local com as mudanças que vieram com a última operação de busca. Desta vez ele vai trabalhar, aparentemente porquegit svn
não será confundido pelo fato de que ogit-svn-id
do novo chefe não coincide com o encontrado em.git/config
.Finalmente, mude
svn-remote
url
(oufetch
caminho) de volta para o novo domínio / url / caminhoNeste ponto,
git svn rebase
deve funcionar novamente!A informação original foi encontrada aqui .
fonte
Git svn depende muito da URL svn. Todo commit importado de svn possui um
git-svn-id
que inclui a URL svn.Uma estratégia de realocações válida é chamar
git-svn clone
o novo repositório e mesclar as mudanças naquele novo fechamento. Para um procedimento mais detalhado, consulte este artigo:http://www.sanityinc.com/articles/relocating-git-svn-repositories
fonte
git filter-branch
Este script , retirado de uma entrada de blog , funcionou para mim. Forneça o URL do repo antigo e o novo como parâmetro, assim como para
svn switch --relocate
.O script chama
git filter-branch
para substituir URLs do Subversion nasgit-svn-id
mensagens de commit, atualizações.git/config
e também atualizagit-svn
metadados recriando-os usandogit svn rebase
. Emboragit svn clone
possa ser a solução mais robusta, afilter-branch
abordagem funciona muito mais rápido para repositórios enormes (horas x dias).fonte
git_fast_filter
Ainda mais rápido do que
git-filter-branch
(ou seja, minutos em vez de horas), mas semelhante em espírito, é usargit_fast_filter
. No entanto, isso requer um pouco mais de codificação e não existe uma solução pronta para uso. Em contraste comgit-filter-branch
, isso criará um novo repo a partir de um antigo . Presume-se quemaster
aponta para o último commit do SVN.git_fast_filter
do repositório Gitorious.git_fast_filter
base neste Gist , defina o bit executável usandochmod +x
. Adapte caminhos de repositório novos e antigos. (O conteúdo do script também é colado abaixo.)git init
, altere o diretório de trabalho para este novo repo.Execute o seguinte tubo:
Copie
.git/config
e talvez outros arquivos relevantes.git/info
do repositório antigo para o novo..git/svn
.Esteja
git-svn
ciente do novo mapeamento de número de revisãoExecutar
git branch refs/remotes/git-svn master
refs/remotes/git-svn
, consultar.git/config
,svn-remote
seçõesExecute
git svn info
. Se este comando congelar, algo está errado. Ele deve reconstruir o mapeamento do número de revisão.Remova o galho falso
refs/remotes/git-svn
, ele será recriado porgit-svn
git svn rebase
.Abaixo está o conteúdo de
commit_filter.py
, substitua os valores deIN_REPO
eOUT_REPO
conforme apropriado:fonte
A
git svn rebase -l
solução acima não funcionou para mim. Decidi fazer isso de uma maneira diferente:old
e o novo SVN no git reponew
old
emnew
cd new
git fetch ../old
git tag old FETCH_HEAD
new
no topoold
(deve funcionar porque as árvores na raiznew
e na ponta deold
são idênticas)git checkout master
(Presume que omaster
branch está apontando para o cabeçalho SVN. Esse será o caso com um clone limpo; caso contrário, dcommit antes de começar.)git rebase --root --onto old
new
para contabilizar o rebasegit update-ref --no-deref refs/remotes/git-svn master
(ajuste a referência remota dependendo de como você clonou, por exemplo, pode serrefs/remotes/svn/trunk
)rm -r .git/svn
git svn info
fonte
Com base em algumas das outras respostas a esta pergunta, eu vim com um script Ruby que lida com a realocação de git-svn. Você pode encontrá-lo em https://gist.github.com/henderea/6e779b66be3580c9a584 .
Ele lida com a realocação sem fazer check-out de outra cópia, e ainda lida com o caso em que há alterações não enviadas em um ou mais branches (já que isso quebra a lógica regular). Ele usa coisas da resposta do git filter-branch (para a lógica principal) e a resposta sobre a cópia de branches de uma instância do repo para outra (para copiar branches com alterações não enviadas).
Tenho usado isso para realocar um monte de repositórios git-svn que tenho para trabalhar, e esta versão do script (já passei por inúmeras iterações) parece funcionar para mim. Não é muito rápido, mas parece lidar com todos os casos que encontrei e resultar em um repositório totalmente realocado.
O script oferece a opção de criar uma cópia do repo antes de fazer qualquer alteração, portanto, você pode usar essa opção para criar um backup. A criação de uma cópia é necessária se você tiver alterações não enviadas em qualquer branch.
O script não usa gemas ou outras bibliotecas não incluídas na instalação normal do MRI Ruby. Ele usa as bibliotecas readline e fileutils incluídas no MRI.
Espero que meu script seja útil para outra pessoa. Sinta-se à vontade para fazer alterações no script.
NOTA: Eu apenas testei este script com git 2.3.0 / 2.3.1 e Ruby 2.2.0 no OS X 10.10 Yosemite (já que é o ambiente que uso), mas espero que funcione em outros ambientes também. Não há garantias sobre o Windows, no entanto.
fonte