web-dev-qa-db-fra.com

Poussez le dépôt Git local vers une nouvelle télécommande, y compris toutes les branches et les tags

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?

486
Cory Imdieke

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.

787
cmcginty

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
137
Daniel

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.

85
Pieter Breed

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".

12
scy

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.

9
ta.speot.is

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

git Push Origin --all
9
nomulex

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/

5
Michał Zalewski

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.

4
yanzi1225627

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.

2
CEL

Basé dans @ Daniel j'ai répondu:

for remote in \`git branch | grep -v master\`
do 
    git Push -u Origin $remote
done
2
Arthur Julião

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

  • Toutes les branches sont créées sur une nouvelle télécommande
  • Tous les historiques de branches sont créés sur un nouveau périphérique distant
    • (cela a été oublié à chaque solution que j'ai essayée)
  • Tous les tags sont créés sur une nouvelle télécommande
  • La source se déplace (donnée)
  • Non destructif (donnant une pause à l'option --mirror)

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
1
PotatoFarmer