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.