¿Git empuja el repositorio existente a un nuevo y diferente servidor de repositorio remoto?

494

Digamos que tengo un repositorio en git.fedorahosted.org y quiero clonar esto en mi cuenta en github para tener mi propio patio de juegos aparte del repositorio más "oficial" en fedorahosted. ¿Cuáles serían los pasos para copiar eso inicialmente? Dentro de github existe este bonito botón "fork", pero no puedo usarlo por razones obvias.

¿Y cómo rastrearía los cambios en el repositorio fedorahosted en el github?

Heiko Rupp
fuente

Respuestas:

751
  1. Crea un nuevo repositorio en github.
  2. Clone el repositorio de fedorahosted a su máquina local.
  3. git remote rename origin upstream
  4. git remote add origin URL_TO_GITHUB_REPO
  5. git push origin master

Ahora puede trabajar con él como cualquier otro repositorio de Github. Para obtener parches desde arriba, simplemente ejecute git pull upstream master && git push origin master.

troelskn
fuente
14
No hay ninguna razón para cambiar el nombre del origen original, simplemente llame al nuevo terreno de juego de otra manera.
tacaswell
34
@tcaswell Técnicamente no, pero es una convención fuerte que originapunta a la ubicación remota canónica. En este caso, la ubicación de Github presumiblemente sería la canónica.
troelskn
1
Consideraría que 'aguas arriba' es la ubicación canónica, pero creo que esto comienza a dividir los pelos.
tacaswell
3
Tal vez debería publicar una pregunta diferente, pero creo que ustedes están discutiendo lo que quiero. Me gustaría agregar un nuevo control remoto, no reemplazar el existente para poder continuar extrayendo del antiguo repositorio pero empujar cualquier cambio al nuevo.
ThatAintWorking
13
@ThatAintWorking Probablemente debería abrir una nueva pregunta, pero en resumen: puede agregar cualquier número de controles remotos con el comando git remote add. Luego puede presionar a uno de ellos indicando explícitamente el control remoto git push. Por ejemplo, git push foobar masterpara empujar la rama actual al mastercontrol remoto foobar.
troelskn
108

Hay una respuesta eliminada a esta pregunta que tenía un enlace útil: https://help.github.com/articles/duplicating-a-repository

La esencia es

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

Ejemplo de OP:

En su máquina local

$ 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
multitud
fuente
55
¿Cuál es el beneficio del clon desnudo y el retroceso espejo simplemente agregando y presionando a otro control remoto? ¿Es que todas las ramas serán empujadas y no solo la rama actual? (Si es así, esto parece una limitación de la respuesta aceptada que debe tenerse en cuenta.)
yoyo
3
Esta era exactamente la información que estaba buscando, ¡el --bare / --mirror es generalmente lo que la gente quiere realizar! Esta es una respuesta importante! Gracias
claf
1
¡Excelente! Definitivamente la respuesta más correcta sobre la pregunta del tema. ¡Gracias! Si no lo hago así, siempre me saleerror: failed to push some refs to 'https://github.com/username/testrep.git'
Denis Babarykin
45

Para llevar su repositorio existente a otro, debe:

  1. Clone el repositorio original primero.

    git clone https://git.fedorahosted.org/cgit/rhq/rhq.git
    
  2. Empuje las fuentes clonadas a su nuevo repositorio:

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

Puedes cambiar master:mastera source:destinationrama.


Si desea impulsar una confirmación específica (rama), entonces:

  1. En el repositorio original, cree y finalice una nueva sucursal:

    git checkout -b new_branch
    
  2. Elija y restablezca el punto con el que desea comenzar:

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

    Alternativamente, seleccione el commit by git cherry-pickpara agregarlo a HEAD existente.

  3. Luego presione a su nuevo repositorio:

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

    Si está haciendo un rebase, úselo -fpara forzar el empuje (no recomendado). Corre git reflogpara ver el historial de cambios.

kenorb
fuente
2
el git push ... old_branch_name:new_branch_namele permite empujar una rama de la característica de la vieja repositorio como la rama principal en el nuevo repositorio. Útil!
gorjanz
Esta fue la forma más sencilla para que lo haga.
Adam
15

¿Realmente desea simplemente empujar su repositorio local (con sus ramas locales, etc.) al nuevo control remoto o realmente desea reflejar el control remoto anterior (con todas sus ramas, etiquetas, etc.) en el nuevo control remoto? Si este último, aquí hay un gran blog sobre Cómo reflejar correctamente un repositorio git .

Le recomiendo que lea el blog para obtener algunos detalles muy importantes, pero la versión corta es esta:

En un nuevo directorio ejecute estos comandos:

git clone --mirror [email protected]/upstream-repository.git
cd upstream-repository.git
git push --mirror [email protected]/new-location.git
Pelo del perro
fuente
Creo que este es el enlace: blog.plataformatec.com.br/2013/05/…
David
11

Pruebe esto Cómo mover un repositorio completo de Git

  1. Cree un repositorio local en el directorio temp-dir usando:

    git clone temp-dir

  2. Entra en el directorio temp-dir.

  3. Para ver una lista de las diferentes sucursales en ORI, haga lo siguiente:

    git branch -a
    
  4. Verifique todas las ramas que desea copiar de ORI a NEW usando:

    git checkout branch-name
    
  5. Ahora busque todas las etiquetas de ORI usando:

    git fetch --tags
    
  6. Antes de realizar el siguiente paso, asegúrese de verificar sus etiquetas y ramas locales utilizando los siguientes comandos:

    git tag
    
    
    git branch -a
    
  7. Ahora borre el enlace al repositorio ORI con el siguiente comando:

    git remote rm origin
    
  8. Ahora vincule su repositorio local a su NUEVO repositorio recién creado usando el siguiente comando:

    git remote add origin <url to NEW repo>
    
  9. Ahora empuje todas sus ramas y etiquetas con estos comandos:

    git push origin --all
    
    
    git push --tags
    
  10. Ahora tiene una copia completa de su repositorio ORI.

vm345
fuente
9

Encontré una solución usando set-url que es concisa y bastante fácil de entender :

  1. crear un nuevo repositorio en Github
  2. cd en el repositorio existente en su máquina local (si aún no lo ha clonado, hágalo primero)
  3. git remote set-url origin https://github.com/user/example.git
  4. git push -u origin master
Mobiletainment
fuente
9

Si tiene un repositorio Git existente:

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
fuente
1
Solo para aclarar, --todos empujarán todas las ramas
GilCol
7

Simplemente apunte el nuevo repositorio cambiando la URL del repositorio GIT con este comando:

git remote set-url origin [new repo URL]

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

Ahora, empujar y tirar están vinculados al nuevo REPO.

Luego presione normalmente así:

git push -u origin master
Abdel Ourimchi
fuente
2

He tenido el mismo problema.

En mi caso, dado que tengo el repositorio original en mi máquina local, hice una copia en una nueva carpeta sin ningún archivo oculto (.git, .gitignore).

Finalmente, agregué el archivo .gitignore a la nueva carpeta creada.

Luego, he creado y agregado el nuevo repositorio desde la ruta local (en mi caso, usando GitHub Desktop).

itrascastro
fuente
1

Aquí hay una forma manual de hacer git remote set-url origin [new repo URL]:

  1. Clonar el repositorio: git clone <old remote>
  2. Crear un repositorio de GitHub
  3. Abierto <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
    

    y cambie el control remoto (la opción de URL)

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

También puede usar ambos controles remotos múltiples .

upe
fuente
Estaba buscando el mismo problema y luego hice lo mismo y funcionó.
Mohit Patidar