Automatisches Beschneiden mit Git-Abruf oder Pull

248

Wenn jemand einen Remote-Zweig gelöscht hat, weil die Arbeit beendet ist und ich es nicht weiß, werde ich keinen ausführen git fetch --pruneund schließlich den gelöschten Zweig zurückschieben.

Gibt es eine praktikable Lösung, um Git zu zwingen, beim Abrufen / Ziehen den Bereinigungsmodus zu verwenden, ohne ihn jedes Mal angeben zu müssen?

Edmondo1984
quelle
1
Sie werden in Kürze (git 1.8.5, Q4 2013) in der lokalen Konfiguration eines Repos angeben können, auf das Sie immer zurückschneiden möchten git fetch! Siehe meine Antwort unten
VonC

Antworten:

395

Seit git 1.8.5 (Q4 2013) :

" git fetch" (daher auch " git pull") lernte, " fetch.prune" und " remote.*.prune" Konfigurationsvariablen zu überprüfen und sich so zu verhalten, als ob die --pruneBefehlszeilenoption " " gegeben wäre.

Das heißt, wenn Sie remote.origin.prune auf true setzen:

git config remote.origin.prune true

Beliebig git fetchoder git pullwird automatisch beschneiden.

Hinweis: Git 2.12 (Q1 2017) behebt einen Fehler im Zusammenhang mit dieser Konfiguration, der zu einem git remote renameFehlverhalten führen würde.
Siehe " Wie benenne ich eine Git-Fernbedienung um? ".


Weitere Informationen finden Sie unter Commit 737c5a9 :

Ohne " git fetch --prune" bleiben Fernverfolgungszweige für einen Zweig, den die andere Seite bereits entfernt hat, für immer.
Einige Leute wollen immer " git fetch --prune" laufen .

Fügen Sie zwei neue Konfigurationsvariablen " fetch.prune" und " remote.<name>.prune" hinzu, um Benutzern gerecht zu werden, die entweder immer oder beim Abrufen von einer bestimmten Fernbedienung beschneiden möchten :

  • " fetch.prune" ermöglicht das Aktivieren der Bereinigung für alle Abrufvorgänge.
  • " remote.<name>.prune" ermöglicht das Ändern des Verhaltens pro Fernbedienung.

Letzteres überschreibt natürlich Ersteres, und die --[no-]pruneOption in der Befehlszeile überschreibt den konfigurierten Standard.

Da --prunees sich um eine potenziell zerstörerische Operation handelt (Git führt noch keine Reflogs für gelöschte Referenzen durch), möchten wir nicht ohne Zustimmung des Benutzers beschneiden, sodass diese Konfiguration nicht standardmäßig aktiviert ist.

VonC
quelle
4
Dies ist in der Tat in dem jetzt veröffentlichten Git 1.8.5
Bessey
1
Ich möchte dieses Verhalten standardmäßig in allen meinen Git-Repos. Gibt es einige Stellen, an denen ich dies in meine .gitconfig einfügen kann, um dies zu ermöglichen?
Andrew
47
@ Andrew ein guter Start wäregit config --global fetch.prune true
VonC
1
Was sind die möglichen Nachteile, wenn man immer beim Ziehen beschneidet? Das Zitat erwähnt, dass die Reflog-Geschichte betroffen ist ... aber welches praktische Problem könnte dies mit sich bringen?
Grapho
3
@ Grapho kein wirklicher Nachteil, aber ... mehr dazu unter stackoverflow.com/a/39862779/6309
VonC
142

git config --global fetch.prune true

Um immer --prunefür git fetchund git pullin all Ihren Git-Repositories:

git config --global fetch.prune true

Dieser obige Befehl hängt in Ihrer globalen Git-Konfiguration (normalerweise ~/.gitconfig) die folgenden Zeilen an. Verwenden git config -e --globalSie diese Option , um Ihre globale Konfiguration anzuzeigen.

[fetch]
    prune = true

git config remote.origin.prune true

Um immer --pruneaber aus einem einzigen Repository:

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

Dieser obige Befehl fügt in Ihrer lokalen Git-Konfiguration (normalerweise .git/config) die letzte Zeile hinzu. Verwenden git config -eSie diese Option , um Ihre lokale Konfiguration anzuzeigen.

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

Sie können auch --globalinnerhalb des zweiten Befehls oder stattdessen --localinnerhalb des ersten Befehls verwenden.


git config --global gui.pruneDuringFetch true

Wenn Sie verwenden git gui, könnten Sie auch interessiert sein an:

git config --global gui.pruneDuringFetch true

das hängt an:

[gui]
    pruneDuringFetch = true

Verweise

Die entsprechenden Dokumentationen von git help config:

--global

  Für Schreiboptionen: Schreiben Sie in eine globale ~/.gitconfigDatei und nicht in das Repository .git/config. Schreiben Sie in eine $XDG_CONFIG_HOME/git/configDatei, wenn diese Datei vorhanden ist und die ~/.gitconfigDatei nicht.

 

--local

  Für Schreiboptionen: Schreiben Sie in die Repository- .git/configDatei. Dies ist das Standardverhalten.

 

fetch.prune

  Wenn true, verhält sich fetch automatisch so, als ob die --pruneOption in der Befehlszeile angegeben worden wäre. Siehe auch remote.<name>.prune.

 

gui.pruneDuringFetch

  "true", wenn git-gui beim Ausführen von Abrufen Fernverfolgungszweige beschneiden soll. Der Standardwert ist "false".

 

remote.<name>.prune

  Wenn der Wert auf "true" gesetzt ist, werden beim Abrufen von dieser Fernbedienung standardmäßig auch alle auf der Fernbedienung nicht mehr vorhandenen Fernverfolgungsreferenzen entfernt (als ob die --pruneOption in der Befehlszeile angegeben worden wäre). Überschreibt fetch.pruneggf. Einstellungen.

olibre
quelle
1
Randnotiz: Ich habe gerade von git config -eund git config -e --globalaus diesem Beitrag erfahren . Sie müssen keine vimBefehle mehr eingeben , um auf einen bestimmten Pfad zu einer Git-Konfigurationsdatei zu verweisen, und müssen sich überlegen, was dieser bestimmte Pfad ist.
Ecbrodie
1
Dies ist eine Antwort, mit der Sie arbeiten können. Vielen Dank.
sebingel
Diese Antwort ist ziemlich gründlich, aber aufgrund ihrer Formatierung sehr schwer zu lesen. Ich hätte "Um immer - für Git-Abruf und Git-Pull in all Ihren Git-Repositorys zu beschneiden: git config --global fetch.prune true" genauso gut gefunden (mit einem Link zu den relevanten Dokumenten).
Thibaud Colas
19

Wenn Sie immer prunewann möchten, kann fetchich vorschlagen, Aliase zu verwenden .

Geben Sie einfach ein git config -e, um Ihren Editor zu öffnen, die Konfiguration für ein bestimmtes Projekt zu ändern und einen Abschnitt wie hinzuzufügen

[alias]
pfetch = fetch --prune   

Das Abrufen mit git pfetchder Pflaume erfolgt automatisch.

ThanksForAllTheFish
quelle
Ich verstehe. Pull übrigens wird Git Fetch und nicht Git Pfetch verwenden ... sollte ich direkt einen Alias ​​für Pull haben?
Edmondo1984
1
Ich werde. Auf diese Weise haben Sie beide Optionen, normale pullund fetchund ihre beschnittene Version. Eigentlich denke ich (aber ich habe es nicht versucht), dass Sie fetch = fetch --prunedirekt in den Alias-Bereich schreiben können und daher pullden beschnittenen Abruf automatisch verwenden werden
ThanksForAllTheFish
2
Soweit ich weiß, fetch = fetch --prunefunktioniert das Überschreiben eines Befehls mit einem Alias ​​bei mir nicht. Dies könnte daran liegen, dass ich eine alte Version (1.7.2.5) verwende
Uipko
3
In der Dokumentation zur Git-Konfiguration heißt es: "Um Verwirrung und Probleme bei der Verwendung von Skripten zu vermeiden, werden Aliase, die vorhandene Git-Befehle verbergen, ignoriert."
Dewayne Christensen