Déplacement du contenu du référentiel Git vers un autre référentiel en préservant l'historique


141

J'essaie de déplacer uniquement le contenu d'un référentiel ( repo1) vers un autre référentiel existant ( repo2) à l'aide des 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 article similaire, mais je n'en ai trouvé qu'un déplaçant le dossier, pas le contenu.


Voulez-vous avoir le contenu de repo1 en tant que branche sur repo2, ou en tant que partie de master, afin que les dossiers des deux dépôts coexistent dans votre répertoire de travail?
Chronial

Je veux le déplacer dans le cadre du master.
Mario

4
Ce tutoriel est parfait! smashingmagazine.com/2014/05/19/…
xpto

Réponses:


242

Je pense que les commandes que vous recherchez sont:

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/mastercontiendra tout de repo2/masteret repo1/master, et aura également l'histoire des deux.


Merci Chronial, je veux juste m'assurer que le repo1 a également une branche et que faire si je veux déplacer cette branche également vers repo2?
Mario

eh bien, repo2 a-t-il également une deuxième branche? Ou que devrait-il arriver à cette branche?
Chronial le

1
Chronial, les commandes ci-dessus n'ont pas fonctionné! il n'a pas copié l'histoire.
Mario

1
OK, maintenant cela a fonctionné. J'ai utilisé la commande suivante; cd repo2,> git remote rm origin> git remote add origin url-of-repo1 ,> git fetch r1remote> git push origin master
Mario

1
@abhijithda La solution la plus simple serait de simplement tout déplacer à l'intérieur repo1dans un sous-dossier (à l'intérieur repo1) avant de faire la fusion.
Chronial

55

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 vers notre index local:

git fetch origin

Nous pouvons rechercher toutes les branches manquantes dont nous avons besoin pour créer une copie locale de:

git branch -a

Utilisons l'URL clonée SSH de notre nouveau référentiel pour créer une nouvelle télécommande dans notre référentiel local existant:

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

Nous sommes maintenant prêts à pousser toutes les branches et balises locales vers la nouvelle télécommande nommée new-origin:

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

Faisons de new-origin la télécommande par défaut:

git remote rm origin

Renommez new-origin en juste origin, afin qu'il devienne la télécommande par défaut:

git remote rename new-origin origin

4
Peut confirmer que cela copie l'historique complet et les balises. Très agréable. Merci.
Alex

Si la nouvelle origine n'a aucun commit, cela fonctionne bien. Cependant, s'il y a un commit dans la nouvelle origine, la manière mentionnée ici ne s'exprimera pas comme prévu.
caot

vous devez permuter les branches avec git checkout BranchNamepuis pousser à nouveau la branche vers le repo distant avec git push --all new-origin mais merci beaucoup
Raad Altaie

21

Si vous cherchez à préserver les branches existantes et à valider l'historique, 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

Supposons maintenant que vous souhaitiez synchroniser les dépôts source et de destination pendant un certain temps. Par exemple, il y a toujours une activité dans le référentiel distant actuel que vous souhaitez transférer vers le nouveau référentiel / 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 afficher les dernières mises à jour (en supposant que vous n'ayez aucune modification locale):

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

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


1
Cela a fonctionné simplement et facilement pour moi. Je pense que cela devrait être la réponse vérifiée. Si vous avez 60 succursales, c'est la voie à suivre.
rickfoosusa

7

L'approche la plus simple si le code est déjà suivi par Git, définissez un nouveau référentiel comme votre «origine» vers laquelle pousser.

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

6

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

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é ceci sur: https://gist.github.com/niksumeiko/8972566


1
C'est le moyen le plus simple de laisser le référentiel d'origine. Il copie également toutes les branches.
Guillermo

1
Cela copie également toutes les balises.
Raven

2

J'ai utilisé la méthode ci-dessous pour migrer mon GIT Stash vers GitLab en conservant toutes les branches et l'historique des validations.

Clonez l'ancien référentiel en local.

git clone --bare <STASH-URL>

Créez un référentiel vide dans GitLab.

git push --mirror <GitLab-URL>

1

On dirait que tu es proche. En supposant que ce n'est pas seulement une faute de frappe dans votre soumission, l'étape 3 devrait être cd repo2au lieu de repo1. Et l'étape 6 ne doit git pullpas être poussée. Liste retravaillée:

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

Merci Eric, mais à l'étape 3, je veux supprimer le lien du référentiel d'origine pour éviter de faire des modifications à distance .. car je veux déplacer le contenu de repo1 vers repo2.
Mario

Bien. J'ai modifié ma réponse pour essayer de refléter cela. Juste pour vous assurer que vous essayez de créer un référentiel, repo2, qui est une copie de repo1 mais qui ne conserve ni repo1 ni origine comme télécommandes?
Eric Palace

Non, je n'essaye pas de faire un nouveau repo "repo2". En fait, j'ai un repo2 existant qui a d'autres contenus init. Maintenant, je veux déplacer tout le contenu de repo1 dans repo2 avec l'historique. Je vais garder le repo1 vide tel qu'il est dans le serveur.
Mario

Avez-vous envisagé de ne pas utiliser git? Il semble que vous pourriez probablement simplement copier les fichiers (via une interface graphique ou scp ou ftp) et les ajouter manuellement à votre dépôt git. Ce n'est peut-être pas aussi efficace, mais c'est probablement plus simple.
Eric Palace

Je l'ai déjà essayé mais ça a laissé l'histoire. Je veux également déplacer toute son histoire.
Mario

1

Selon la réponse de @ Dan-Cohn, Mirror-push est votre ami ici. C'est mon choix pour la migration des dépôts:

Mettre en miroir un référentiel

1.Ouvrez Git Bash.

2.Créez un clone nu du référentiel.

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

3.Mirror-push vers le nouveau référentiel.

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

4.Supprimez le référentiel local temporaire que vous avez créé à l'étape 1.

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

Référence et crédit: https://help.github.com/en/articles/duplicating-a-repository


-1

Il y a beaucoup de réponses compliquées, ici; cependant, si vous n'êtes pas concerné par la préservation des branches, il vous suffit de réinitialiser l'origine distante, de définir l'amont et de pousser.

Cela a permis de préserver toute l'historique des commits pour moi.

cd <location of local repo.>
git remote set-url origin <url>
git push -u origin master
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.