GitHub: ¿Cómo hacer que una bifurcación del repositorio público sea privada?

247

¿Cómo puedo bifurcar un repositorio público, pero hacer que mi bifurcación sea privada? Tengo la suscripción para admitir repositorios privados.

zer0stimulus
fuente

Respuestas:

394

Las respuestas son correctas, pero no mencionan cómo sincronizar el código entre el repositorio público y la bifurcación.

Aquí está el flujo de trabajo completo (lo hemos hecho antes de abrir el código React Native ):


Primero, duplique el repositorio como otros dijeron (detalles aquí ):

Cree un nuevo repositorio (llamémoslo private-repo) a través de la interfaz de usuario de Github . Luego:

git clone --bare https://github.com/exampleuser/public-repo.git
cd public-repo.git
git push --mirror https://github.com/yourname/private-repo.git
cd ..
rm -rf public-repo.git

Clone el repositorio privado para que pueda trabajar en él:

git clone https://github.com/yourname/private-repo.git
cd private-repo
make some changes
git commit
git push origin master

Para sacar nueva actualidad del repositorio público:

cd private-repo
git remote add public https://github.com/exampleuser/public-repo.git
git pull public master # Creates a merge commit
git push origin master

Impresionante, su repositorio privado ahora tiene el último código del repositorio público más sus cambios.


Finalmente, para crear una solicitud de extracción de repositorio privado -> repositorio público:

Use la interfaz de usuario de GitHub para crear una bifurcación del repositorio público (el pequeño botón "Bifurcación" en la parte superior derecha de la página del repositorio público). Luego:

git clone https://github.com/yourname/the-fork.git
cd the-fork
git remote add private_repo_yourname https://github.com/yourname/private-repo.git
git checkout -b pull_request_yourname
git pull private_repo_yourname master
git push origin pull_request_yourname

Ahora puede crear una solicitud de extracción a través de la interfaz de usuario de Github para public-repo, como se describe aquí .

Una vez que los propietarios del proyecto revisen su solicitud de extracción, pueden fusionarla.

Por supuesto, todo el proceso puede repetirse (solo omita los pasos donde agrega controles remotos).

Martin Konicek
fuente
2
¿Por qué no se puede simplemente agregar el repositorio privado vacío como un nuevo control remoto a un clon normal del repositorio público y luego pasar al control remoto? ¿Cuál sería la diferencia?
Falko Menge
@FalkoMenge Tengo la misma pregunta. Al leer git-scm.com/docs/git-clone , parece que una git cloneconfiguración normal establecerá ramas de seguimiento remoto y tal vez alguna otra configuración en el repositorio clonado que realmente no desea. Mientras que un clon --bare simplemente copia el directorio .git del control remoto tal como está.
bennlich
1
¿Eso también empujará el historial de compromiso privado a la rama pública?
Sukhjinder Singh
1
@Sukhjinder Singh Sí, el último paso empujará el historial de confirmación privada al repositorio público. Si no quiere eso, puede aplastar sus confirmaciones al fusionarlas con el repositorio público y aplicar una única confirmación con todos sus cambios. Ver, por ejemplo, stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek
1
Pude dar un paso donde clono mi repositorio privado y luego hacer un cambio y luego presionar. Cualquier cambio que hice pasó desapercibido para git. git statusmuestra todo actualizado, el árbol de trabajo limpio, no importa lo que cambie. En consecuencia, no puedo comprometerme y presionar nada. Eliminé el nuevo repositorio privado que hice 2 veces más para intentarlo, pero seguí encontrando este mismo problema. ¿Alguna sugerencia?
Se
92

Hay una opción más ahora (enero-2015)

  1. Crea un nuevo repositorio privado
  2. En la pantalla de repositorio vacía hay una opción / botón "importar" ingrese la descripción de la imagen aquí
  3. haga clic en él y coloque la url de repositorio de github existente No se menciona la opción de github pero también funciona con repositorios de github. ingrese la descripción de la imagen aquí
  4. HECHO
szydan
fuente
19
Esto funciona, aunque un poco diferente. (Lo intenté en agosto de 2015). No encontré la opción / botón de importación, así que busqué en Google y terminé en esta URL. import.github.com/new Aquí, puede ingresar la URL de github existente y hacer clic en el botón Verificar . Una vez verificado, puede ingresar el nombre de su nuevo repositorio y hacer clic en el botón Privado y luego hacer clic en Comenzar importación
Shiva el
2
Creo que @MattvanAndel significa que el comentario es correcto, no la respuesta original. Yo también seguí el comentario de Shiva y funcionó. ¡Tenga en cuenta que NO debe crear primero el repositorio privado local!
David H
Si creo una "bifurcación" privada de esta manera y quiero volverla bifurcación pública, ¿puedo hacer eso?
Anders Lindén
2
@ Shiva Voy a votar si respondes a tu comentario.
bebbi
36

Las respuestas actuales están un poco desactualizadas, por lo que, para mayor claridad:

La respuesta corta es:

  1. Haz un clon desnudo del repositorio público.
  2. Crea uno nuevo privado.
  3. Haz un empuje espejo al nuevo privado.

Esto está documentado en GitHub: duplicating-a-repository

stefano
fuente
44
¿Hay alguna manera de sacar los cambios aguas arriba? Esto es importante para un repositorio que tiene una licencia liberal: he hecho mi repositorio privado pero todavía me gustaría fusionar los cambios aguas arriba.
amarprabhu
2
Si. Debería poder agregar el otro repositorio como un nuevo control remoto (seguimiento) (por ejemplo, 'otro-repo') y luego recuperar y combinar periódicamente los cambios (por ejemplo, 'git merge other-repo / stable').
stefano
26

Tienes que duplicar el repositorio

Puedes ver este documento (de github)

Para crear un duplicado de un repositorio sin bifurcación, debe ejecutar un comando de clonación especial contra el repositorio original y empujar en espejo al nuevo.

En los siguientes casos, el repositorio al que intenta ingresar, como exampleuser / new-repository o exampleuser / mirrored, ya debería existir en GitHub. Consulte "Creación de un nuevo repositorio" para obtener más información.

Reflejando un repositorio

Para hacer un duplicado exacto, debe realizar un clon desnudo y un empuje espejo.

Abra la línea de comando y escriba estos comandos:

$ git clone --bare https://github.com/exampleuser/old-repository.git
# Make a bare clone of the repository

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

$ cd ..
$ rm -rf old-repository.git
# Remove our temporary local repository

Si desea duplicar un repositorio en otra ubicación, incluida la obtención de actualizaciones del original, puede clonar un reflejo e impulsar periódicamente los cambios.

$ git clone --mirror https://github.com/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository

$ cd repository-to-mirror.git
$ git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror

Al igual que con un clon desnudo, un clon reflejado incluye todas las ramas y etiquetas remotas, pero todas las referencias locales se sobrescribirán cada vez que obtenga, por lo que siempre será el mismo que el repositorio original. Establecer la URL para los empujes simplifica empujar a su espejo. Para actualizar su espejo, obtenga actualizaciones y presione, lo que podría automatizarse ejecutando un trabajo cron.

$ git fetch -p origin
$ git push --mirror

https://help.github.com/articles/duplicating-a-repository

bsuttor
fuente
Esto crea un clon del repositorio pero no crea una bifurcación en el sentido de GitHub. Cuando crea una bifurcación real en GitHub, muestra un texto "bifurcado de ejemplousuario / repositorio a espejo" debajo del nombre de la bifurcación. También muestra un árbol de todos los demás tenedores cuando navega a github.com/exampleuser/new-repository/network/members.
apaatsio
20

GitHub ahora tiene una opción de importación que le permite elegir lo que quiera su nuevo repositorio importado público o privado

Importación del repositorio de Github

Yidir
fuente
La importación todavía se está ejecutando en un repositorio grande (5 días), verificarlos es mucho más rápido, pero tal vez sean más pasos para mantenerlo actualizado. Supongo que la lentitud es comprensible ya que importa todo, no solo la rama maestra, sino que desearía que fuera más rápido ...
Liam Mitchell
1
Iba a agregar la misma respuesta, pero gracias por hacerlo primero. Me alegro de que los repositorios privados de Github Free estén disponibles desde enero del año pasado. : D
OBL