गिट लाने या खींचने के साथ स्वचालित प्रून


248

यदि किसी ने दूरस्थ शाखा को हटा दिया है क्योंकि काम खत्म हो गया है और मुझे नहीं पता, मैं नहीं करूंगा git fetch --pruneऔर अंततः मैं हटाए गए शाखा को वापस धकेलूंगा।

क्या हर बार इसे निर्दिष्ट किए बिना लाने / खींचने पर प्रीट मोड का उपयोग करने के लिए गिट को मजबूर करने का एक व्यवहार्य समाधान है?


1
आप करेंगे जल्दी ही (Git 1.8.5, Q4 2013) एक रेपो है कि आप करना चाहते हैं के स्थानीय config में निर्दिष्ट कर सकेंगे कि हमेशा पर काटना git fetch! देखें नीचे मेरा उत्तर
VonC

जवाबों:


396

चूंकि 1.8.5 git (Q4 2013) :

" git fetch" (इसलिए " git pull" साथ ही साथ) " fetch.prune" और " remote.*.prune" विन्यास चर की जाँच करना सीखता है और व्यवहार करता है जैसे कि " --prune" कमांड लाइन विकल्प दिया गया था।

इसका मतलब यह है कि, यदि आप Remote.origin.prune को सच में सेट करते हैं:

git config remote.origin.prune true

कोई git fetchयाgit pull स्वचालित रूप से prune होगा।

नोट: Git 2.12 (Q1 2017) इस कॉन्फ़िगरेशन से संबंधित बग को ठीक करेगा, जो git remote renameदुर्व्यवहार करेगा ।
देखें " मैं एक रिमोट का नाम कैसे लेते हैं? "।


737c5a9 पर अधिक देखें :

" git fetch --prune" "के बिना , एक शाखा के लिए रिमोट-ट्रैकिंग शाखाएं जो पहले से हटा दी गई हैं, हमेशा के लिए रहेंगी।
कुछ लोग हमेशा " git fetch --prune" चलाना चाहते हैं ।

उन उपयोगकर्ताओं को समायोजित करने के लिए जो हमेशा या तो किसी विशेष रिमोट से प्रूनिंग करना चाहते हैं, दो नए कॉन्फ़िगरेशन चर " fetch.prune" और " remote.<name>.prune" जोड़ें:

  • " fetch.prune" सभी प्रचालनों के लिए प्रून सक्षम करने की अनुमति देता है।
  • " remote.<name>.prune" प्रति दूरस्थ व्यवहार को बदलने की अनुमति देता है।

उत्तरार्द्ध स्वाभाविक रूप से पूर्व को ओवरराइड करेगा, और --[no-]pruneकमांड लाइन से विकल्प कॉन्फ़िगर किए गए डिफ़ॉल्ट को ओवरराइड करेगा।

चूंकि --pruneएक संभावित विनाशकारी ऑपरेशन है (जीआईटी हटाए गए संदर्भों के लिए अभी तक कोई रोक नहीं रखता है), हम उपयोगकर्ताओं की सहमति के बिना prune नहीं करना चाहते हैं, इसलिए यह कॉन्फ़िगरेशन डिफ़ॉल्ट रूप से नहीं होगा।


4
यह वास्तव में अब जारी किए गए git 1.8.5 में शामिल है
Bessey

1
मैं अपने सभी गिट रिपॉज़िट में डिफ़ॉल्ट रूप से यह व्यवहार चाहता हूं। क्या ऐसा कुछ है जहाँ मैं इसे अपने .itconfig में डाल सकता हूँ ताकि ऐसा हो सके?
एंड्रयू

47
@ और अच्छी शुरुआत होगीgit config --global fetch.prune true
वॉन

1
पुल पर हमेशा छंटनी के संभावित कारण क्या हैं? उद्धरण में उल्लेख किया गया है कि इतिहास को फिर से लिखना प्रभावित होता है ... लेकिन क्या व्यावहारिक समस्या हो सकती है?
ग्राफो

3
@Grapho कोई वास्तविक नकारात्मक पहलू नहीं है ... लेकिन stackoverflow.com/a/39862779/6309
VonC

143

git config --global fetch.prune true

हमेशा के --pruneलिए git fetchऔर git pullअपने सभी गिट रिपोजिटरी में:

git config --global fetch.prune true

यह उपरोक्त आदेश आपके वैश्विक गिट विन्यास (आमतौर पर ~/.gitconfig) में निम्नलिखित पंक्तियों को जोड़ता है । git config -e --globalअपने वैश्विक कॉन्फ़िगरेशन को देखने के लिए उपयोग करें ।

[fetch]
    prune = true

git config remote.origin.prune true

हमेशा के लिए --pruneलेकिन एक एकल भंडार से:

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

यह उपरोक्त कमांड आपके स्थानीय Git कॉन्फ़िगरेशन (आमतौर पर .git/config) को अंतिम पंक्ति में जोड़ता है । git config -eअपने स्थानीय कॉन्फ़िगरेशन को देखने के लिए उपयोग करें ।

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

आप पहली कमांड के भीतर --globalदूसरी कमांड का उपयोग कर सकते हैं या इसके बजाय उपयोग कर सकते हैं --local


git config --global gui.pruneDuringFetch true

यदि आप उपयोग करते हैं, git guiतो आप भी रुचि ले सकते हैं:

git config --global gui.pruneDuringFetch true

वह कहता है:

[gui]
    pruneDuringFetch = true

संदर्भ

इससे संबंधित दस्तावेज git help config:

--global

  लेखन विकल्पों के लिए: ~/.gitconfigरिपॉजिटरी के बजाय वैश्विक फ़ाइल पर .git/configलिखें, $XDG_CONFIG_HOME/git/configयह फ़ाइल मौजूद है और ~/.gitconfigफ़ाइल नहीं है तो फ़ाइल को लिखें ।

 

--local

  लेखन विकल्पों के लिए: रिपॉजिटरी .git/configफ़ाइल में लिखें । यह पहले गलत व्यवहार है।

 

fetch.prune

  यदि सही है, तो भ्रूण स्वचालित रूप से व्यवहार करेगा जैसे --pruneकि कमांड लाइन पर विकल्प दिया गया था। यह भी देखें remote.<name>.prune

 

gui.pruneDuringFetch

  "सच्चा" अगर गिट-गुइ को एक भ्रूण प्रदर्शन करते समय दूरस्थ-ट्रैकिंग शाखाओं को चुभाना चाहिए। मूल मूल्य गलत है"।

 

remote.<name>.prune

  जब सही पर सेट किया जाता है, तो इस रिमोट से डिफ़ॉल्ट रूप से लाने से किसी भी रिमोट-ट्रैकिंग संदर्भ को हटा दिया जाएगा जो अब रिमोट पर मौजूद नहीं है (जैसे --pruneकि कमांड लाइन पर विकल्प दिया गया था)। fetch.pruneयदि कोई हो, तो सेटिंग्स को ओवरराइड करता है ।


1
साइड नोट: मैंने अभी git config -eऔर git config -e --globalइस पोस्ट के बारे में सीखा है । कोई और टाइपिंग vimकमांड एक git config फाइल के लिए एक विशिष्ट पथ को इंगित करने के लिए, और उस विशिष्ट पथ के बारे में सोचने के लिए।
इकोब्रोडी

1
अब यह एक ऐसा जवाब है जिसके साथ आप काम कर सकते हैं। आपका बहुत बहुत धन्यवाद।
8

यह उत्तर काफी गहन है, लेकिन इसके स्वरूपण के कारण पढ़ने में बहुत कठिन है। मुझे आपके सभी Git रिपॉजिटरी में git fetch और git खींचने के लिए "हमेशा --prune के लिए: git config --global fetch.prune true" अच्छा (प्रासंगिक डॉक्स के लिंक के साथ) मिला होगा।
थिबॉड कोलास

19

यदि आप हमेशा pruneजब आप चाहते हैं fetch, तो मैं एलियासेस का उपयोग करने का सुझाव दे सकता हूं ।

बस git config -eअपने संपादक को खोलने और किसी विशिष्ट प्रोजेक्ट के लिए कॉन्फ़िगरेशन बदलने और जैसे एक अनुभाग जोड़ने के लिए टाइप करें

[alias]
pfetch = fetch --prune   

जब आप प्रून के साथ git pfetchलाएंगे तो अपने आप हो जाएगा।


मै समझता हुँ। रास्ते से खींचो git लाने का प्रयोग करेंगे और git pfetch का उपयोग नहीं करना चाहिए ... क्या मुझे सीधे पुल के लिए एक उपनाम होना चाहिए?
एडमंडो 1984

1
मे लूँगा। इस तरह आप दोनों विकल्पों, सामान्य है pullऔर fetchऔर उनके कम कर दिए हैं संस्करण। वास्तव में, मुझे लगता है (लेकिन मैंने कोशिश नहीं की है) आप fetch = fetch --pruneसीधे उपनाम खंड में लिख सकते हैं और इसलिए pullस्वचालित रूप से
छंटाई किए गए भ्रूण का

2
जहाँ तक मुझे पता fetch = fetch --pruneहै कि काम नहीं करता है, एक उपनाम के साथ एक कमांड को ओवरराइट करना मेरे लिए काम नहीं करता है। ऐसा इसलिए हो सकता है क्योंकि मैं एक पुराने संस्करण (1.7.2.5) का उपयोग कर रहा हूं
यूपको

3
गिट कॉन्फिग डॉक्यूमेंटेशन से: "स्क्रिप्ट उपयोग के साथ भ्रम और परेशानियों से बचने के लिए, मौजूदा गिट कमांड को छिपाने वाले उपनामों को अनदेखा किया जाता है।"
ड्वेन क्रिस्टेन्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.