Git getirme veya çekme ile otomatik budama


248

Birisi iş bittiğinden ve uzak olduğunu bilmediğim için uzak bir dalı sildiyse, yapmam git fetch --pruneve sonunda silinen dalı geri iteceğim.

Git'i her defasında belirtmek zorunda kalmadan getirme / çekme sırasında budama modunu kullanmaya zorlamak için uygun bir çözüm var mı?


1
Yakında (git 1.8.5, Q4 2013) her zaman budamak istediğiniz bir repo'nun yerel yapılandırmasında belirtebilirsiniz git fetch! Aşağıdaki cevabımı
VonC

Yanıtlar:


396

Git 1.8.5'ten (2013 4. Çeyrek) :

" git fetch" (dolayısıyla " git pull" da " fetch.prune" ve " remote.*.prune" yapılandırma değişkenlerini kontrol etmeyi ve " --prune" komut satırı seçeneği verilmiş gibi davranmayı öğrendi .

Bu, remote.origin.prune öğesini true olarak ayarlarsanız:

git config remote.origin.prune true

Herhangi bir git fetchveya git pullotomatik olarak kurulacaktır.

Not: Git 2.12 (1. Çeyrek 2017), bu yapılandırmayla ilgili olarak git remote renamehatalı davranacak bir hatayı düzeltir .
Bkz. " Git kumandasını nasıl yeniden adlandırabilirim? ".


Taahhüt 737c5a9'da daha fazlasını görün :

" git fetch --prune" Olmadan , diğer tarafın zaten kaldırmış olduğu bir şube için uzaktan izleme dalları sonsuza kadar kalacaktır.
Bazı insanlar her zaman " git fetch --prune" çalıştırmak istiyor .

Her zaman budamak veya belirli bir uzaktan kumandadan getirme yapmak isteyen kullanıcıları barındırmak için, iki yeni yapılandırma değişkeni " fetch.prune" ve " remote.<name>.prune" ekleyin :

  • " fetch.prune", tüm getirme işlemleri için budamanın etkinleştirilmesini sağlar.
  • " remote.<name>.prune" uzaktan kumandadaki davranışı değiştirmeye izin verir.

İkincisi doğal olarak öncekini geçersiz kılar ve --[no-]prunekomut satırındaki seçenek yapılandırılan varsayılanı geçersiz kılar.

Yana --prunebir potansiyel yıkıcı bir işlemdir, bu yapılandırma varsayılan olarak açık olmayacak şekilde, kullanıcılar rızası olmadan budamak istemiyoruz (Git henüz silinmiş referanslar için reflogs tutmaz).


4
Bu gerçekten şimdi piyasaya sürülen git 1.8.5'e dahil
Bessey

1
Tüm git depolarımda bu davranışı varsayılan olarak istiyorum. Bunu yapmak için bunu .gitconfig'ime koyabileceğim bir yer var mı?
Andrew

47
Ve iyi bir başlangıç ​​olurdugit config --global fetch.prune true
VonC

1
her zaman çekmede budamanın olası dezavantajları nelerdir? alıntıda, yeniden yapılanma tarihinin etkilendiğinden bahsediliyor ... ama bu hangi pratik problemi getirebilir?
Grapho

3
Hiçbir gerçek dezavantajı @Grapho ama ... daha görmek stackoverflow.com/a/39862779/6309
VonC

143

git config --global fetch.prune true

Her zaman için --pruneiçin git fetchve git pulltüm Git depolarındaki:

git config --global fetch.prune true

Yukarıdaki komut, global Git yapılandırmanıza (genellikle ~/.gitconfig) aşağıdaki satırları ekler . git config -e --globalGlobal yapılandırmanızı görüntülemek için kullanın .

[fetch]
    prune = true

git config remote.origin.prune true

Her zaman --pruneancak tek bir depodan:

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

Bu yukarıdaki komut yerel Git yapılandırmanıza (genellikle .git/config) aşağıdaki son satırı ekler . git config -eYerel yapılandırmanızı görüntülemek için kullanın .

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

Ayrıca --globalikinci komut içinde veya bunun yerine --localilk komut içinde kullanabilirsiniz .


git config --global gui.pruneDuringFetch true

Kullanıyorsanız git guiayrıca ilginizi çekebilir:

git config --global gui.pruneDuringFetch true

ekler:

[gui]
    pruneDuringFetch = true

Referanslar

İlgili belgeler git help config:

--global

  Yazma seçenekleri için: ~/.gitconfigdepo yerine global dosyaya .git/configyaz, $XDG_CONFIG_HOME/git/configbu dosya varsa ve ~/.gitconfigdosya yoksa dosyaya yaz.

 

--local

  Yazma seçenekleri için: depo .git/configdosyasına yazın. Bu varsayılan davranıştır.

 

fetch.prune

  True olursa, getir, --pruneseçenek komut satırında verilmiş gibi otomatik olarak davranacaktır . Ayrıca bakınız remote.<name>.prune.

 

gui.pruneDuringFetch

git-gui bir getirme işlemi gerçekleştirirken uzaktan izleme dallarını budanırsa   "true" . Varsayılan değer "false" değeridir.

 

remote.<name>.prune

  True olarak ayarlandığında, bu uzaktan kumandadan varsayılan olarak getirilmesi, artık uzaktan kumandada bulunmayan uzaktan izleme referanslarını da kaldırır ( --pruneseçenek komut satırında verilmiş gibi). fetch.pruneVarsa ayarları geçersiz kılar .


1
Yan Not: Ben sadece öğrendim git config -eve git config -e --globalbu görevinden. vimGit komut dosyasının belirli bir yoluna işaret etmek ve o yolun ne olduğunu düşünmek zorunda kalmadan artık komut yazmaya gerek yok .
ecbrodie

1
Şimdi bu, üzerinde çalışabileceğiniz bir cevaptır. Çok teşekkür ederim.
sebingel

Bu cevap oldukça kapsamlı, ancak biçimlendirmesi nedeniyle okunması çok zor. "Git getirme ve git için tüm git depolarını tüm Git depolarınızda çekin" bulmuştum git config --global fetch.prune true.
Thibaud Colas

19

Her zaman prunene zaman isterseniz fetch, Takma ad kullanmanızı öneririm .

git config -eDüzenleyicinizi açmak için yazın ve belirli bir projenin yapılandırmasını değiştirin ve aşağıdaki gibi bir bölüm ekleyin

[alias]
pfetch = fetch --prune   

git pfetchbudama ile getirdiğinizde otomatik olarak yapılacaktır.


Anlıyorum. Bu arada çek git git getirecek ve git pfetch kullanacak ... doğrudan çekme için bir takma adı olmalı?
Edmondo1984

1
Yapacağım. Bu şekilde normal seçenekler, her ikisine de sahip pullve fetchve bunların budanmış versiyonu. Aslında, bence (ama denemedim) fetch = fetch --prunedoğrudan takma bölüm bölümüne yazabilirsiniz ve bu nedenle pullbudanmış getirmeyi otomatik olarak kullanacaksınız
ThanksForAllTheFish

2
Bildiğim kadarıyla fetch = fetch --pruneişe yaramazsa, bir takma adla bir komutun üzerine yazmak benim için işe yaramadı. Bunun nedeni eski bir sürümü kullanmam olabilir (1.7.2.5)
Uipko

3
Git config belgelerinden: "Komut dosyası kullanımındaki karışıklığı ve sorunları önlemek için mevcut Git komutlarını gizleyen takma adlar yoksayılır."
Dewayne Christensen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.