Potatura automatica con Git fetch o pull


248

Se qualcuno ha eliminato un ramo remoto perché il lavoro è finito e non lo so, non lo farò git fetch --prune e alla fine respingerò il ramo eliminato.

Esiste una soluzione praticabile per forzare Git a utilizzare la modalità prugna durante il recupero / estrazione senza doverlo specificare ogni volta?


1
Presto (git 1.8.5, Q4 2013) sarà possibile specificare nella configurazione locale di un repository su cui si desidera sempre potare git fetch! Vedi la mia risposta di seguito
VonC,

Risposte:


395

Da git 1.8.5 (Q4 2013) :

" git fetch" (e quindi anche " git pull") ha imparato a controllare le variabili di configurazione " fetch.prune" e " remote.*.prune" e a comportarsi come se --prunefosse stata data l'opzione " " della riga di comando.

Ciò significa che, se si imposta remote.origin.prune su true:

git config remote.origin.prune true

Qualsiasi git fetchogit pull poterà automaticamente.

Nota: Git 2.12 (Q1 2017) risolverà un bug relativo a questa configurazione, che comporterebbe un git remote renamecomportamento errato.
Vedi " Come rinominare un telecomando Git? ".


Vedi di più su commit 737c5a9 :

Senza " git fetch --prune", i rami di tracciamento remoto per un ramo che l'altra parte ha già rimosso rimarranno per sempre.
Alcune persone vogliono correre sempre " git fetch --prune".

Per consentire agli utenti che desiderano eliminare sempre o durante il recupero da un determinato telecomando, aggiungi due nuove variabili di configurazione " fetch.prune" e " remote.<name>.prune":

  • "fetch.prune " consente di abilitare la potatura per tutte le operazioni di recupero.
  • " remote.<name>.prune" consente di modificare il comportamento per telecomando.

Quest'ultimo sovrascriverà naturalmente il primo e l' --[no-]pruneopzione dalla riga di comando sostituirà l'impostazione predefinita configurata.

Poiché --pruneè un'operazione potenzialmente distruttiva (Git non mantiene ancora i reflog per i riferimenti eliminati), non vogliamo potare senza il consenso degli utenti, quindi questa configurazione non sarà attiva per impostazione predefinita.


4
Questo è effettivamente incluso nel git 1.8.5 ora rilasciato
Bessey

1
Voglio questo comportamento di default in tutti i miei repository git. C'è qualche dove posso metterlo nel mio .gitconfig per farlo accadere?
Andrew

47
@Andrew un buon inizio sarebbegit config --global fetch.prune true
VonC

1
quali sono gli aspetti negativi possibili da potare sempre in pull? la citazione menziona che la cronologia dei reflog è interessata ... ma quale problema pratico potrebbe introdurre?
Grapho,

3
@Grapho nessun vero inconveniente ma ... vedere di più al stackoverflow.com/a/39862779/6309
VonC

143

git config --global fetch.prune true

Per sempre --pruneper git fetche git pullin tutti i tuoi repository Git:

git config --global fetch.prune true

Questo comando sopra aggiunge nella tua configurazione Git globale (in genere ~/.gitconfig) le seguenti righe. Utilizzare git config -e --globalper visualizzare la configurazione globale.

[fetch]
    prune = true

git config remote.origin.prune true

Per sempre --prunema da un singolo repository:

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

Questo comando sopra aggiunge nella configurazione Git locale (in genere .git/config) l'ultima riga sotto. Utilizzare git config -eper visualizzare la configurazione locale.

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

È inoltre possibile utilizzare --globalall'interno del secondo comando o utilizzare invece --localall'interno del primo comando.


git config --global gui.pruneDuringFetch true

Se lo usi git guipotresti essere interessato anche a:

git config --global gui.pruneDuringFetch true

che aggiunge:

[gui]
    pruneDuringFetch = true

Riferimenti

Le corrispondenti documentazioni da git help config:

--global

  Per le opzioni di scrittura: scrivere nel ~/.gitconfigfile globale anziché nel repository .git/config, scrivere nel $XDG_CONFIG_HOME/git/configfile se questo file esiste e il ~/.gitconfigfile no.

 

--local

  Per le opzioni di scrittura: scrivere nel .git/configfile del repository . Questo è il comportamento predefinito.

 

fetch.prune

  Se vero, il recupero si comporterà automaticamente come se --prunefosse stata data l' opzione sulla riga di comando. Vedi anche remote.<name>.prune.

 

gui.pruneDuringFetch

  "true" se git-gui deve eliminare i rami di tracciamento remoto durante l'esecuzione di un recupero. Il valore predefinito è falso".

 

remote.<name>.prune

  Se impostato su true, il recupero da questo telecomando per impostazione predefinita rimuoverà anche eventuali riferimenti di tracciamento remoto che non esistono più sul telecomando (come se l' --pruneopzione fosse stata fornita dalla riga di comando). Sostituisce le fetch.pruneimpostazioni, se presenti.


1
Nota a margine: ho appena imparato a conoscere git config -ee git config -e --globalda questo post. Non è più necessario digitare vimcomandi per puntare a un percorso specifico di un file di configurazione git e dover pensare a cosa sia quel percorso specifico.
ecbrodie,

1
Ora QUESTA è una risposta con cui puoi lavorare. Grazie mille.
sebingel,

Questa risposta è abbastanza approfondita, ma molto difficile da leggere a causa della sua formattazione. Avrei trovato "Per sempre --primi per git fetch e git pull in tutti i tuoi repository Git: git config --global fetch.prune true" altrettanto buono (con un link ai documenti pertinenti).
Thibaud Colas,

19

Se vuoi sempre prunequando puoi fetch, posso suggerire di usare gli alias .

Basta digitare git config -eper aprire l'editor e modificare la configurazione per un progetto specifico e aggiungere una sezione come

[alias]
pfetch = fetch --prune   

il quando prendi con git pfetchla prugna sarà fatto automaticamente.


Capisco. A proposito, Pull utilizzerà git fetch e non git pfetch ... dovrei avere direttamente un alias per pull?
Edmondo1984,

1
Lo farò. In questo modo si dispone di entrambe le opzioni, normale pulle fetche la loro versione potato. In realtà, penso (ma non ho provato) che puoi scrivere fetch = fetch --prunedirettamente nella sezione alias e quindi pulluserò automaticamente il potatura recuperata
ThanksForAllTheFish

2
Per quanto ne so fetch = fetch --prunenon funziona, sovrascrivere un comando con un alias non ha funzionato per me. Questo potrebbe essere perché sto usando una versione precedente (1.7.2.5)
Uipko

3
Dalla documentazione di git config: "Per evitare confusione e problemi con l'uso degli script, gli alias che nascondono i comandi Git esistenti vengono ignorati."
Dewayne Christensen,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.