Comment migrer le référentiel GIT d'un serveur vers un nouveau


264

J'ai un serveur que j'arrête. La seule chose qu'il me reste à migrer est mon référentiel. Ce serveur est répertorié comme origine (maître) pour l'un de mes projets. Quelle est la bonne façon de déplacer le référentiel pour conserver l'historique.


Toutes les informations (orgin, trunk, etc.) sur le référentiel sont stockées dans un dossier nommé '.git', où vous initialisez le référentiel. Donc, vous devez copier le contenu sur le nouveau serveur, en utilisant les instructions fournies ici
Mansab Uppal

1
tout simplement git config remote.origin.url newurl voir stackoverflow.com/questions/3011402/…
Niels

1
Si vous souhaitez migrer votre référentiel et toutes les succursales, utilisez la réponse de jzwiener ou Roberto plutôt que la réponse acceptée.
jonaglon

Réponses:


247

Pour ajouter le nouvel emplacement du référentiel,

git remote add new_repo_name new_repo_url

Poussez ensuite le contenu vers le nouvel emplacement

git push new_repo_name master

Enfin, retirez l'ancien

git remote rm origin

Après cela, vous pouvez faire ce que bdonlan a dit et éditer le fichier.git / config pour changer le new_repo_name en origin. Si vous ne supprimez pas l'origine (référentiel distant d'origine), vous pouvez simplement pousser les modifications dans le nouveau référentiel avec

git push new_repo_name master

8
Cela ne copierait-il qu'une seule branche de l'ancien référentiel vers le nouveau?
Andrew Grimm

34
Quelle est la solution pour migrer toutes les succursales?
emmby

50
Vous devriez pouvoir pousser toutes les branches à la fois via git push -u new_repo_name --all.
rmarscher

10
La migration de toutes les branches peut être trouvée sur stackoverflow.com/a/18336145/923599
jzwiener

10
Au lieu de modifier le fichier git-config, cette commande a fonctionné pour moi:git remote rename new_repo_name origin
Salim

210

Si vous souhaitez migrer toutes les branches et balises, vous devez utiliser les commandes suivantes:

git clone --mirror [oldUrl]

cloner l'ancien dépôt avec toutes les branches

cd the_repo
git remote add remoteName newRepoUrl

configurer une nouvelle télécommande

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

pour pousser toutes les références sous les références / têtes (ce qui est probablement ce que vous voulez)


5
Git se plaignait de cela --tagset refs/heads/*:refs/heads/*n'est pas compatible avec --mirror. stackoverflow.com/a/26552740/1484831 a bien fonctionné.
Avigit

3
Je l'ai utilisé et cela a fonctionné pour moi. Cela devrait probablement être la réponse élue. Notez que le "code" que vous obtenez localement semble être lourd sur les métadonnées, ce qui ne permet pas aux débutants de savoir si quelque chose s'est mal passé.
nick

3
Ce devrait être la réponse approuvée. Beaucoup mieux que d'autres solutions
Travis Griggs

15
Je me suis retrouvé avec toutes les branches de mon nouveau référentiel distant en refs/heads/refs/headsutilisant le préfixe, git push -f --tags remoteName refs/heads/*:refs/heads/*donc je suis git push remoteName --mirror
passé

1
pushprend également en charge --mirror. git clone --mirror; cd repo; git push --mirror new_remotedevrait faire l'affaire
knittl

144

Cela a fonctionné parfaitement pour moi .

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

Je dois cependant mentionner que cela crée un miroir de votre référentiel actuel, puis le pousse vers le nouvel emplacement. Par conséquent, cela peut prendre un certain temps pour les grands référentiels ou les connexions lentes .


15
*** Celui-ci ***
Paul Lockwood

1
C'est la bonne solution git remote set-url origin <URL to my NEW repo location> (après avoir resynchronisé l'ancienne origine vers le nouveau serveur / emplacement)
Toni Homedes i Saun

2
Celui-ci est super. Pas de télécommandes multiples déroutantes
TaoPR

17
Préférez git push --mirror originplutôt -f.
Aidiakapi

78

Copiez-le. C'est vraiment aussi simple que cela. :)

Côté client, modifiez simplement .git / config dans le référentiel local du client pour pointer vos télécommandes vers la nouvelle URL si nécessaire.


6
Vous pouvez également simplement le cloner. De plus, au lieu de modifier directement le fichier .git / config, vous pouvez utiliser git remote rm origin; git remote add origin <nouveau référentiel>.
Ebneter

4
rming la télécommande perdra toute configuration sous cette section de la configuration - et le clonage sans prendre aucune mesure supplémentaire perdra des branches autres que le tronc. Il est possible de résoudre ces problèmes, mais, vraiment - il suffit de le resynchroniser.
bdonlan

1
Quelle est la solution en utilisant uniquement git pour faire le travail? rsync nécessite des
cadres

2
cela préserve également par exemple les crochets et d'autres configurations, donc je le préfère aux solutions git pures
mnagel

66

Cela se fait en partie dans certaines des autres réponses.

git clone --mirror git@oldserver:oldproject.git
cd oldproject.git
git remote add new git@newserver:newproject.git
git push --mirror new

7
C'est, en fait, la réponse la plus complète et la plus simple.
Lawrence Dol

4
--mirrordans la poussée est très important: ce devrait être la bonne réponse
PaoloC

Lorsque vous initialisez le nouveau référentiel sur le nouveau serveur, n'oubliez pas de faire un init simple ou le push ne réussira pas:git init --bare
marco

35

Je republie simplement ce que les autres ont dit, dans une liste d'instructions simple à suivre.

  1. Déplacer le référentiel: Connectez -vous simplement au nouveau serveur, cddans le répertoire parent où vous souhaitez maintenant conserver le référentiel, et utilisez rsyncpour copier à partir de l'ancien serveur:

    new.server> rsync -a -v -e ssh user@old.server.com:path/to/repository.git .
    
  2. Faire pointer les clients vers le nouveau référentiel: Maintenant, sur chaque client utilisant le référentiel, supprimez simplement le pointeur sur l'ancienne origine et ajoutez-en un au nouveau.

    client> git remote rm origin
    client> git remote add origin user@new.server.com:path/to/repository.git
    

Simple et efficace. Vous pouvez ajouter l'indicateur --bwlimit = XXX si vous souhaitez limiter le trafic entre les serveurs, où XXX est égal à la bande passante en Koctets par seconde.
Greg Glockner

7
Un peu mieux que de supprimer et d'ajouter:git remote set-url origin user@new.server.com:path/to/repository.git
Chris KL

Pour ceux qui se déploient sur un serveur utilisant git + capistrano, notez que j'ai dû utiliser set-url origin à 2 endroits: sur localhost et sur la copie en cache qui se trouve sur le serveur.
anandvc


10

J'ai suivi les instructions sur BitBucket pour déplacer un dépôt avec toutes ses branches là-bas. Voici les étapes avec des explications suivant le #personnage:

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://git@bitbucket.org/<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

A bien fonctionné pour moi.


8

Veuillez suivre les étapes:

  • git remote ajouter une nouvelle origine
  • git push --all nouvelle-origine
  • git push --tags nouvelle-origine
  • git remote rm origin
  • git remote rename new-origin origin

5

Il s'agit d'une variante de cette réponse , actuellement suggérée par gitlab pour "migrer" un référentiel git d'un serveur à un autre.

  1. Supposons que votre ancien projet soit appelé existing_repo, stocké dans un existing_repodossier.

  2. Créez un dépôt sur votre nouveau serveur. Nous supposerons que l'url de ce nouveau projet estgit@newserver:newproject.git

  3. Ouvrez une interface de ligne de commande et entrez les informations suivantes:

    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
    

Les avantages de cette approche sont que vous ne supprimez pas la branche qui correspond à votre ancien serveur.


4

Vous pouvez utiliser la commande suivante:

git remote set-url --push origin new_repo_url

Exemple tiré de http://gitref.org/remotes/

$ git remote -v
github  git@github.com:schacon/hw.git (fetch)
github  git@github.com: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  git@github.com:schacon/hw.git (fetch)
github  git@github.com:schacon/hw.git (push)
origin  git://github.com/github/git-reference.git (fetch)
origin  git://github.com/pjhyett/hw.git (push)

4

Devrait être aussi simple que:

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

De cette façon, vous gardez le nom originde votre nouveau référentiel - puis poussez vers le nouveau référentiel l'ancien comme détaillé dans les autres réponses. Supposons que vous travailliez seul et que vous ayez un dépôt local que vous souhaitez refléter avec toute votre cruauté, vous pourriez aussi bien (de l'intérieur de votre dépôt local)

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

mais voir "git push --mirror" est-il suffisant pour sauvegarder mon référentiel? (en tout, ne l'utilisez --mirrorqu'une seule fois).


3

suivez ces instructions si vous souhaitez conserver tous les commits et branches de l'ancien au nouveau référentiel

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

1

Vous pouvez utiliser git-copy pour dupliquer le dépôt avec toutes les historiques.

git copy http://a.com/old.git http://a.com/new.git

1

Si vous souhaitez passer d'une origine à une autre et également conserver une sauvegarde de votre origine actuelle sur votre ordinateur local, vous pouvez utiliser ces étapes:

  1. Allez d'abord localement dans le dossier (git) sur lequel vous souhaitez vous déplacer
  2. Créer le nouveau référentiel en ligne Cette étape crée un référentiel où nous pouvons pousser le code vers

Maintenant, dans le dossier,

git remote get-url origin

La commande ci-dessus donne l'url d'origine d'origine à distance, utile pour rétablir l'origine à la dernière étape

git remote set-url origin git@github.newlocation:folder/newrepo.git

La commande ci-dessus définit l'origine distante sur le nouvel emplacement

git push --set-upstream origin develop

La commande ci-dessus pousse la branche locale active actuelle à distance avec développer le nom de la branche. Bien sûr, il préserve toute l'histoire car avec git, toute l'histoire est également poussée.

git remote set-url origin <original old origin>

La commande ci-dessus rétablit l'origine distante à votre origine actuelle: vous le voulez parce que vous êtes dans votre dossier existant et vous ne voulez probablement pas mélanger votre nom de dossier local actuel avec le nouveau dossier que vous allez créer pour cloner le référentiel vous venez de pousser.

J'espère que cela t'aides,


0

Si vous souhaitez migrer un référentiel #git d'un serveur vers un nouveau, vous pouvez le faire comme ceci:

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

Toutes les branches et balises distantes de l'ancien référentiel seront copiées dans le nouveau référentiel.

Exécution de cette commande seule:

git push NEW_REPOSITORY_ALIAS

copiera uniquement une branche principale (uniquement les branches de suivi) dans le nouveau référentiel.

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.