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):
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/