253 votes

Déplacer le contenu d'un dépôt Git vers un autre dépôt en préservant l'historique

J'essaie de déplacer uniquement le contenu d'un référentiel ( repo1 ) vers un autre référentiel existant ( repo2 ) en utilisant les commandes suivantes :

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

Mais ça ne marche pas. J'ai examiné un post similaire, mais je n'ai trouvé qu'un déplacement du dossier, pas du contenu.

405voto

Chronial Points 15402

Je pense que les commandes que vous recherchez sont les suivantes :

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

Après cela repo2/master contiendra tout, de repo2/master et repo1/master et aura également l'histoire de ces deux pays.

127voto

Parfaitement décrit ici https://www.smashingmagazine.com/2014/05/moving-git-repository-new-server/

Tout d'abord, nous devons récupérer toutes les branches et balises distantes du référentiel existant dans notre index local :

git fetch origin

Nous pouvons vérifier s'il manque des branches dont nous devons créer une copie locale :

git branch -a

Utilisons l'URL clonée par SSH de notre nouveau dépôt pour créer un nouveau dépôt distant dans notre dépôt local existant :

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

Maintenant nous sommes prêts à pousser toutes les branches locales et les tags vers le nouveau distant nommé new-origin :

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

Faisons de new-origin le remote par défaut :

git remote rm origin

Renommez new-origin en origin, afin qu'il devienne le distant par défaut :

git remote rename new-origin origin

53voto

Dan Cohn Points 451

Si vous cherchez à préserver les branches existantes et l'historique des livraisons, voici une méthode qui a fonctionné pour moi.

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

Maintenant, supposons que vous voulez garder les dépôts source et de destination en synchronisation pendant une période de temps. Par exemple, il y a encore de l'activité dans le dépôt distant actuel que vous voulez transférer dans le nouveau dépôt de remplacement.

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

Pour obtenir les dernières mises à jour (en supposant que vous n'avez pas de modifications locales) :

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

NB : Je n'ai pas encore utilisé de submodules, donc je ne sais pas quelles étapes supplémentaires pourraient être nécessaires si vous en avez.

22voto

daylight Points 329

Cela a fonctionné pour déplacer mon repo local (y compris l'historique) vers mon repo distant github.com. Après avoir créé le nouveau repo vide sur GitHub.com, j'utilise l'URL de l'étape 3 ci-dessous et cela fonctionne parfaitement.

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

J'ai trouvé ça chez : https://gist.github.com/niksumeiko/8972566

20voto

Martin Points 338

Si le code est déjà suivi par Git, l'approche la plus simple consiste à définir le nouveau dépôt comme "origine" pour le pousser.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X