Como migrar o repositório GIT de um servidor para um novo

264

Eu tenho um servidor que estou desativando. A única coisa que resta para migrar é o meu repositório. Este servidor está listado como a origem (mestre) de um dos meus projetos. Qual é a maneira correta de mover o repositório para manter o histórico.

cjibo
fonte
Todas as informações (orgin, tronco, etc.) sobre o repositório são armazenadas em uma pasta chamada '.git', na qual você está inicializando o repositório. Portanto, você precisa copiar o conteúdo para o novo servidor, usando as instruções fornecidas aqui
Mansab Uppal
1
simplesmente git configuração remote.origin.url NEWURL ver stackoverflow.com/questions/3011402/...
Niels
1
Se você deseja migrar seu repositório e todos os ramos, use a resposta por jzwiener ou Roberto, em vez da resposta aceita.
jonaglon

Respostas:

247

Para adicionar o novo local de repo,

git remote add new_repo_name new_repo_url

Em seguida, empurre o conteúdo para o novo local

git push new_repo_name master

Por fim, remova o antigo

git remote rm origin

Depois disso, você pode fazer o que o bdonlan disse e editar o arquivo.git / config para alterar o new_repo_name para origem. Se você não remover a origem (repositório remoto original), basta enviar as alterações para o novo repositório com

git push new_repo_name master
Koby
fonte
8
Isso copiaria apenas uma única ramificação do repositório antigo para o novo?
Andrew Grimm
34
Qual é a solução para migrar todas as filiais?
emmby
50
Você deve poder empurrar todos os ramos de uma só vez via git push -u new_repo_name --all.
rmarscher
10
Migração de todos os ramos podem ser encontradas em stackoverflow.com/a/18336145/923599
jzwiener
10
Em vez de editar o arquivo git-config, este comando funcionou para mim:git remote rename new_repo_name origin
Salim
210

Se você deseja migrar todas as ramificações e tags, use os seguintes comandos:

git clone --mirror [oldUrl]

clonar o repositório antigo com todos os ramos

cd the_repo
git remote add remoteName newRepoUrl

configurar um novo controle remoto

git push -f --tags remoteName refs/heads/*:refs/heads/*

empurrar todas as refs sob refs / heads (que provavelmente é o que você deseja)

jzwiener
fonte
5
O Git estava reclamando disso --tagse refs/heads/*:refs/heads/*não é compatível --mirror. stackoverflow.com/a/26552740/1484831 funcionou bem.
Avigit
3
Eu usei isso e funcionou para mim. Provavelmente deve ser a resposta eleita. Observe que o "código" obtido localmente parece pesado nos metadados, o que torna pouco claro para iniciantes se algo der errado.
nick
3
Essa deve ser a resposta aprovada. Muito melhor do que outras soluções
Travis Griggs
15
Acabei com todos os ramos no meu novo repositório remoto prefixo refs/heads/refs/headsusando git push -f --tags remoteName refs/heads/*:refs/heads/*para que eu tenha trocado paragit push remoteName --mirror
dumbledad
1
pushtambém suporta --mirror. git clone --mirror; cd repo; git push --mirror new_remotedeve fazer o truque
knittl
144

Isso funcionou para mim na perfeição .

git clone --mirror <URL to my OLD repo location>
cd <New directory where your OLD repo was cloned>
git remote set-url origin <URL to my NEW repo location>
git push -f origin

Devo mencionar, no entanto, que isso cria um espelho do seu repo atual e o envia para o novo local. Portanto, isso pode levar algum tempo para repositórios grandes ou conexões lentas .

Roberto
fonte
15
*** Este ***
Paul Lockwood
1
Esta é a boa solução git origem remota set-url <URL para o meu novo local de repo> (depois de ter rsync'ed a origem antiga para o novo servidor / local)
Toni Homedes i Saun
2
Este está ótimo. Não confundir vários controles remotos
TaoPR
17
Prefere git push --mirror originmais -f.
Aidiakapi
78

Copie-o. É realmente assim tão simples. :)

No lado do cliente, basta editar .git / config no repositório local do cliente para apontar seus controles remotos para o novo URL, conforme necessário.

bdonlan
fonte
6
Você também pode simplesmente cloná-lo. Além disso, em vez de editar diretamente o arquivo .git / config, você pode usar o git remote rm origin; git remote add origin <novo repositório>.
ebneter 28/09/09
4
rimar o controle remoto perderá qualquer configuração sob essa seção da configuração - e a clonagem sem executar etapas extras perderá outros ramos além do tronco. É possível lidar com esses problemas, mas, realmente - apenas sincronize-os novamente.
bdonlan
1
Qual é a solução usando apenas git para fazer o trabalho? rsync requer aros administrativos adicionais que são difíceis de saltar através de
emmby
2
este também preserva por exemplo, ganchos e outra configuração, de modo que i preferem para soluções git puros
mnagel
66

Isso é feito parcialmente em algumas das outras respostas.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new
Ian Walters
fonte
7
Essa é, de fato, a resposta mais completa e direta.
Lawrence Dol
4
--mirrorno impulso é muito importante: esta deve ser a resposta correta
PaoloC
Quando você inicializar o novo repositório no novo servidor lembrar de fazer uma inicialização nu ou o impulso não será bem sucedido:git init --bare
marco
35

Estou apenas reposicionando o que os outros disseram, em uma lista simples de seguir as instruções.

  1. Mova o repositório: Simplesmente faça login no novo servidor, cdno diretório pai onde você deseja manter o repositório e use rsyncpara copiar do servidor antigo:

    new.server> rsync -a -v -e ssh [email protected]:path/to/repository.git .
    
  2. Faça com que os clientes aponte para o novo repositório: Agora, em cada cliente usando o repositório, basta remover o ponteiro para a origem antiga e adicionar um ao novo.

    client> git remote rm origin
    client> git remote add origin [email protected]:path/to/repository.git
    
Juan A. Navarro
fonte
Simples e eficaz. Você pode adicionar o sinalizador --bwlimit = XXX se desejar limitar o tráfego entre os servidores, onde XXX é igual à largura de banda em KBytes por segundo.
precisa saber é o seguinte
7
Um pouco melhor do que remover e adicionar:git remote set-url origin [email protected]:path/to/repository.git
Chris KL
Para aqueles que estão implantando em um servidor usando git + capistrano, observe que eu tive que usar a origem do conjunto de URLs em 2 locais: no host local e na cópia em cache que está no servidor.
Anandvc #
10

Eu segui as instruções no BitBucket para mover um repositório com todos os seus ramos lá. Aqui estão as etapas com explicações após o #personagem:

cd path/to/local/repo
git remote remove origin # to get rid of the old setting, this was not in the BitBucket instructions
git remote add origin ssh://[email protected]/<username>/<newrepo> # modify URL as needed
git push -u origin --all # pushes _ALL_ branches in one go
git push -u origin --tags # pushes _ALL_ tags in one go

Funcionou bem para mim.

Laringe Decidua
fonte
8

Por favor, siga os passos:

  • git remote adicionar nova origem
  • git push --todos de nova origem
  • git push --tags nova origem
  • origem remota do git rm
  • git remote renomear origem de nova origem
Boush
fonte
5

Esta é uma variação desta resposta , atualmente sugerida pelo gitlab para "migrar" um repositório git de um servidor para outro.

  1. Vamos supor que seu projeto antigo seja chamado existing_repo, armazenado em uma existing_repopasta.

  2. Crie um repositório em seu novo servidor. Vamos assumir que o URL desse novo projeto égit@newserver:newproject.git

  3. Abra uma interface da linha de comandos e digite o seguinte:

    cd existing_repo
    git remote rename origin old-origin
    git remote add origin git@newserver:newproject.git
    git push -u origin --all
    git push -u origin --tags
    

Os benefícios dessa abordagem são que você não exclui a filial que corresponde ao seu servidor antigo.

Clemente
fonte
4

Você pode usar o seguinte comando:

git remote set-url --push origin new_repo_url

Exemplo de http://gitref.org/remotes/

$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/github/git-reference.git (push)
$ git remote set-url --push origin git://github.com/pjhyett/hw.git
$ git remote -v
github  [email protected]:schacon/hw.git (fetch)
github  [email protected]:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)
mrroboaat
fonte
4

Deve ser tão simples quanto:

git remote set-url origin git://new.url.here

Dessa forma, você mantém o nome origindo seu novo repositório - e depois envia para o novo repositório o antigo, conforme detalhado nas outras respostas. Supondo que você trabalhe sozinho e tenha um repositório local que deseja espelhar com todo o seu dinheiro, você também deve (de dentro do repositório local)

git push origin --mirror # origin points to your new repo

mas consulte "Git push --mirror" é suficiente para fazer backup do meu repositório? (em todos, não use --mirrorapenas uma vez).

Mr_and_Mrs_D
fonte
3

siga estas instruções Se você deseja manter todos os commits e branches do antigo para o novo repositório

git clone --bare <old-repo-url>
cd <old-repo-directory>
git push --mirror <new-repo-url>
Extremo
fonte
1

Você pode usar o git-copy para duplicar o repositório com todos os históricos.

git copy http://a.com/old.git http://a.com/new.git
Quanlong
fonte
1

Se você deseja mover de uma origem para outra e também manter um backup da sua origem atual em sua máquina local, siga estas etapas:

  1. Primeiro, localmente, vá para a pasta (git) que você deseja mover
  2. Criar o novo repositório online Esta etapa cria um repositório no qual podemos enviar o código para

Agora na pasta faça

git remote get-url origin

O comando acima fornece o URL de origem remota atual, útil para definir a origem de volta na última etapa

git remote set-url origin [email protected]:folder/newrepo.git

O comando acima define a origem remota para o novo local

git push --set-upstream origin develop

O comando acima envia o ramo local ativo atual para remoto com o desenvolvimento do nome da filial. É claro que preserva toda a história, pois com o git toda a história também é empurrada.

git remote set-url origin <original old origin>

O comando acima recupera a origem remota para a sua origem atual: você deseja isso porque está na pasta existente e provavelmente não deseja misturar o nome atual da pasta local com a nova pasta que você criará para clonar o repositório você acabou de empurrar para.

Espero que isto ajude,

Hace
fonte
0

Se você deseja migrar um repositório #git de um servidor para um novo, faça o seguinte:

git clone OLD_REPOSITORY_PATH
cd OLD_REPOSITORY_DIR
git remote add NEW_REPOSITORY_ALIAS  NEW_REPOSITORY_PATH
#check out all remote branches 
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
git push --mirror NEW_REPOSITORY_PATH
git push NEW_REPOSITORY_ALIAS --tags

Todas as ramificações e tags remotas do repositório antigo serão copiadas para o novo repositório.

Executando este comando sozinho:

git push NEW_REPOSITORY_ALIAS

copiava apenas uma ramificação principal (apenas ramificações de rastreamento) para o novo repositório.

maestr0
fonte