J'ai un dépôt Git local que je souhaiterais transmettre à un nouveau dépôt distant (un nouveau dépôt installé sur Beanstalk, si cela compte). Mon dépôt local a quelques branches et tags et j'aimerais garder toute mon histoire. Il semble que je doive simplement faire un git Push, mais cela ne fait que télécharger la branche principale. Comment puis-je tout pousser pour obtenir une réplique complète de mon dépôt local sur la télécommande?
Pour pousser toutes vos branches , utilisez l’une des deux (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 faire tout cela en une seule commande avec:
_git Push REMOTE --mirror
_
Cependant, en plus --mirror
, Poussez aussi vos télécommandes, ce qui pourrait ne pas être exactement ce que vous voulez.
Dans le cas comme moi, vous avez acquis une pension et changez maintenant d'Origine distante pour une autre, une nouvelle vierge.
Donc, vous avez votre référentiel et toutes les branches à l'intérieur, mais vous devez toujours vérifier ces branches pour que la commande git Push --all
puisse réellement les pousser aussi.
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 version de la même chose qui a mieux fonctionné pour la situation dans laquelle je me trouvais. Elle résout le problème où vous avez plusieurs télécommandes, voudriez cloner toutes les branches de la télécommande source
vers la télécommande destination
mais sans avoir à les vérifier au préalable.
(Le problème que je rencontrais avec la solution de Daniel était qu'il refuserait de valider une branche de suivi de la télécommande source
si je l'avais déjà extraite, c'est-à-dire qu'elle ne mettrait pas à jour ma branche locale avant le Push.)
git Push destination +refs/remotes/source/*:refs/heads/*
Remarque: Si vous n'utilisez pas l'interface de ligne de commande directe, vous devez vous échapper des astérisques:
git Push destination +refs/remotes/source/\*:refs/heads/\*
cela poussera toutes les branches de la télécommande source
vers une branche principale de destination
, en effectuant éventuellement une pression d’avance non rapide. Vous devez toujours pousser les balises séparément.
La page de manuel de git-Push
mérite une lecture. Combiné avec ce site j'ai écrit ce qui suit dans mon .git/config
:
[remote "Origin"]
url = …
fetch = …
Push = :
Push = refs/tags/*
Push = :
signifie "Appuyez sur toutes les branches" correspondantes "(c'est-à-dire des branches qui existent déjà dans le référentiel distant et ont une contrepartie locale)", tandis que Push = refs/tags/*
signifie "Toutes les balises".
Alors maintenant, je n'ai plus qu'à lancer git Push
pour envoyer toutes les branches et tous les tags correspondants.
Oui, ce n'est pas tout à fait ce que souhaitait le PO (toutes les branches vers Push doivent déjà exister côté distant), mais pourrait être utile pour ceux qui trouvent cette question tout en recherchant Google, "comment puis-je pousser des branches et des tags en même temps?" temps".
C’est le moyen le plus concis que j’ai trouvé, à condition que la destination soit vide. Basculez 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://...
par file:///your/repo
etc. selon le cas.
Dans mon cas, ce qui a fonctionné a été.
git Push Origin --all
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
Miroir-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 créé à l'étape 1.
cd ..
rm -rf old-repository.git
Mise en miroir d'un référentiel contenant des objets de stockage de fichiers Git Large
Créez un clone nu du référentiel. Remplacez l'exemple de nom d'utilisateur par le nom de la personne ou de l'organisation à qui appartient le référentiel, puis remplacez le nom du référentiel d'exemple 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 objets Git Large File Storage du référentiel.
git lfs fetch --all
Miroir-Push vers le nouveau référentiel.
git Push --mirror https://github.com/exampleuser/new-repository.git
Poussez les objets 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 créé à l'étape 1.
cd ..
rm -rf old-repository.git
Les instructions ci-dessus proviennent de l’aide Github: https://help.github.com/articles/duplicating-a-repository/
J'ai trouvé les réponses ci-dessus ont encore des choses pas claires, ce qui induira les utilisateurs en erreur. Premièrement, il est certain que git Push new_Origin --all
et git Push new_Origin --mirror
ne peuvent pas dupliquer toutes les branches d’Origin, cela ne fait que dupliquer vos branches existantes locales vers votre new_Origin.
Voici deux méthodes utiles que j'ai testées:
1, dupliquez par le repérage nu .git clone --bare Origin_url
, puis entrez le dossier, et git Push new_Origin_url --mirror
.Par cette façon, vous pouvez également utiliser git clone --mirror Origin_url
, à la fois --bare
et --mirror
pour télécharger un repo nu, espace de travail non compris. s'il vous plaît se référer this
2, Si vous avez un dépôt Git en utilisant git clone
, ce qui signifie que vous avez un espace de travail 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 obtiendrez une branche supplémentaire, ce qui n’a aucun sens.
Pour pousser des branches et des tags (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é dans @ Daniel j'ai répondu:
for remote in \`git branch | grep -v master\`
do
git Push -u Origin $remote
done
J'ai trouvé qu'aucun de ceux-ci ne semblait fonctionner correctement pour moi. N'hésitez pas à flamber à mort, mais pour une raison quelconque, les autres options ne pourraient pas fonctionner correctement.
Le résultat attendu était un dépôt "cloné" vers une autre télécommande (c.-à-d. De Github à un autre fournisseur):
Le problème majeur que je voyais était que toutes les branches distantes n'avaient pas été recréées dans la nouvelle télécommande. Si une commande existait, la nouvelle télécommande n'avait pas l'historique de la branche (par exemple, un git checkout branch; git log
ne montrerait pas les modifications de branche attendues).
J'ai remarqué que git checkout -b branchname
n'est PAS identique à git checkout branchname
(ce dernier étant ce dont j'avais besoin). Je remarque que git checkout --track branchname
ne semble pas avoir tiré l'historique de la branche.
Ma solution (basé 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