Poussez le repository Git local vers la nouvelle télécommande, y compris toutes les twigs et les balises

J’ai un repo Git local que je voudrais pousser vers un nouveau repo distant (tout nouveau repo mis en place sur Beanstalk, si cela compte). Mon repo local a quelques twigs et tags et je voudrais garder toute mon histoire. Il semble que je dois simplement faire un push de git, mais cela ne fait que télécharger la twig master. Comment puis-je tout pousser pour obtenir une réplique complète de mon repository local sur la télécommande?

Pour pousser toutes vos twigs , utilisez soit (remplacez REMOTE par le nom de la télécommande, par exemple “origine”):

git push REMOTE '*:*' git push REMOTE --all 

Pour pousser tous vos tags :

 git push REMOTE --tags 

Enfin, je pense que vous pouvez tout faire en une seule commande avec:

 git push REMOTE --mirror 

Cependant, --mirror , va également pousser vos télécommandes, donc ce n’est peut-être pas exactement ce que vous voulez.

Dans le cas comme moi, vous avez acquis un repo et passez maintenant de l’origine distante à un repo différent, un nouveau vide …

Donc, vous avez votre repo et toutes les twigs à l’intérieur, mais vous devez toujours extraire ces twigs pour que la commande git push --all également.

Vous devriez le faire avant de pousser:

 for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done 

Suivi par

 git push --all 

Voici une autre idée de la même chose qui a mieux fonctionné pour la situation dans laquelle j’étais. Elle résout le problème lorsque vous avez plusieurs télécommandes, que vous souhaitez cloner toutes les twigs de la source distante vers la destination distante destination sans avoir à les vérifier toutes. préalablement.

(Le problème que j’avais avec la solution de Daniel était qu’il refusait de contrôler une twig de suivi depuis la télécommande source si je l’avais déjà vérifiée, c’est-à-dire qu’elle ne mettrait pas à jour ma twig locale avant l’envoi)

 git push destination +refs/remotes/source/*:refs/heads/* 

Remarque: Si vous n’utilisez pas l’interface de ligne de commande directe, vous devez échapper aux astérisques:

git push destination +refs/remotes/source/\*:refs/heads/\*

  • @ mattalxndr

Cela poussera toutes les twigs de la source distante vers une twig principale de destination , effectuant éventuellement une poussée non rapide. Vous devez toujours pousser les étiquettes séparément.

La page de manuel pour git-push vaut la peine d’être lue. Combiné à ce site, j’ai écrit ce qui suit dans mon .git/config :

 [remote "origin"] url = … fetch = … push = : push = refs/tags/* 

Le push = : signifie “pousser toutes les twigs ‘correspondantes’ (c’est-à-dire les twigs qui existent déjà dans le référentiel distant et ont un homologue local)”, alors que push = refs/tags/* signifie “pousser toutes les balises”.

Il ne me rest plus qu’à lancer git push pour pousser toutes les twigs et tous les tags correspondants.

Oui, ce n’est pas tout à fait ce que l’OP voulait (toutes les twigs à pousser doivent déjà exister du côté distant), mais cela pourrait être utile pour ceux qui trouvent cette question en cherchant “comment pousser des twigs et des tags en même temps” temps”.

C’est la manière la plus concise que j’ai trouvée, à condition que la destination soit vide. Basculer vers un dossier vide puis:

 # Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v git clone --bare https://your-source-repo/repo.git . git push --mirror https://your-destination-repo/repo.git 

Remplacez https://... pour le file:///your/repo etc., selon le cas.

Dans mon cas, ce qui a fonctionné était.

 git push origin --all 

J’ai trouvé ci-dessus que les réponses ont encore des choses peu claires, ce qui induira les utilisateurs en erreur. Tout d’abord, il est certain que git push new_origin --all et git push new_origin --mirror ne peut pas dupliquer toutes les twigs d’origine, il ne fait que dupliquer vos twigs locales existantes sur votre new_origin.

Voici deux méthodes utiles que j’ai testées:

1, dupliquer par clone repo nu. git clone --bare origin_url , puis entrez le dossier, et git push new_origin_url --mirror De cette façon, vous pouvez aussi utiliser git clone --mirror origin_url , les deux --bare et --mirror téléchargeront un --mirror nu, non y compris l’espace de travail. veuillez vous référer à ceci

2, si vous avez un repo git en utilisant git clone , ce qui signifie que vous avez un repo nu et un espace de travail git, vous pouvez utiliser git remote add new_origin new_origin_url , puis git push new_origin +refs/remotes/origin/\*:refs/heads/\* , puis git push new_origin --tags

De cette façon, vous aurez une twig supplémentaire, ce qui n’a aucun sens.

Pour pousser des twigs et des étiquettes (mais pas des télécommandes):

 git push origin 'refs/tags/*' 'refs/heads/*' 

Cela équivaudrait à combiner les options --tags et --all pour git push , ce que git ne semble pas autoriser.

Basé sur la réponse de @Daniel, j’ai fait:

 for remote in \`git branch | grep -v master\` do git push -u origin $remote done 

J’ai trouvé que rien de tout cela ne semblait fonctionner correctement pour moi. N’hésitez pas à enflammer ceci jusqu’à la mort, mais pour une raison quelconque, vous ne pouviez pas faire fonctionner correctement les autres options.

Le résultat attendu était un repo “cloné” sur une autre télécommande (par exemple de Github à un autre fournisseur):

  • Toutes les twigs sont créées sur une nouvelle télécommande
  • Tout l’historique de la twig est créé sur la nouvelle télécommande
    • (cela a été manqué sur chaque solution que j’ai essayée)
  • Tous les tags sont créés sur la nouvelle télécommande
  • La source se déplace (une donnée)
  • Non destructif (donnant une pause à l’option –mirror)

Le problème majeur que je voyais était soit que toutes les twigs distantes ne soient pas recréées dans la nouvelle télécommande. Si une commande le faisait, la nouvelle télécommande n’avait pas l’historique de la twig (c’est-à-dire qu’elle faisait une git checkout branch; git log n’indiquait pas les commits de twig attendus).

J’ai remarqué que git checkout -b branchname n’est pas la même chose que git checkout branchname (ce dernier étant ce dont j’avais besoin). Je remarque que git checkout --track branchname n’a pas semblé tirer l’historique de la twig.

Ma solution (basée sur Powershell):

 Function Git-FetchRemoteBranches { $originalbranch = (git symbolic-ref HEAD).split("/")[-1] Foreach ($entry in (git branch -r)) { If ($entry -like "*->*") { $branch = $entry.split("->")[2].split("/")[1] } else {$branch = $entry.split("/")[1]} Write-Host "--Trying git checkout " -NoNewline Write-Host "$branch" -Foreground Yellow git checkout $branch Remove-Variable branch -Force ""} #Switch back to original branch, if needed If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) { "Switching back to original branch" git checkout $originalbranch Remove-Variable originalbranch -Force } } git clone http://remoterepo cd remoterepo Git-FetchRemoteBranches git remote add newremote git push newremote --all git push newremote --tags #Not sure if neeeded, but added for good measure 

Mise en miroir d’un référentiel

Créez un clone nu du référentiel.

 git clone --bare https://github.com/exampleuser/old-repository.git 

Mirror-push vers le nouveau référentiel.

 cd old-repository.git git push --mirror https://github.com/exampleuser/new-repository.git 

Supprimez le référentiel local temporaire que vous avez créé à l’étape 1.

 cd .. rm -rf old-repository.git 

Mise en miroir d’un référentiel contenant des objects Git Large File Storage

Créez un clone nu du référentiel. Remplacez le nom d’utilisateur de l’exemple par le nom de la personne ou de l’organisation propriétaire du référentiel et remplacez le nom du référentiel par le nom du référentiel que vous souhaitez dupliquer.

 git clone --bare https://github.com/exampleuser/old-repository.git 

Accédez au référentiel que vous venez de cloner.

 cd old-repository.git 

Extrayez les objects Git Large File Storage du référentiel.

 git lfs fetch --all 

Mirror-push vers le nouveau référentiel.

 git push --mirror https://github.com/exampleuser/new-repository.git 

Poussez les objects Git Large File Storage du référentiel sur votre miroir.

 git lfs push --all https://github.com/exampleuser/new-repository.git 

Supprimez le référentiel local temporaire que vous avez créé à l’étape 1.

 cd .. rm -rf old-repository.git 

Les instructions ci-dessus proviennent de l’aide de Github: https://help.github.com/articles/duplicating-a-repository/