Vuoi spingere il repository esistente su un nuovo e diverso server di repository remoto?


494

Supponiamo di avere un repository su git.fedorahosted.org e che voglio clonarlo nel mio account su github per avere il mio parco giochi oltre al repository più "ufficiale" su fedorahosted. Quali sarebbero i passaggi per copiarlo inizialmente? All'interno di github c'è questo bel pulsante "fork", ma non posso usarlo per ovvie ragioni.

E come potrei tenere traccia delle modifiche nel repository fedorahosted in quello github?

Risposte:


751
  1. Crea un nuovo repository su github.
  2. Clona il repository da fedorahosted sul tuo computer locale.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Ora puoi lavorarci proprio come qualsiasi altro repository github. Per estrarre patch dall'upstream, esegui semplicemente git pull upstream master && git push origin master.


14
Non c'è motivo di rinominare l'origine originale, basta chiamare il nuovo campo di gioco qualcos'altro.
Tacaswell,

34
@tcaswell Tecnicamente no, ma è una convenzione forte che originpunta alla posizione remota canonica. In questo caso, la posizione di github sarebbe presumibilmente canonica.
troelskn,

1
Considererei "a monte" la posizione canonica, ma penso che questo inizi a spaccare i capelli.
Tacaswell,

3
Forse dovrei pubblicare una domanda diversa, ma penso che state discutendo di ciò che voglio. Vorrei aggiungere un nuovo telecomando, non sostituire quello esistente in modo da poter continuare a estrarre dal vecchio repository ma inviare eventuali modifiche a quello nuovo.
ThatAintWorking,

13
@ThatAintWorking Probabilmente dovresti aprire una nuova domanda, ma in breve: puoi aggiungere un numero qualsiasi di telecomandi con il comando git remote add. È quindi possibile passare a uno di essi specificando esplicitamente il telecomando git push. Ad esempio git push foobar masterper spingere il ramo corrente mastersul telecomando foobar.
Troelskn,

108

C'è una risposta eliminata su questa domanda che aveva un link utile: https://help.github.com/articles/duplicating-a-repository

L'essenza è

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

Esempio di OP:

Sul tuo computer 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

5
Qual è il vantaggio del clone nudo e del mirroring che si sposta semplicemente aggiungendo e spingendo su un altro telecomando? Saranno spinti tutti i rami e non solo il ramo attuale? (In tal caso, questo sembra un limite alla risposta accettata che dovrebbe essere notato.)
yoyo

3
Questa era esattamente l'informazione che stavo cercando, --bare / --mirror è di solito quello che la gente vuole esibirsi! Questa è una risposta importante! Grazie
claf

1
Grande! Sicuramente la risposta più corretta sulla domanda dell'argomento. Grazie! Se non lo faccio in questo modo, ottengo sempreerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin il

45

Per spingere il repository esistente in diversi, è necessario:

  1. Clonare prima il repository originale.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Invia le fonti clonate al tuo nuovo repository:

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

Puoi cambiare master:masterin source:destinationfiliale.


Se si desidera inviare un commit specifico (ramo), quindi:

  1. Nel repository originale, crea e verifica un nuovo ramo:

    git checkout -b new_branch
    
  2. Scegli e resetta al punto con cui vuoi iniziare:

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

    In alternativa, selezionare il commit da git cherry-pickaggiungere in HEAD esistente.

  3. Quindi spingere nel nuovo repository:

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

    Se stai eseguendo la rebasing, usa -fper la forza di spinta (non raccomandato). Esegui git reflogper visualizzare la cronologia delle modifiche.


2
l' git push ... old_branch_name:new_branch_namepermette di spingere un ramo di caratteristica dal vecchio repository come il ramo principale nel nuovo repository. Utile!
Gorjanz,

Questo è stato il modo più semplice per me di farlo.
Adam,

15

Vuoi davvero semplicemente spingere il tuo repository locale (con i suoi rami locali, ecc.) Sul nuovo telecomando o vuoi davvero rispecchiare il vecchio telecomando (con tutti i suoi rami, tag, ecc.) Sul nuovo telecomando? Se quest'ultimo è un ottimo blog su Come eseguire correttamente il mirroring di un repository git .

Ti incoraggio vivamente a leggere il blog per alcuni dettagli molto importanti, ma la versione breve è questa:

In una nuova directory esegui questi comandi:

git clone --mirror git@example.com/upstream-repository.git
cd upstream-repository.git
git push --mirror git@example.com/new-location.git

Penso che questo sia il link: blog.plataformatec.com.br/2013/05/…
David

11

Prova questo Come spostare un repository Git completo

  1. Creare un repository locale nella directory temp-dir usando:

    git clone temp-dir

  2. Vai nella directory temp-dir.

  3. Per visualizzare un elenco dei diversi rami in ORI, procedere come segue:

    git branch -a
    
  4. Verifica tutti i rami che desideri copiare da ORI a NUOVO utilizzando:

    git checkout branch-name
    
  5. Ora prendi tutti i tag da ORI usando:

    git fetch --tags
    
  6. Prima di procedere con il passaggio successivo, assicurati di controllare i tag e i rami locali utilizzando i seguenti comandi:

    git tag
    
    
    git branch -a
    
  7. Ora cancella il collegamento al repository ORI con il seguente comando:

    git remote rm origin
    
  8. Ora collega il tuo repository locale al NUOVO repository appena creato usando il seguente comando:

    git remote add origin <url to NEW repo>
    
  9. Ora invia tutti i tuoi rami e tag con questi comandi:

    git push origin --all
    
    
    git push --tags
    
  10. Ora hai una copia completa dal tuo repository ORI.


9

Ho trovato una soluzione usando set-url che è concisa e abbastanza facile da capire :

  1. creare un nuovo repository su Github
  2. cd nel repository esistente sul tuo computer locale (se non lo hai ancora clonato, fallo prima)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master

9

Se disponi di un repository Git esistente:

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

1
Giusto per chiarire,
GilCol il

7

Basta puntare il nuovo repository modificando l'URL del repository GIT con questo comando:

git remote set-url origin [new repo URL]

Esempio: git remote set-url origin git@bitbucket.org:Batman/batmanRepoName.git

Ora, spingendo e tirando sono collegati al nuovo REPO.

Quindi spingere normalmente in questo modo:

git push -u origin master

2

Ho avuto lo stesso problema.

Nel mio caso, dal momento che ho il repository originale nel mio computer locale, ho creato una copia in una nuova cartella senza alcun file nascosto (.git, .gitignore).

Finalmente ho aggiunto il file .gitignore alla nuova cartella creata.

Quindi ho creato e aggiunto il nuovo repository dal percorso locale (nel mio caso usando GitHub Desktop).


1

Ecco un modo manuale per fare git remote set-url origin [new repo URL]:

  1. Clona il repository: git clone <old remote>
  2. Crea un repository GitHub
  3. Aperto <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
    

    e cambia il telecomando (l'opzione url)

    [remote "origin"]
        url = <new remote>
        fetch = +refs/heads/*:refs/remotes/origin/*
    
  4. Invia il repository a GitHub: git push

Puoi anche usare entrambi / più telecomandi .


Stavo cercando lo stesso problema e poi ho fatto lo stesso e risolto.
Mohit Patidar,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.