Comment créer un nouveau dépôt GitHub à partir d'une branche dans un dépôt existant?

171

J'ai des branches master et new-project . Et maintenant, j'aimerais créer un tout nouveau repo avec son maître basé sur la branche nouveau projet.

Contexte: J'ai un référentiel qui contient trois applications indépendantes. Cela n'a pas commencé de cette façon. À l'origine, il n'y avait qu'une seule application dans le repo. Au fil du temps, cependant, les besoins des entreprises ont changé. Une application est devenue deux (une version héritée et une réécriture.) Un service Web a été ajouté. Des branches séparées ont été utilisées pour contenir les trois projets. Cependant, ils ne partagent aucun code. Et il serait donc plus simple de les diviser en leurs propres dépôts.

Dogweather
la source

Réponses:

294

J'ai commencé avec l'idée de @ user292677 et je l'ai affinée pour résoudre mon problème:

  1. Créez le new-repo dans github.
  2. cd dans votre copie locale de l'ancien référentiel à partir duquel vous souhaitez extraire, qui est configuré pour suivre la branche du nouveau projet qui deviendra le maître du nouveau référentiel .
  3. $ git push https://github.com/accountname/new-repo.git +new-project:master

Le nouveau repo Github est terminé. Le résultat est;

  • un nouveau référentiel Github nommé new-repo ,
  • dont mastercorrespond au nouveau projet de l'ancien repo , avec
  • toute l'histoire préservée.

En fait, j'ai trouvé qu'en utilisant cette méthode, je pouvais créer le nouveau repo avec une sélection de branches triée sur le volet, renommée comme je le voulais:

$ git push [email protected]:accountname/new_repo +new-project:master +site3a:rails3

Le résultat est que la branche site3a préexistante est désormais également déplacée vers le nouveau dépôt et apparaîtra sous la forme rails3 . Cela fonctionne très bien: le schéma de réseau montre le nouveau maître et les rails3 avec un historique complet et dans leur relation correcte l'un avec l'autre.

Mise à jour 07/12/2013: utilisé avec un autre projet et vérifié que cette recette fonctionne toujours.

Mise à jour du 11 janvier 2018: mise à jour de l'étape 3 pour utiliser la recommandation GitHub pour le protocole https. La recette fonctionne toujours.

Dogweather
la source
Salut @Dogweather, merci de partager ceci. pouvez-vous expliquer quelle est la différence entre votre méthode et changer l'url distante d'origine, pousser vers une nouvelle méthode de dépôt?
Vincent
5
Dogweather, j'ai utilisé votre solution plus que je ne me souviens. Merci! Je devais vérifier old_branch avant que cela ne fonctionne pour moi
Bjorn Theart
3
notez que cela ne copiera pas les balises. Je pense que vous en aurez peut-être besoin --follow-tags.
Factor Mystic
1
Notez que vous n'avez pas besoin de créer un dépôt sur Github, vous pouvez simplement en créer un pushlocal (c'est- git inità- dire au lieu de Github> Nouveau> ...)
OJFord
1
Je ne veux pas transférer tout mon historique de commit vers un nouveau dépôt, je voulais juste copier les commits qui appartiennent au référentiel enfant. Est-ce possible ??
Arbaz Rizvi
27

Mettre à jour:

cd vers le dépôt local contenant old_branch et:

$ git push https://github.com/accountname/new_repo.git +old_branch:master
Alexey Kislitsin
la source
9
git clone -b new-project /path/to/repo /new/repo/path

Edit: Dans GitHub, vous pouvez «fork» le repo, puis aller dans l'onglet Admin de votre clone. Sous «Nom du référentiel» et «Visibilité» se trouve «Branche par défaut» avec un menu déroulant de branches. Choisissez new-project.

Ré-éditer: je viens de réaliser que c'est la masterbranche que vous voulez définir, pas seulement la branche «par défaut». Alors…

  • Sur GitHub, clonez them/repovers you/repo.
  • Courir git clone [email protected]:you/repo.git
  • Commencez gitk.
  • [Vous voudrez peut-être créer une old-masterbranche pour ne pas perdre la trace des anciens commits.]
  • Recherchez le commit le plus récent sur la new-projectbranche, faites un clic droit sur le message de commit et sélectionnez «Réinitialiser la branche principale ici». (Vous pouvez également le faire sur la ligne de commande en utilisant git-reset, mais je n'ai pas trouvé le bon appel.)

Votre prochaine poussée vers votre dépôt GitHub devra être effectuée avec l' --forceoption, mais sinon, vous avez terminé.

S'il s'agit de l'un de vos propres dépôts, vous faites cela pour…

  • Courir git clone [email protected]:you/orig.git
  • Courir git clone orig copy
  • Comme je l'ai décrit ci-dessus, mais à partir du copydépôt local , réinitialisez la masterbranche là où vous le souhaitez.
  • Créez le projet GitHub vide you/copy. Suivez les instructions sur GitHub pour configurer ce projet en tant que télécommande pour votre version locale de copy, push master, et vous avez terminé!
JC Salomon
la source
Hmm! Je ne sais pas comment faire la première étape: cloner un dépôt dans github. Je ne pense pas que ce soit possible.
Dogweather
@Dogweather, ça s'appelle «forking» sur GitHub; J'ai modifié ma réponse pour plus de clarté.
JC Salomon
J'ai été incapable de créer un dépôt dans un seul compte. Avez-vous essayé vous-même?
Dogweather
5
  1. Créez le NEW_REPOSITORY dans github.
  2. cd OLD_REPOSITORY
  3. git push https://github.com/accountname/NEW_REPO + master: maître

Et c'est tout. (Remarque: histoire de git préservée)

J'avais essayé la réponse ci-dessus et je l'ai trouvée pas assez spécifique car elle ne spécifiait pas + master: master, ce dont j'avais besoin pour que cela fonctionne. Cela fonctionne très bien.

Source (avec mes modifications pour éviter les problèmes de ssh avec github): Mauricio Aiello, ancien développeur senior Java, https://www.quora.com/How-do-I-create-a-new-GitHub-repository-from-a -branche-dans-un-référentiel-existant

Joe
la source
C'est en fait plus utilisable que la réponse acceptée. Cela fonctionne même dans les situations où Git se plaint d'erreurs src refspec lorsqu'il ne parvient pas à pousser l'ancien vers le nouveau référentiel.
Informagic le
2

Je ne sais pas si c'est un bon moyen, mais c'est quand même facile:

git clone -b new-project [email protected]:User/YourProject.git newProjcet

Ensuite, créez un nouveau dépôt sur github et poussez-le.

Kjuly
la source
2

N'oubliez pas que lorsque vous créez simplement un nouveau dépôt, vous perdez la référence à l'ancien et il est plus difficile de maintenir une mise à jour du projet d'origine synchronisée avec le nouveau. N'est-il pas préférable de fourcher le repo?

Julio Flores
la source
0

Petit ajout à la bonne réponse:

$ git push [email protected]: nom de compte / new_repo + old_branch: maître

"[email protected]: accountname / new_repo" => obtenir depuis github le menu déroulant "Cloner ou télécharger"

Gerd
la source