Movendo o conteúdo do repositório Git para outro repositório, preservando o histórico


141

Estou tentando mover apenas o conteúdo de um repositório ( repo1) para outro repositório existente ( repo2) usando os seguintes comandos:

git clone repo1
git clone repo2
cd repo1
git remote rm origin
git remote add repo1
git push

Mas não está funcionando. Analisei um post semelhante, mas só encontrei um movendo a pasta, não o conteúdo.


Deseja ter o conteúdo de repo1 como uma ramificação no repo2 ou como parte do mestre, para que as pastas de ambos os repositórios coexistam no seu diretório de trabalho?
Cronial

Eu quero movê-lo como parte do mestre.
28713 Mario Mario

4
Este tutorial é perfeito! smashingmagazine.com
2014

Respostas:


242

Eu acho que os comandos que você está procurando são:

cd repo2
git checkout master
git remote add r1remote **url-of-repo1**
git fetch r1remote
git merge r1remote/master --allow-unrelated-histories
git remote rm r1remote

Depois disso repo2/master, conterá tudo de repo2/mastere repo1/master, e também terá a história de ambos.


Obrigado Chronial, eu só quero ter certeza de que o repo1 também tem um ramo e se eu quiser mover esse ramo também para repo2?
28613 Mario Mario

bem, repo2 também tem um segundo ramo? Ou o que deveria acontecer com esse ramo?
Cronial

1
Chronial, os comandos acima não funcionaram! não copiou a história.
Mario

1
OK, agora funcionou. Eu usei o seguinte comando; cd repo2,> git origem rm remota> git add origem remota url-de-rede1 ,> git fetch r1remote> git mestre push origin
Mario

1
@abhijithda A solução mais simples seria mover tudo dentro de repo1uma subpasta (dentro repo1) antes de fazer a mesclagem.
Cronial

55

Perfeitamente descrito aqui https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Primeiro, precisamos buscar todas as ramificações e tags remotas do repositório existente no nosso índice local:

git fetch origin

Podemos verificar se há ramos ausentes que precisamos para criar uma cópia local de:

git branch -a

Vamos usar o URL clonado por SSH do nosso novo repositório para criar um novo controle remoto em nosso repositório local existente:

git remote add new-origin git@github.com:manakor/manascope.git

Agora estamos prontos para enviar todas as ramificações e tags locais para o novo controle remoto chamado new-origin:

git push --all new-origin 
git push --tags new-origin

Vamos tornar a nova origem o controle remoto padrão:

git remote rm origin

Renomeie nova origem para apenas origem, para que se torne o controle remoto padrão:

git remote rename new-origin origin

4
Pode confirmar que isso copia todo o histórico e as tags. Muito agradável. Obrigado.
Alex

Se a nova origem não tiver nenhum commit, funcionará bem. No entanto, se houver algum commit na nova origem, o caminho mencionado aqui não será o esperado.
caot

você precisa swtich branchs com git checkout BranchNameentão ramo push to repo remoto novamente com git push --all new-origin mas muito obrigado
Raad Altaie

21

Se você deseja preservar as ramificações existentes e confirmar o histórico, aqui está uma maneira que funcionou para mim.

git clone --mirror https://github.com/account/repo.git cloned-repo
cd cloned-repo
git push --mirror {URL of new (empty) repo}

# at this point only remote cloned-repo is correct, local has auto-generated repo structure with folders such as "branches" or "refs"
cd ..
rm -rf cloned-repo
git clone {URL of new (empty) repo}
# only now will you see the expected user-generated contents in local cloned-repo folder

# note: all non-master branches are avaialable, but git branch will not show them until you git checkout each of them
# to automatically checkout all remote branches use this loop:
for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Agora, suponha que você queira manter os repositórios de origem e destino em sincronia por um período de tempo. Por exemplo, ainda há atividades no repo remoto remoto atual que você deseja trazer para o novo repo / substituição.

git clone -o old https://github.com/account/repo.git my-repo
cd my-repo
git remote add new {URL of new repo}

Para baixar as atualizações mais recentes (supondo que você não tenha alterações locais):

git checkout {branch(es) of interest}
git pull old
git push --all new

NB: Ainda tenho que usar submódulos, então não sei quais etapas adicionais podem ser necessárias se você as possuir.


1
Isso funcionou de forma simples e fácil para mim. Eu acho que deveria ser a resposta verificada. Se você tem 60 ramos, este é o caminho a percorrer.
Rickfoosusa

7

Abordagem mais simples se o código já for rastreado pelo Git, defina um novo repositório como sua "origem" para a qual pressionar.

cd existing-project
git remote set-url origin https://clone-url.git
git push -u origin --all
git push origin --tags

6

Isso funcionou para mover meu repositório local (incluindo histórico) para meu repositório remoto do github.com. Depois de criar o novo repositório vazio no GitHub.com, uso o URL na etapa três abaixo e funciona muito bem.

git clone --mirror <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git push new-origin --mirror

Encontrei isso em: https://gist.github.com/niksumeiko/8972566


1
Essa é a maneira mais fácil de deixar o repositório original. Ele também copia todos os ramos.
Guillermo

1
Isso também copia todas as tags.
raven

2

Usei o método abaixo para migrar meu GIT Stash para o GitLab mantendo todas as ramificações e confirmar o histórico.

Clone o repositório antigo para local.

git clone --bare <STASH-URL>

Crie um repositório vazio no GitLab.

git push --mirror <GitLab-URL>

1

Parece que você está perto. Supondo que não seja apenas um erro de digitação no seu envio, a etapa 3 deve ser em cd repo2vez de repo1. E o passo 6 git pullnão deve ser pressionado. Lista reformulada:

1. git clone repo1
2. git clone repo2
3. cd repo2
4. git remote rm origin
5. git remote add repo1
6. git pull
7. git remote rm repo1
8. git remote add newremote

Obrigado Eric, mas na etapa 3 eu quero remover o link do repositório original para evitar alterações remotas .. pois quero mover o conteúdo de repo1 para repo2.
Mario

Tudo bem. Eu editei minha resposta para tentar refletir isso. Só para ter certeza, você está tentando criar um repositório, repo2, que é uma cópia do repo1, mas não mantém o repo1 ou a origem como controles remotos?
Eric Palace

Não, não estou tentando fazer um novo repo "repo2". Na verdade, eu tenho um repo2 existente que tem outros conteúdos init. Agora eu quero mover todo o conteúdo repo1 para repo2 com o histórico. Vou manter o repo1 vazio como está no servidor.
Mario

Você já pensou em não usar o git? Parece que você provavelmente poderia copiar os arquivos (por meio de um gui, scp ou ftp) e adicioná-los manualmente ao seu repositório git. Pode não ser tão eficiente, mas é provavelmente mais simples.
Eric Palace

Eu já tentei, mas deixou a história. Eu quero mover toda a sua história também.
Mario

1

De acordo com a resposta de Dan-Cohn, Mirror-push é seu amigo aqui. Este é o meu acesso para migrar repositórios:

Espelhando um Repositório

Abra o Git Bash.

2. Crie um clone simples do repositório.

$ git clone --bare https://github.com/exampleuser/old-repository.git

3.Pressione o espelho para o novo repositório.

$ cd old-repository.git
$ git push --mirror https://github.com/exampleuser/new-repository.git

4. Remova o repositório local temporário que você criou na etapa 1.

$ cd ..
$ rm -rf old-repository.git

Referência e crédito: https://help.github.com/en/articles/duplicating-a-repository


-1

Há muitas respostas complicadas aqui; no entanto, se você não estiver preocupado com a preservação de ramificação, tudo o que você precisa fazer é redefinir a origem remota, definir a origem e pressionar.

Isso funcionou para preservar todo o histórico de submissões para mim.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.