GitHub: Comment rendre privé un fork de dépôt public?

247

Comment puis-je bifurquer un référentiel public, mais rendre mon fork privé? J'ai l'abonnement pour prendre en charge les référentiels privés.

zer0stimulus
la source

Réponses:

394

Les réponses sont correctes mais ne mentionnent pas comment synchroniser le code entre le dépôt public et le fork.

Voici le workflow complet (nous l'avons fait avant l'open sourcing React Native ):


Tout d'abord, dupliquez le dépôt comme d'autres l'ont dit (détails ici ):

Créez un nouveau dépôt (appelons-le private-repo) via l' interface utilisateur de Github . Ensuite:

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

Clonez le référentiel privé pour pouvoir y travailler:

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

Pour tirer une nouvelle actualité du référentiel public:

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

Génial, votre référentiel privé dispose désormais du dernier code du référentiel public ainsi que de vos modifications.


Enfin, pour créer un dépôt privé de pull request -> repo public:

Utilisez l'interface utilisateur GitHub pour créer un fork du référentiel public (le petit bouton "Fork" en haut à droite de la page du référentiel public). Ensuite:

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

Vous pouvez maintenant créer une demande d'extraction via l'interface utilisateur Github pour public-repo, comme décrit ici .

Une fois que les propriétaires de projet ont examiné votre demande d'extraction, ils peuvent la fusionner.

Bien sûr, tout le processus peut être répété (laissez de côté les étapes où vous ajoutez des télécommandes).

Martin Konicek
la source
2
Pourquoi ne peut-on pas simplement ajouter le référentiel privé vide en tant que nouvelle télécommande à un clone normal du référentiel public, puis pousser vers la télécommande? Quelle serait la différence?
Falko Menge du
@FalkoMenge J'ai la même question. En lisant git-scm.com/docs/git-clone , cela ressemble à un normal git clonequi mettra en place des branches de suivi à distance et peut-être une autre configuration dans le dépôt cloné que vous ne voulez pas vraiment. Alors qu'un clone --bare copie simplement le répertoire .git de la télécommande tel quel.
bennlich
1
Cela poussera-t-il également l'historique des engagements privés vers la branche publique?
Sukhjinder Singh
1
@Sukhjinder Singh Oui, la dernière étape poussera l'historique des validations privées vers le référentiel public. Si vous ne le souhaitez pas, vous pouvez écraser vos commits lors de leur fusion vers le référentiel public et pousser un seul commit avec toutes vos modifications. Voir par exemple stackoverflow.com/questions/5308816/how-to-use-git-merge-squash
Martin Konicek
1
Je suis arrivé à l'étape où je clone mon référentiel privé, puis je fais un changement puis je pousse. Toutes les modifications que j'ai apportées sont passées inaperçues par git. git statusmontre tout à jour, arbre de travail propre, peu importe ce que je change. Par conséquent, je ne peux rien engager et pousser quoi que ce soit. J'ai supprimé le nouveau dépôt privé que j'ai fait 2 fois de plus pour tenter cela, mais j'ai continué à rencontrer ce même problème. Aucune suggestion?
Will
92

Il y a une option de plus maintenant (janvier-2015)

  1. Créer un nouveau dépôt privé
  2. Sur l'écran vide du repo, il y a une option / bouton "importer" entrez la description de l'image ici
  3. cliquez dessus et mettez l'url de dépôt github existante Il n'y a aucune mention d'option github mais cela fonctionne aussi avec les dépôts github. entrez la description de l'image ici
  4. TERMINÉ
Szydan
la source
19
Cela fonctionne, quoique un peu différemment. (J'ai essayé en août 2015). Je n'ai pas trouvé l'option / bouton d'importation, alors je l'ai googlé et je me suis retrouvé dans cette URL. import.github.com/new Ici, vous pouvez entrer l'url github existante et cliquer sur le bouton Check it . Une fois vérifié, vous pouvez entrer le nom de votre nouveau référentiel et cliquer sur le bouton Privé puis sur Commencer l'importation
Shiva
2
Je crois que @MattvanAndel signifie que le commentaire est correct, pas la réponse originale. J'ai moi aussi suivi le commentaire de Shiva et cela a fonctionné. Notez que vous ne devez PAS d'abord créer le référentiel privé local!
David H
Si je crée un "fork" privé de cette manière et que je veux en faire un fork public à nouveau, puis-je le faire?
Anders Lindén
2
@Shiva Je voterai positivement si vous répondez à votre commentaire.
bebbi
36

Les réponses actuelles sont un peu obsolètes donc, pour plus de clarté:

La réponse courte est:

  1. Faites un clone nu du repo public.
  2. Créez-en un nouveau privé.
  3. Faites un push miroir vers le nouveau privé.

Ceci est documenté sur GitHub: duplication d'un référentiel

Stefano
la source
4
Existe-t-il un moyen de tirer des changements en amont? Ceci est important pour un repo qui a une licence libérale - j'ai rendu mon repo privé mais j'aimerais quand même fusionner les changements en amont.
amarprabhu
2
Oui. Vous devriez être en mesure d'ajouter l'autre dépôt en tant que nouvelle télécommande (de suivi) (par exemple, 'autre-repo'), puis d'extraire et de fusionner périodiquement les modifications à partir de celui-ci (par exemple, 'git merge other-repo / stable').
stefano
26

Vous devez dupliquer le repo

Vous pouvez voir ce document (depuis github)

Pour créer un doublon d'un référentiel sans bifurquer, vous devez exécuter une commande de clonage spéciale par rapport au référentiel d'origine et pousser en miroir vers le nouveau.

Dans les cas suivants, le référentiel vers lequel vous essayez de pousser - comme exampleuser / new-repository ou exampleuser / mirrored - devrait déjà exister sur GitHub. Voir "Création d'un nouveau référentiel" pour plus d'informations.

Mise en miroir d'un référentiel

Pour créer un doublon exact, vous devez effectuer à la fois un clone nu et un push miroir.

Ouvrez la ligne de commande et tapez ces commandes:

$ 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 vous souhaitez mettre en miroir un référentiel dans un autre emplacement, notamment en obtenant des mises à jour à partir de l'original, vous pouvez cloner un miroir et pousser régulièrement les modifications.

$ 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

Comme avec un clone nu, un clone en miroir inclut toutes les branches et balises distantes, mais toutes les références locales seront écrasées à chaque fois que vous les récupérez, ce sera donc toujours la même que le référentiel d'origine. La définition de l'URL pour les push simplifie la transmission vers votre miroir. Pour mettre à jour votre miroir, récupérez les mises à jour et envoyez-les, qui pourraient être automatisées en exécutant une tâche cron.

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

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

bsuttor
la source
Cela crée un clone du dépôt mais cela ne crée pas de fork au sens de GitHub. Lorsque vous créez un fork réel dans GitHub, il affiche un texte "forked from exampleuser / repository-to-mirror" sous le nom du fork. Il affiche également un arbre de toutes les autres fourches lorsque vous accédez à github.com/exampleuser/new-repository/network/members.
apaatsio
20

GitHub a maintenant une option d'importation qui vous permet de choisir ce que vous voulez que votre nouveau référentiel importé soit public ou privé

Importation du référentiel Github

Yidir
la source
L'importation est toujours en cours d'exécution sur un grand référentiel (5 jours), les vérifier est beaucoup plus rapide mais c'est peut-être plus d'étapes pour le garder à jour. La lenteur est compréhensible, je suppose, car elle importe tout, pas seulement la branche principale, mais j'aurais aimé qu'elle soit plus rapide ...
Liam Mitchell
1
J'allais ajouter la même réponse mais merci de l'avoir fait en premier. Heureux que Github Free repos privé disponible depuis janvier de l'année dernière. : D
OBL