Automatyczne przycinanie za pomocą Git fetch lub pull

248

Jeśli ktoś usunął zdalną gałąź, ponieważ praca się skończyła i nie wiem, nie zrobię, git fetch --prunea ostatecznie odepchnę usuniętą gałąź.

Czy istnieje realne rozwiązanie, aby zmusić Git do korzystania z trybu przycinania podczas pobierania / wyciągania bez konieczności każdorazowego określania go?

Edmondo1984
źródło
1
Wkrótce (git 1.8.5, IV kwartał 2013) będziesz mógł określić w lokalnej konfiguracji repozytorium, na którym chcesz zawsze przycinać git fetch! Zobacz moją odpowiedź poniżej
VonC

Odpowiedzi:

396

Od wersji git 1.8.5 (IV kwartał 2013) :

git fetch” (stąd też „ git pull”) nauczył się sprawdzać zmienne konfiguracyjne „ fetch.prune” i „ remote.*.prune” oraz zachowywać się tak, jakby --prunepodano opcję wiersza poleceń „ ”.

Oznacza to, że jeśli ustawisz remote.origin.prune na true:

git config remote.origin.prune true

Dowolny git fetchlub git pullzostanie automatycznie przycięty.

Uwaga: Git 2.12 (Q1 2017) naprawi błąd związany z tą konfiguracją, który spowodowałby git remote renameniewłaściwe zachowanie.
Zobacz „ Jak zmienić nazwę zdalnego git? ”.


Zobacz więcej na stronie 737c5a9 :

Bez „ git fetch --prune” gałęzie zdalnego śledzenia dla gałęzi, którą druga strona już usunęła, pozostaną na zawsze.
Niektórzy ludzie chcą zawsze uruchamiać „ git fetch --prune”.

Aby pomieścić użytkowników, którzy chcą albo przycinać zawsze, albo podczas pobierania z określonego pilota, dodaj dwie nowe zmienne konfiguracyjne „ fetch.prune” i „ remote.<name>.prune”:

  • fetch.prune” pozwala włączyć przycinanie dla wszystkich operacji pobierania.
  • remote.<name>.prune” pozwala zmienić zachowanie każdego pilota.

Ten ostatni w naturalny sposób zastąpi ten pierwszy, a --[no-]pruneopcja z wiersza poleceń zastąpi skonfigurowane ustawienie domyślne.

Ponieważ --prunejest to potencjalnie destrukcyjna operacja (Git nie prowadzi jeszcze dzienników dla usuniętych referencji), nie chcemy przycinać bez zgody użytkowników, więc ta konfiguracja nie będzie domyślnie włączona.

VonC
źródło
4
Jest to rzeczywiście uwzględnione w wydanym teraz git 1.8.5
Bessey
1
Chcę to zachowanie domyślnie we wszystkich moich repozytoriach git. Czy jest gdzieś, gdzie mogę to umieścić w moim .gitconfig, aby tak się stało?
Andrew
47
@Andrew dobrym początkiem byłobygit config --global fetch.prune true
VonC
1
jakie są możliwe wady ciągłego przycinania przy ciągnięciu? cytat wspomina, że ​​ma to wpływ na rejestrowanie historii ... ale jaki praktyczny problem może to wprowadzić?
Grapho
3
@Grapho nie ma prawdziwego minusu, ale ... zobacz więcej na stackoverflow.com/a/39862779/6309
VonC
143

git config --global fetch.prune true

Aby zawsze --prunedla wszystkich repozytoriów Git git fetchi git pullwe wszystkich:

git config --global fetch.prune true

Powyższe polecenie dołącza w globalnej konfiguracji Git (zazwyczaj ~/.gitconfig) następujące wiersze. Służy git config -e --globaldo wyświetlania konfiguracji globalnej.

[fetch]
    prune = true

git config remote.origin.prune true

Aby zawsze, --pruneale z jednego repozytorium:

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

To powyższe polecenie dodaje w lokalnej konfiguracji Git (zwykle .git/config) ostatni wiersz poniżej. Służy git config -edo wyświetlania konfiguracji lokalnej.

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

Możesz także użyć --globalw ramach drugiego polecenia lub zamiast tego użyć --localw ramach pierwszego polecenia.


git config --global gui.pruneDuringFetch true

Jeśli korzystasz git gui, możesz być zainteresowany:

git config --global gui.pruneDuringFetch true

dołącza:

[gui]
    pruneDuringFetch = true

Bibliografia

Odpowiednie dokumenty z git help config:

--global

  W przypadku opcji zapisu: zapisz do ~/.gitconfigpliku globalnego zamiast do repozytorium .git/config, napisz do $XDG_CONFIG_HOME/git/configpliku, jeśli ten plik istnieje, a ~/.gitconfigplik nie.

 

--local

  Opcje zapisu: napisz do .git/configpliku repozytorium . To jest domyślne zachowanie.

 

fetch.prune

  Jeśli true, pobieranie będzie automatycznie zachowywać się tak, jakby --pruneopcja została podana w wierszu polecenia. Zobacz także remote.<name>.prune.

 

gui.pruneDuringFetch

  „prawda”, jeśli git-gui powinno przycinać gałęzie zdalnego śledzenia podczas wykonywania pobierania. Wartość domyślna to „fałsz”.

 

remote.<name>.prune

  Po ustawieniu wartości true, pobieranie z tego pilota domyślnie usunie również wszelkie odwołania do zdalnego śledzenia, które już nie istnieją na pilocie (tak jakby --pruneopcja została podana w wierszu poleceń). Zastępuje fetch.pruneustawienia, jeśli takie istnieją.

olibre
źródło
1
Uwaga dodatkowa: Właśnie dowiedziałem się o tym poście git config -ei git config -e --globalz niego. Koniec z wpisywaniem vimpoleceń wskazujących konkretną ścieżkę do pliku konfiguracyjnego git i koniecznością zastanowienia się, czym jest ta konkretna ścieżka.
ecbrodie
1
Teraz TO jest odpowiedź, z którą możesz pracować. Dziękuję Ci bardzo.
sebingel,
Ta odpowiedź jest dość dokładna, ale bardzo trudna do odczytania ze względu na jej formatowanie. Znalazłbym „Zawsze - prune dla git fetch i git ściągnij wszystkie repozytoria Git: git config --global fetch.prune true” równie dobre (z linkiem do odpowiednich dokumentów).
Thibaud Colas
19

Jeśli chcesz zawsze, prunekiedy chcesz fetch, mogę zaproponować użycie Aliasów .

Wystarczy wpisać, git config -eaby otworzyć edytor i zmienić konfigurację dla konkretnego projektu i dodać sekcję podobną

[alias]
pfetch = fetch --prune   

pobranie przy git pfetchużyciu suszonych śliwek nastąpi automatycznie.

ThanksForAllTheFish
źródło
Rozumiem. Pull przy okazji użyje git fetch, a nie git pfetch ... czy powinienem mieć bezpośrednio alias do ściągania?
Edmondo1984,
1
Będę. W ten sposób masz obie opcje, normalne pulli fetchoraz ich przycinać wersję. Właściwie myślę (ale nie próbowałem), że możesz pisać fetch = fetch --prunebezpośrednio w sekcji aliasów i dlatego pullautomatycznie użyje przycinanego pobierania
ThanksForAllTheFish
2
O ile wiem fetch = fetch --prunenie działa, nadpisanie polecenia aliasem nie działało dla mnie. Może to być spowodowane tym, że używam starej wersji (1.7.2.5)
Uipko
3
Z dokumentacji konfiguracji git: „Aby uniknąć pomyłek i problemów z użyciem skryptu, aliasy, które ukrywają istniejące polecenia Git, są ignorowane”.
Dewayne Christensen