2016-12-14 4 views
0

Ce que dit le titre. Je souhaite réinitialiser chaque branche locale pour qu'elle corresponde à mon référentiel distant, y compris la suppression de certaines branches et balises qui existent uniquement localement, sans devoir tout supprimer et tout cloner de zéro. Tout ce que je pourrais trouver sont des instructions sur la façon de réinitialiser une branche spécifique, mais pas l'ensemble du dépôt.Comment réinitialiser l'ensemble du dépôt Git, et pas seulement la branche "Maître", pour faire correspondre Remote?

Encore mieux si cela peut être fait à partir de l'extension TortoiseGit Shell. Mais je vais aussi bien avec la ligne de commande.

+0

Ceci est peut-être un double de http://stackoverflow.com/questions/13064613/how-to-prune-local-tracking-branches-that-do-not-exist-on-remote-anymore – Juuuuuu

+0

l'état initial le voulez-vous? Voulez-vous que les reflogs pour les branches survivantes soient conservés? Fusionner les options? La réponse la plus brutale consiste simplement à cloner sans réécrire, '' 'git clone --reference = .git' git config remote.origin.url' ../newclone; cp -al .git/objects ../newclone/.git; rm ../ newclone/.git/objects/info/alternates''' mais cela ne préserve pas les options de reflogs ou de fusion/pull ou quoi que ce soit, c'est un clone complètement vierge. – jthill

+0

@jthill Je veux vraiment un clone exact de Remote, donc votre solution semble être valide. Pour l'instant je suis allé avec [la réponse de PetSerAl] (http://stackoverflow.com/a/41147559/3258851), mais si vous savez que votre suggestion serait préférable et pourquoi, je pourrais changer la réponse choisie! –

Répondre

1

Vous pouvez le faire par les commandes suivantes:

git checkout --orphan @ 
git fetch <Remote> refs/*:refs/* --refmap= --prune --force 

<Remote> est le dépôt distant que vous souhaitez utiliser. Vous avez simplement fetch toutes les références à distance (refs/*:refs/*) avec les indicateurs --prune et --force pour supprimer et forcer la mise à jour des références locales.

+0

Bonne idée, mais cela va refléter la télécommande, y compris son suivi à distance, pas tout à fait ce que l'OP veut. – jthill

+0

@jthill OP demander: * Comment réinitialiser le ** dépôt ** Git entier *. Si vous voulez réinitialiser autre chose, comme seulement les branches et les balises, vous devez changer les refspecs pour ce que vous voulez. Par exemple: 'refs/têtes/*: refs/têtes/* refs/tags/*: refs/tags/*'. – PetSerAl

0

La ligne suivante réinitialise toutes les branches locales qui ont une branche amont configuré à l'état de la branche amont

git checkout @{0} && git for-each-ref refs/heads --format '%(refname:strip=2)' | xargs -ri sh -c 'git rev-parse {}@{u} >/dev/null 2>&1 && git branch -f {} $(git rev-parse {}@{u})' 

Vous finirez avec une maison individuelle HEAD en raison de la première commande, parce que vous ne pouvez pas réinitialiser la branche actuellement extraite, donc checkout la branche que vous voulez avoir dans votre répertoire de travail après cela.