web-dev-qa-db-fra.com

Comment annuler 'git fetch'

Je viens d'ajouter remote A supplémentaire à mon repo B, puis d'exécuter git fetch A. Comment puis-je annuler la récupération? Si je supprime simplement remote A: git remote remove A1 cela annulerait-il l'extraction?

UPDATE:

git remote add A path/to/A

git fetch A

Les commandes ci-dessus sont exécutées de manière à obtenir toutes les branches récupérées dans mon repo B; cependant, il me faut juste une branche spécifique de repo A et il me faut aller dans un dossier spécifique sur repo B, mais c’est une autre histoire Fusionnez le code entre deux référentiels git

13
sreginogemoh

Vous pouvez annuler all fetch à partir de la variable A en supprimant simplement cette télécommande:

git remote remove A

Maintenant, ajoutez-le à nouveau et ne récupérez qu'une seule branche:

git remote add A <path/to/repository>
git fetch A <name of branch>
19
qzb

C'est difficile1 pour "annuler" un git fetch, mais il n'y a jamais2 toute raison pour besoin d'annuler un git fetch.

Rappelez-vous que git fetch appelle la télécommande, obtient la liste des mappages SHA-1 des noms de branches vers SHA-1, amène les commits et autres objets nécessaires pour les stocker dans votre référentiel, puis met à jour vos branches de suivi à distance afin qu'ils indiquent la branche actuelle de la télécommande (au moment où vous l'avez appelée) des astuces de branche. Cela n'a aucun effet sur vos fichiers d'arborescence de travail et si vous exécutez à nouveau git fetch demain, tout travail effectué aujourd'hui peut être ignoré demain. Si vous faites réussissez à annuler la fetch, celui qui s'exécutera demain devra refaire le travail effectué aujourd'hui. Il s'agit donc d'une perte nette: vous venez de faire un effort pour que votre git doive apporter plus de code sur le réseau demain.

Cela dit, le temps des notes de bas de page. :-)


1Ce n'est pas que difficile si vous avez des réflexions à distance (ce que vous faites probablement): utilisez-les simplement pour rechercher des branches de suivi à distance mises à jour dans la dernière extraction: ces mêmes informations peuvent également être disponibles dans le fichier FETCH_HEAD —Et utilisez ensuite git update-ref pour renvoyer ces références à leurs entrées de reflog précédentes. Mais cela laissera toujours les objets récupérés dans votre référentiel, aussi, pour vraiment les effacer, vous devez également supprimer les entrées de reflog intermédiaires, puis exécuter git gc --Prune=now, ce qui nécessite beaucoup de précautions et éliminera tous les objets non référencés. , pas seulement celles apportées par la plus récente fetch.

2Je pense que l’on pourrait soutenir que "l’espace disque insuffisant" pourrait constituer une raison, en particulier si un objet volumineux a été accidentellement poussé vers la télécommande et sera supprimé de la télécommande par la prochaine variable fetch. Travailler dans un système de fichiers qui manque d'espace est cependant difficile en général et je ne suis pas sûr de vouloir faire beaucoup plus que déplacer l'ensemble du référentiel ailleurs (quelque part sans les problèmes d'espace disque).

10
torek

J'ai vraiment aimé la réponse de torek, mais cela ne vous donne pas la commande de "mettre à jour les réflexions", ce qui est exactement ce que je cherchais. J'ai trouvé cela dans une autre réponse inverse un git fetch , donc je le laisse juste ici pour simplifier la recherche des autres.

Supposons que vous avez votre Origin à distance et que votre branche develop locale est basée sur master, mais que votre master est derrière Origin/master (mais vous ne le voyez pas encore, car vous n'avez pas encore récupéré Origin. Ainsi, l'exécution de git fetch ajoutera de nouveaux commits à partir de Origin/master et des balises à votre dépôt local. Dans certains cas, vous ne voulez pas du tout {voir} _ et cela réduira la lisibilité de votre historique.

Cela dit, vous pouvez "annuler" git fetch en faisant:

git update-ref refs/remotes/Origin/master refs/remotes/Origin/master@{1}

Tout ce qu'il fait est simplement de changer le pointeur Origin/master à l'état précédent. Peut-être devrez-vous jouer avec {n} un peu pour obtenir l'état exact, mais en général, cela peut aider.

1
The Godfather

Vous pouvez supprimer les branches que vous avez récupérées par inadvertance et que vous ne souhaitez pas conserver avec la commande suivante: 

git update-ref -d refs/remotes/YOUR_REMOTE_NAME/BRANCH_NAME_TO_DELETE

Pour éviter qu’ils ne soient à nouveau récupérés, configurez votre télécommande git pour qu’elle ne récupère que les branches spécifiées: git remote set-branches YOUR_REMOTE_NAME desired_branch1 [desired_branch2, desired_branch3, etc], par exemple. git remote set-branches Origin master.

Le comportement par défaut de set-branches est de toujours remplacer la liste. Si vous souhaitez ajouter, utilisez l'option --add: git remote set-branches --add Origin another_branch

0
Olimon F.