Taille automatique avec Git fetch or pull

248

Si quelqu'un a supprimé une branche distante parce que le travail est terminé et je ne sais pas, je ne le ferai pas git fetch --pruneet finalement je repousserai la branche supprimée.

Existe-t-il une solution viable pour forcer Git à utiliser le mode prune lors de la récupération / extraction sans avoir à le spécifier à chaque fois?

Edmondo1984
la source
1
Vous pourrez bientôt (git 1.8.5, Q4 2013) pouvoir spécifier dans la config locale d'un repo que vous souhaitez toujours taillergit fetch ! Voir ma réponse ci
VonC

Réponses:

395

Depuis git 1.8.5 (T4 2013) :

" git fetch" (d'où " git pull" également) a appris à vérifier les variables de configuration " fetch.prune" et " remote.*.prune" et à se comporter comme si l' --pruneoption de ligne de commande " " était donnée.

Cela signifie que, si vous définissez remote.origin.prune sur true:

git config remote.origin.prune true

Tout git fetchou git pulltaille automatiquement.

Remarque: Git 2.12 (Q1 2017) corrigera un bogue lié à cette configuration, ce qui rendrait git remote rename mauvais comportement.
Voir " Comment renommer une télécommande git? ".


Voir plus sur commit 737c5a9 :

Sans pour autant "git fetch --prune ", les branches de suivi à distance pour une branche que l'autre côté a déjà supprimée resteront pour toujours.
Certaines personnes veulent toujours exécuter " git fetch --prune".

Pour répondre aux besoins des utilisateurs souhaitant toujours tailler ou lors de l'extraction à partir d'une télécommande particulière, ajoutez deux nouvelles variables de configuration "fetch.prune " et " remote.<name>.prune":

  • " fetch.prune" permet d'activer le pruneau pour toutes les opérations de récupération.
  • "remote.<name>.prune " permet de changer le comportement par télécommande.

Ce dernier remplacera naturellement le premier, et l' --[no-]pruneoption de la ligne de commande remplacera la valeur par défaut configurée.

Comme il --prunes'agit d'une opération potentiellement destructrice (Git ne conserve pas encore les reflogs pour les références supprimées), nous ne voulons pas tailler sans le consentement des utilisateurs, donc cette configuration ne sera pas activée par défaut.

VonC
la source
4
Ceci est en effet inclus dans le git 1.8.5 maintenant publié
Bessey
1
Je veux ce comportement par défaut dans tous mes git repos. Y a-t-il des endroits où je peux mettre cela dans mon .gitconfig pour y arriver?
Andrew
47
@Andrew serait un bon débutgit config --global fetch.prune true
VonC
1
Quels sont les inconvénients possibles à toujours tailler en traction? la citation mentionne que l'historique de reflog est affecté ... mais quel problème pratique cela pourrait-il introduire?
Grapho
3
@Grapho pas de réel inconvénient mais ... voir plus sur stackoverflow.com/a/39862779/6309
VonC
143

git config --global fetch.prune true

Pour toujours --prunepour git fetchet git pulldans tous vos référentiels Git:

git config --global fetch.prune true

Cette commande ci-dessus ajoute (généralement ~/.gitconfig) dans votre configuration Git globale les lignes suivantes. Utilisez git config -e --globalpour afficher votre configuration globale.

[fetch]
    prune = true

git config remote.origin.prune true

Pour toujours --prunemais à partir d'un seul référentiel:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

Cette commande ci-dessus ajoute dans votre configuration Git locale (généralement .git/config) la dernière ligne ci-dessous. Utilisez git config -epour afficher votre configuration locale.

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

Vous pouvez également utiliser --globaldans la deuxième commande ou utiliser à la place --localdans la première commande.


git config --global gui.pruneDuringFetch true

Si vous utilisez, git guivous pouvez également être intéressé par:

git config --global gui.pruneDuringFetch true

qui ajoute:

[gui]
    pruneDuringFetch = true

Références

Les documentations correspondantes de git help config:

--global

  Pour les options d'écriture: écrivez dans un ~/.gitconfigfichier global plutôt que dans le référentiel .git/config, écrivez dans un $XDG_CONFIG_HOME/git/configfichier si ce fichier existe et que le ~/.gitconfigfichier n'existe pas.

 

--local

  Pour les options d'écriture: écrivez dans le .git/configfichier du référentiel . Ceci est le comportement par défaut.

 

fetch.prune

  Si true, fetch se comportera automatiquement comme si l' --pruneoption était donnée sur la ligne de commande. Voir aussi remote.<name>.prune.

 

gui.pruneDuringFetch

  "true" si git-gui doit tailler les branches de suivi à distance lors de l'exécution d'une extraction. La valeur par défaut est "false".

 

remote.<name>.prune

  Lorsqu'il est défini sur true, l'extraction de cette télécommande par défaut supprimera également toutes les références de suivi à distance qui n'existent plus sur la télécommande (comme si l' --pruneoption était donnée sur la ligne de commande). Remplace les fetch.pruneparamètres, le cas échéant.

olibre
la source
1
Note latérale: Je viens d'apprendre git config -eet git config -e --globalde ce post. Plus besoin de taper des vimcommandes pour pointer vers un chemin spécifique vers un fichier de configuration git, et avoir à réfléchir à ce qu'est ce chemin spécifique.
ecbrodie
1
Maintenant, c'est une réponse avec laquelle vous pouvez travailler. Merci beaucoup.
sebingel
Cette réponse est assez complète, mais très difficile à lire en raison de sa mise en forme. J'aurais trouvé "Toujours - tailler pour git fetch et git pull dans tous vos dépôts Git: git config --global fetch.prune true" tout aussi bien (avec un lien vers les documents pertinents).
Thibaud Colas
19

Si vous voulez toujours prunequand vous fetch, je peux suggérer d'utiliser des alias .

Tapez simplement git config -epour ouvrir votre éditeur et modifier la configuration d'un projet spécifique et ajoutez une section comme

[alias]
pfetch = fetch --prune   

le moment où vous allez chercher avec git pfetchle pruneau se fera automatiquement.

Merci pour tous les poissons
la source
Je comprends. Pull en passant utilisera git fetch et non git pfetch ... devrais-je avoir directement un alias pour pull?
Edmondo1984
1
Je vais. De cette façon, vous avez les deux options, normal pullet fetchet leur version élaguée. En fait, je pense (mais je n'ai pas essayé) que vous pouvez écrire fetch = fetch --prunedirectement dans la section alias et pullque vous utiliserez donc automatiquement la récupération d'
élagage
2
Pour autant que je sache que fetch = fetch --prunecela ne fonctionne pas, écraser une commande avec un alias n'a pas fonctionné pour moi. Cela pourrait être dû au fait que j'utilise une ancienne version (1.7.2.5)
Uipko
3
Dans la documentation de git config: "Pour éviter toute confusion et tout problème avec l'utilisation des scripts, les alias qui masquent les commandes Git existantes sont ignorés."
Dewayne Christensen