मैं git शाखाओं को कैसे संग्रहीत कर सकता हूं?


305

मेरी गिट रिपॉजिटरी में मेरी कुछ पुरानी शाखाएँ हैं जो अब सक्रिय विकास के अधीन नहीं हैं। मैं शाखाओं को संग्रहित करना चाहूंगा ताकि दौड़ते समय वे डिफ़ॉल्ट रूप से दिखाई न दें git branch -l -r। मैं उन्हें हटाना नहीं चाहता, क्योंकि मैं इतिहास रखना चाहता हूं। मैं यह कैसे कर सकता हूँ?

मुझे पता है कि रेफ्स / हेड्स के बाहर रेफ बनाना संभव है। उदाहरण के लिए, refs/archive/old_branch। क्या ऐसा करने के कोई परिणाम हैं?


git-rm रिपॉजिटरी से रिसोर्स को डिलीट नहीं करता है, यह केवल उन्हें इंडेक्स kernel.org/pub/software/scm/git/docs/git-rm.html से हटाता है। आप इन रिसोर्स को आसानी से रिस्टोर कर सकते हैंgit checkout [rev] file
Dana Sane

1
मेरी जानकारी में नहीं। मैं Attic/<branchname>हल्की टैग्स का उपयोग संग्रह शाखाओं में करता हूं , हालांकि।
जकुब नारबस्की

टैग त्वरित और सुरक्षित और समझदार विकल्प हैं।
kch

जवाबों:


401

मेरा मानना ​​है कि ऐसा करने का उचित तरीका शाखा को टैग करना है। यदि आपने इसे टैग करने के बाद शाखा को हटा दिया है तो आपने शाखा को प्रभावी रूप से चारों ओर रखा है, लेकिन यह आपकी शाखा सूची को अव्यवस्थित नहीं करेगा।

यदि आपको शाखा में वापस जाने की आवश्यकता है तो केवल टैग देखें। यह टैग से शाखा को प्रभावी रूप से पुनर्स्थापित करेगा।

शाखा को संग्रहीत करना और हटाना:

git tag archive/<branchname> <branchname>
git branch -d <branchname>

कुछ समय बाद शाखा को बहाल करने के लिए:

git checkout -b <branchname> archive/<branchname>

शाखा का इतिहास ठीक उसी तरह संरक्षित किया जाएगा जैसा आपने इसे टैग किया था।


11
मैं एक गिट नौसिखिया हूँ, लेकिन इस कोशिश में, मुझे लगता है कि शाखा को बहाल करने के लिए उचित आदेश है:git checkout -b <branchname> archive/<branchname>
स्टीव

6
क्या इस मामले में ऑब्जेक्ट-टैग का उपयोग न करने का कोई कारण है? यह देखने में सक्षम है कि किसने शाखा को संग्रहीत किया और कब दिलचस्प हो सकता है।
ग्रेजरी जोसेफ

7
@ GrégoryJoseph: यह एक तथाकथित "एनोटेट टैग" है। और हाँ, इसके इस्तेमाल से मैं बहुत कुछ समझ सकता हूँ।
onnodb

22
छोटे नोट, आप शायद चाहते हैं कि branch -Dयह पूरी तरह से विलय होने की संभावना नहीं है अगर आप इसे इस तरह से संग्रहित कर रहे हैं
अरकादि कुकारिन

5
बहुत अच्छा। यहाँ स्पष्टीकरण के साथ एक पूर्ण ट्यूटोरियल है।
मेसालोनी

123

जेरेमी का जवाब सिद्धांत रूप में सही है, लेकिन आईएमएचओ ने जो आदेश दिया है वह काफी सही नहीं है।

शाखा को चेकआउट किए बिना टैग को शाखा को कैसे संग्रहीत किया जाए (और, इसलिए, उस शाखा को हटाने से पहले किसी अन्य शाखा को चेकआउट किए बिना):

> git tag archive/<branchname> <branchname>
> git branch -D <branchname>

और यहाँ एक शाखा को कैसे बहाल किया जाए:

> git checkout -b <branchname> archive/<branchname>

18
मुझे लगता है कि आपके पास अभी तक पर्याप्त अंक नहीं हैं, लेकिन यह बेहतर होगा जब आप मौजूदा उत्तर को संपादित करने के लिए करते हैं - +1 फिर भी यद्यपि :)
jkp

5
@jkp अन्य उपयोगकर्ताओं के कोड और आदेशों का संपादन आमतौर पर इसलिए किया जाता है क्योंकि एक git कमांड में सूक्ष्म परिवर्तन काफी हद तक अलग-अलग चीजें कर सकते हैं, और आप यह नहीं समझ सकते कि मूल लेखक ने कुछ ऐसा क्यों लिखा है जो उन्होंने किया था। बेहतर होगा कि आप अपना जवाब दें या कोई टिप्पणी छोड़ें।
डैन बेहार्ड

या बहुत अलग चीजों से भी बदतर, आदेशों या कोड में एक सूक्ष्म बदलाव से अलग-अलग परिणाम हो सकते हैं, जो वास्तव में कठिन हो सकता है, मैं एक टिप्पणी के रूप में छोड़ने का सुझाव दूंगा ताकि उत्तर का पोस्टर खुद को संपादित कर सके या जवाब दे सके। संभावित अलग-अलग परिणामों को संदर्भित करने वाले एक काउंटर-क्लेम के साथ (जो इस तरह के काउंटर-दावे बल्कि सामान्य हैं)
निकोलस पिपिटोन

22

हां, आप कुछ गैर-मानक उपसर्ग का उपयोग करके एक रेफरी बना सकते हैं git update-ref। जैसे

  • शाखा को पुरा करें: git update-ref refs/archive/old-topic topic && git branch -D topic
  • शाखा को पुनर्स्थापित करें (यदि आवश्यक हो): git branch topic refs/archive/old-topic

गैर-मानक उपसर्ग (यहां refs/archive) के साथ रेफरी सामान्य रूप से नहीं दिखाए जाएंगे git branch, git logन ही git tag। फिर भी, आप उन्हें सूचीबद्ध कर सकते हैं git for-each-ref

मैं निम्नलिखित उपनामों का उपयोग कर रहा हूं:

[alias]
    add-archive = "!git update-ref refs/archive/$(date '+%Y%m%d-%s')"
    list-archive = for-each-ref --sort=-authordate --format='%(refname) %(objectname:short) %(contents:subject)' refs/archive/
    rem = !git add-archive
    lsrem = !git list-archive

इसके अलावा, आप रीमूव की push = +refs/archive/*:refs/archive/*गई शाखाओं को स्वचालित रूप से धकेलना चाहते हैं (या) को रिमूव करना चाहते हैंgit push origin refs/archive/*:refs/archive/* एक शॉट के लिए)।

दूसरा तरीका शाख हटाने से पहले कहीं SHA1 लिखना है, लेकिन इसकी सीमाएँ हैं। बिना किसी रेफरी के कमिटमेंट 3 महीने के बाद GC'd होगा (या बिना रिफ्लेक्ट के कुछ हफ़्ते) , अकेले मैनुअल होने देंgit gc --prune । रेफरी द्वारा इंगित कमिट GC से सुरक्षित हैं।

संपादित करें: @ap द्वारा समान विचार का एक शानदार कार्यान्वयन मिला :git-attic

^ ^ 2 संपादित करें: एक ब्लॉग पोस्ट मिली जहां Gitster खुद उसी तकनीक का उपयोग कर रहा है।


3
उत्कृष्ट, इस धागे पर बाकी सभी के अलावा, आपने वास्तव में इस सवाल का जवाब दिया।
tzrlk

20

रिमोट पर परिवर्तनों को प्रतिबिंबित करने के लिए स्टीव के उत्तर का विस्तार , मैंने किया

 git tag archive/<branchname> <branchname>
 git branch -D <branchname>
 git branch -d -r origin/<branchname>
 git push --tags
 git push origin :<branchname>

रिमोट से पुनर्स्थापित करने के लिए, इस प्रश्न को देखें ।


18

आप दूसरी रिपॉजिटरी में शाखाओं को संग्रहीत कर सकते हैं। बहुत सुंदर नहीं है, लेकिन मैं कहूंगा कि यह एक व्यवहार्य विकल्प है।

git push git://yourthing.com/myproject-archive-branches.git yourbranch
git branch -d yourbranch

4
आप git-bundleअलग रिपॉजिटरी के बजाय बना सकते हैं ।
जकुब नारबस्की

9

यहाँ इसके लिए एक उपनाम है:

arc    = "! f() { git tag archive/$1 $1 && git branch -D $1;}; f"

इसे इस तरह जोड़ें:

git config --global alias.arc '! f() { git tag archive/$1 $1 && git branch -D $1;}; f'

इस बात को ध्यान में रखें कि git archiveकमांड पहले से ही है इसलिए आप archiveअन्य नाम के रूप में उपयोग नहीं कर सकते ।

इसके अलावा, आप 'संग्रहीत' शाखाओं की सूची देखने के लिए अन्य को परिभाषित कर सकते हैं:

arcl   = "! f() { git tag | grep '^archive/';}; f"

उपनाम जोड़ने के बारे में


3
गिट के नए संस्करणों के साथ (जैसा कि यहां बताया गया है ), यह उपनाम पूरा करता है:!git tag archive/$1 $1 && git branch -D
लैक

5

मैं संग्रहीत शाखाओं को छिपाने के लिए निम्नलिखित उपनामों का उपयोग कर रहा हूं:

[alias]
    br = branch --no-merge master # show only branches not merged into master
    bra = branch                  # show all branches

तो git brसक्रिय रूप से विकसित शाखाओं git braको दिखाने के लिए और "संग्रहीत" सहित सभी शाखाओं को दिखाने के लिए ।


5
क्या एक शाखा को मास्टर में मिला दिया गया है, इसका संग्रह राज्य के साथ कोई लेना-देना नहीं है। उदाहरण के लिए, मेरी देव टीम में हमारे पास कुछ शाखाएँ हैं जो विशेष रूप से सामान का परीक्षण करने के लिए बनाई गई थीं। हम उन शाखाओं को अपने संग्रह में रखना चाहते हैं, लेकिन हम निश्चित रूप से उन्हें मास्टर में विलय नहीं करना चाहते हैं।
बार्ट

4

मैं शाखाओं को संग्रहीत नहीं करूंगा। एक और तरीका रखो, शाखाएं खुद को संग्रहित करती हैं। आप जो चाहते हैं वह यह है कि पुरातत्वविदों के लिए प्रासंगिक जानकारी सुनिश्चित करने के लिए विश्वसनीय तरीकों से पाया जा सकता है। इसमें विश्वसनीय है कि वे दैनिक विकास में सहायता करते हैं और काम पूरा होने की प्रक्रिया में एक अतिरिक्त कदम नहीं जोड़ते हैं। यह है, मुझे विश्वास नहीं है कि लोग एक शाखा के साथ एक बार टैग जोड़ने के लिए याद रखेंगे।

यहाँ दो सरल कदम हैं जो पुरातत्व और विकास में बहुत मदद करेंगे ।

  1. प्रत्येक कार्य शाखा को एक साधारण नामकरण सम्मेलन का उपयोग करते हुए समस्या ट्रैकर में संबद्ध मुद्दे के साथ लिंक करें
  2. हमेशा git merge --no-ffकार्य शाखाओं को मर्ज करने के लिए उपयोग करें; आप चाहते हैं कि मर्ज कमिट और हिस्ट्री बबल, यहां तक ​​कि सिर्फ एक कमिट के लिए।

बस। क्यों? क्योंकि एक कोड पुरातत्वविद् के रूप में, शायद ही कभी मैं यह जानना चाहता हूं कि एक शाखा में क्या काम किया गया था। अभी तक यह अक्सर चिल्ला रहा है कि सभी नौ नरक में इस तरह से लिखा कोड है ?!मुझे कोड बदलने की आवश्यकता है, लेकिन इसमें कुछ अजीब विशेषताएं हैं, और मुझे कुछ महत्वपूर्ण तोड़ने से बचने के लिए उन्हें पहेली बनाने की आवश्यकता है।

अगला चरण git blameसंबद्ध कमिट को ढूंढना है और फिर उम्मीद है कि लॉग संदेश व्याख्यात्मक है। अगर मुझे गहराई से खुदाई करने की ज़रूरत है, तो मुझे पता चलेगा कि क्या काम एक शाखा में किया गया था और शाखा को संपूर्ण रूप से पढ़ा था (इश्यू ट्रैकर में इसकी टिप्पणी के साथ)।

आइए git blameबताते हैं कमिटेड XYZ पर। मैं एक Git इतिहास ब्राउज़र (gitk, GitX git log --decorate --graph, आदि ...) खोलता हूं, XYZ को कमिट करता हूं और देखता हूं ...

AA - BB - CC - DD - EE - FF - GG - II ...
     \                       /
      QQ - UU - XYZ - JJ - MM

वहाँ मेरी शाखा है! मुझे पता है कि QQ, UU, XYZ, JJ और MM सभी एक ही शाखा के हिस्से हैं और मुझे उनके लॉग संदेशों को विवरण के साथ देखना चाहिए। मुझे पता है कि जीजी एक मर्ज कमिटमेंट होगा और उस शाखा का नाम होगा जो उम्मीद करता है कि ट्रैकर में एक मुद्दे के साथ जुड़ा हुआ है।

यदि, किसी कारण से, मैं एक पुरानी शाखा ढूंढना चाहता हूं जिसे मैं चला सकता हूं git logऔर मर्ज कमेटी में शाखा का नाम खोज सकता हूं । यह बहुत बड़े रिपॉजिटरी पर भी काफी तेज है।

यही मेरा मतलब है जब मैं कहता हूं कि शाखाएं खुद को संग्रहीत करती हैं।

प्रत्येक शाखा को टैग करने से चीजों को करने में अनावश्यक काम जुड़ जाता है (एक महत्वपूर्ण प्रक्रिया जिसे बेरहमी से सुव्यवस्थित किया जाना चाहिए), सैकड़ों टैग के साथ टैग सूची (प्रदर्शन की बात नहीं, लेकिन मानव पठनीयता) को मसूड़ों कि केवल कभी-कभी बहुत उपयोगी होते हैं, और। t पुरातत्व के लिए भी बहुत उपयोगी है।


2
लेकिन अव्यवस्था का क्या? शायद अगर 10 घन गज की गंदगी के नीचे पुरानी शाखाओं को छिपाने का एक तरीका था।
bjj

1
यह उपयोगी है, लेकिन यह बिना लाइसेंस वाली शाखाओं पर लागू नहीं है। कभी-कभी एक शाखा पर एक प्रयोग किया गया था और आप कुछ सामग्री बाद में उपयोगी होने की स्थिति में रखना चाहते हैं।
नील मैय्यू

1
@bvj मुझे लगता है कि यह उत्तर आपको सुझाव दे रहा है कि आपको हमेशा मर्ज की गई शाखाओं को हटाना चाहिए, क्योंकि आप हमेशा मर्ज कमिट के माध्यम से उनके पास वापस आ सकते हैं। मैं इससे सहमत हु।
नील मैय्यू

@NeilMayhew हाँ, मेरी लगभग 10 अनमैरिड शाखाएँ हैं, जो अपने आप खुल जाती हैं। प्रत्येक एक खुले कार्य के साथ जुड़ा हुआ है ताकि मुझे याद रहे कि मैं क्या कर रहा था। मैं या तो उनके साथ कुछ करूँगा, या वे इतने पुराने हो गए हैं कि वे अब प्रासंगिक नहीं हैं और मैं उन्हें हटा दूँगा। मैंने "मैं बाद में इसकी आवश्यकता हो सकती है" शाखाओं में पूरी तरह से डूबने वाली परियोजना पर काम किया ताकि हम शायद ही देख सकें कि हम क्या कर रहे थे। यह वास्तव में कुछ देवों के लिए स्वयं के बाद सफाई न करने का एक बहाना था। थोडा लेवे ठीक है, लेकिन इसे नियंत्रण से बाहर न जाने दें।
श्वेर्न

@ शेवर्न मैं सहमत हूं। मैं भी इस तरह की परियोजनाओं पर रहा हूँ। मुझे लगता है कि शाखाओं को टैग में परिवर्तित करना अव्यवस्था से छुटकारा पाने का एक अच्छा तरीका है, क्योंकि टैग की सूची हमेशा बढ़ती जा रही है जबकि शाखाओं की सूची नहीं होनी चाहिए (क्योंकि यह उस काम की मात्रा का प्रतिनिधित्व करती है जो चल रही है)। टैग के लिए नेमस्पेसिंग का उपयोग करना सूची को अधिक प्रबंधनीय बनाता है, लेकिन पैकरट प्रवृत्ति का निश्चित रूप से विरोध करने की आवश्यकता है। एक डेवलपर को अपनी मशीन पर कमिट्स को तब तक बनाए रखना चाहिए जब तक कि कोई अच्छा मौका न हो, जब कोई दूसरा उन्हें अंततः उपयोग करेगा।
नील मैय्यू

2

मेरा दृष्टिकोण उन सभी शाखाओं का नाम बदलना है जिनकी मुझे "trash_" उपसर्ग के साथ परवाह नहीं है, फिर उपयोग करें:

git branch | grep -v trash

(शेल कुंजी बाइंडिंग के साथ)

सक्रिय शाखा के रंग को बनाए रखने के लिए, एक की आवश्यकता होगी:

git branch --color=always | grep --color=never --invert-match trash

2
यदि शाखाओं का नाम बदला जा रहा है, तो आप उन्हें एक
नामपट्ट

1

आप एक स्क्रिप्ट का उपयोग कर सकते हैं जो आपके लिए शाखा को संग्रहीत करेगी

archbranch

यह आपके लिए उपसर्ग संग्रह के साथ एक टैग बनाता है / और फिर शाखा को हटा देता है। लेकिन इसका इस्तेमाल करने से पहले कोड को जांच लें।


उपयोग - $/your/location/of/script/archbranch [branchname] [defaultbranch]

यदि आप स्क्रिप्ट को बिना स्थान पर लिखे चलाना चाहते हैं तो उसे अपने पथ पर जोड़ें

तब आप इसे कॉल कर सकते हैं

$ archbranch [branchname] [defaultbranch]

[defaultbranch]शाखा है कि यह जब संग्रह किया जाता है के लिए जाना जाएगा है। रंग कोडिंग के साथ कुछ मुद्दे हैं लेकिन अन्य तो यह है कि यह काम करना चाहिए। मैं लंबे समय से परियोजनाओं में इसका उपयोग कर रहा हूं, लेकिन यह अभी भी विकास के अधीन है।


1
प्रति ढेर अतिप्रवाह मदद , आपको अपने उत्पाद के साथ अपनी संबद्धता का खुलासा करने की आवश्यकता है।
LittleBobbyTables - Au Revoir

ओह, माफ करना, पता नहीं था। मैं पटकथा का लेखक हूं।
बनजका

0

मैं कभी-कभी शाखाओं को निम्नानुसार संग्रहीत करता हूं:

  1. जैसे, पैच फ़ाइलें उत्पन्न करें, format-patch <branchName> <firstHash>^..<lastHash>(पहले से प्राप्त करें और अंतिम उपयोग करें git log <branchName>
  2. फ़ाइल सर्वर पर निर्देशिका के लिए उत्पन्न पैच फ़ाइलों को ले जाएँ।
  3. शाखा हटाएं, जैसे, git branch -D <branchName>

जब आप फिर से शाखा का उपयोग करने की आवश्यकता होती है, तो पैच को "लागू करें"; हालाँकि, पैच फ़ाइलों को लागू करना (देखें git am) लक्ष्य शाखा की स्थिति के आधार पर चुनौतीपूर्ण हो सकता है। प्लस साइड पर, इस दृष्टिकोण से शाखा के कमिट्स को कचरा एकत्र करने और आपके रेपो में जगह बचाने की अनुमति देने का लाभ होता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.