Git pousser le référentiel existant vers un nouveau et différent serveur de référentiel distant?

494

Disons que j'ai un référentiel sur git.fedorahosted.org et que je veux le cloner dans mon compte sur github pour avoir mon propre terrain de jeu en dehors du repo plus "officiel" sur fedorahosted. Quelles seraient les étapes pour copier initialement cela? Dans github il y a ce joli bouton "fork", mais je ne peux pas l'utiliser pour des raisons évidentes.

Et comment pourrais-je suivre les changements dans le repo fedorahosted dans le github one?

Heiko Rupp
la source

Réponses:

751
  1. Créez un nouveau dépôt sur github.
  2. Clonez le dépôt de fedorahosted sur votre machine locale.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Maintenant, vous pouvez travailler avec lui comme n'importe quel autre dépôt github. Pour récupérer des correctifs en amont, exécutez simplement git pull upstream master && git push origin master.

troelskn
la source
14
Il n'y a aucune raison de renommer l'origine d'origine, il suffit d'appeler le nouveau terrain de jeu quelque chose d'autre.
tacaswell
34
@tcaswell Techniquement non, mais c'est une convention forte qui originpointe vers l'emplacement distant canonique. Dans ce cas, l'emplacement du github serait vraisemblablement le canon.
troelskn
1
Je considérerais «en amont» comme l'emplacement canonique, mais je pense que cela commence à diviser les poils.
tacaswell
3
Je devrais peut-être poster une question différente mais je pense que vous discutez de ce que je veux. Je voudrais ajouter une nouvelle télécommande, ne pas remplacer celle existante afin que je puisse continuer à tirer de l'ancien référentiel mais pousser toutes les modifications vers la nouvelle
ThatAintWorking
13
@ThatAintWorking Vous devriez probablement ouvrir une nouvelle question, mais en bref - vous pouvez ajouter n'importe quel nombre de télécommandes avec la commande git remote add. Vous pouvez ensuite pousser vers l'un d'eux en indiquant explicitement la télécommande git push. Par exemple, git push foobar masterpour pousser la branche actuelle mastersur à distance foobar.
troelskn
108

Il y a une réponse supprimée sur cette question qui avait un lien utile: https://help.github.com/articles/duplicating-a-repository

L'essentiel est

0. create the new empty repository (say, on github)
1. make a bare clone of the repository in some temporary location
2. change to the temporary location
3. perform a mirror-push to the new repository
4. change to another location and delete the temporary location

Exemple de l'OP:

Sur votre machine locale

$ cd $HOME
$ git clone --bare https://git.fedorahosted.org/the/path/to/my_repo.git
$ cd my_repo.git
$ git push --mirror https://github.com/my_username/my_repo.git
$ cd ..
$ rm -rf my_repo.git
foule
la source
5
Quel est l'avantage du clone nu et du miroir se contentant d'ajouter et de pousser vers une autre télécommande? Est-ce que toutes les branches seront poussées et pas seulement la branche actuelle? (Si c'est le cas, cela semble être une limitation de la réponse acceptée qui doit être notée.)
yoyo
3
C'était exactement l'info que je cherchais, le --bare / --mirror est généralement ce que les gens veulent jouer! Ceci est une réponse importante! Merci
claf
1
Génial! Certainement la réponse la plus correcte à la question du sujet. Merci! Si je ne le fais pas comme ça, je reçois toujourserror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin
45

Pour pousser votre référentiel existant dans différents, vous devez:

  1. Clonez d'abord le dépôt d'origine.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Poussez les sources clonées vers votre nouveau référentiel:

    cd rhq
    git push https://github.com/user/example master:master
    

Vous pouvez changer master:masteren source:destinationsuccursale.


Si vous voulez pousser un commit (branche) spécifique, alors faites:

  1. Sur le référentiel d'origine, créez et extrayez une nouvelle branche:

    git checkout -b new_branch
    
  2. Choisissez et réinitialisez au point de départ:

    git log # Find the interesting hash
    git reset 4b62bdc9087bf33cc01d0462bf16bbf396369c81 --hard
    

    Vous pouvez également sélectionner le commit par git cherry-pickpour l'ajouter à HEAD existant.

  3. Poussez ensuite vers votre nouveau référentiel:

    git push https://github.com/user/example new_branch:master
    

    Si vous rebasez, utilisez -fpour pousser la force (non recommandé). Courez git reflogpour voir l'historique des changements.

kenorb
la source
2
le git push ... old_branch_name:new_branch_namevous permet de pousser une branche de fonctionnalité de l'ancien référentiel comme branche principale dans le nouveau référentiel. Utile!
gorjanz
C'était le moyen le plus simple pour moi de le faire.
Adam
15

Voulez-vous vraiment pousser simplement votre référentiel local (avec ses branches locales, etc.) vers la nouvelle télécommande ou voulez-vous vraiment mettre en miroir l'ancienne télécommande (avec toutes ses branches, balises, etc.) sur la nouvelle télécommande? Si ce dernier est un excellent blog sur Comment refléter correctement un référentiel git .

Je vous encourage fortement à lire le blog pour des détails très importants, mais la version courte est la suivante:

Dans un nouveau répertoire, exécutez ces commandes:

git clone --mirror [email protected]/upstream-repository.git
cd upstream-repository.git
git push --mirror [email protected]/new-location.git
Les poils du chien
la source
Je pense que c'est le lien: blog.plataformatec.com.br/2013/05/…
David
11

Essayez ceci Comment déplacer un référentiel Git complet

  1. Créez un référentiel local dans le répertoire temp-dir en utilisant:

    git clone temp-dir

  2. Allez dans le répertoire temp-dir.

  3. Pour voir une liste des différentes branches dans ORI, procédez comme suit:

    git branch -a
    
  4. Extraire toutes les branches que vous souhaitez copier d'ORI vers NEW à l'aide de:

    git checkout branch-name
    
  5. Récupérez maintenant toutes les balises d'ORI en utilisant:

    git fetch --tags
    
  6. Avant de passer à l'étape suivante, assurez-vous de vérifier vos balises et branches locales à l'aide des commandes suivantes:

    git tag
    
    
    git branch -a
    
  7. Désactivez maintenant le lien vers le référentiel ORI avec la commande suivante:

    git remote rm origin
    
  8. Liez maintenant votre référentiel local à votre NOUVEAU référentiel nouvellement créé à l'aide de la commande suivante:

    git remote add origin <url to NEW repo>
    
  9. Poussez maintenant toutes vos branches et balises avec ces commandes:

    git push origin --all
    
    
    git push --tags
    
  10. Vous avez maintenant une copie complète de votre référentiel ORI.

vm345
la source
9

J'ai trouvé une solution en utilisant set-url qui est concise et assez facile à comprendre :

  1. créer un nouveau repo chez Github
  2. cd dans le référentiel existant sur votre machine locale (si vous ne l'avez pas encore cloné, faites-le d'abord)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master
Mobiletainment
la source
9

Si vous avez un référentiel Git existant:

cd existing_repo
git remote rename origin old-origin
git remote add origin https://gitlab.com/newproject
git push -u origin --all
git push -u origin --tags
Kamil Nekanowicz
la source
1
Juste pour clarifier, - tout va pousser toutes les branches
GilCol
7

Pointez simplement le nouveau dépôt en changeant l'URL du dépôt GIT avec cette commande:

git remote set-url origin [new repo URL]

Exemple: git remote set-url origin [email protected]:Batman/batmanRepoName.git

Maintenant, pousser et tirer sont liés au nouveau REPO.

Poussez ensuite normalement comme ceci:

git push -u origin master
Abdel Ourimchi
la source
2

J'ai eu le même problème.

Dans mon cas, puisque j'ai le référentiel d'origine sur ma machine locale, j'ai fait une copie dans un nouveau dossier sans aucun fichier caché (.git, .gitignore).

Enfin, j'ai ajouté le fichier .gitignore au nouveau dossier créé.

Ensuite, j'ai créé et ajouté le nouveau référentiel à partir du chemin local (dans mon cas en utilisant GitHub Desktop).

itrascastro
la source
1

Voici une manière manuelle de procéder git remote set-url origin [new repo URL]:

  1. Clonez le référentiel: git clone <old remote>
  2. Créer un référentiel GitHub
  3. Ouvert <repository>/.git/config

    $ git config -e
    
    [core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
    [remote "origin"]
        url = <old remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    [branch "master"]
        remote = origin
        merge = refs/heads/master
    

    et changer la télécommande (l'option url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Poussez le référentiel vers GitHub: git push

Vous pouvez également utiliser les deux télécommandes / plusieurs .

upe
la source
Je cherchais le même problème, puis j'ai fait la même chose et j'ai travaillé.
Mohit Patidar