2014-05-05 6 views
5

मैंने git filter-branch के साथ गड़बड़ करना शुरू कर दिया। ऑल विकल्प सभी शाखाओं और टैगों को फिर से लिखता है। ठंडा। git filter-branch रीफ/मूल में ओवरराइट किए गए सभी रेफरी का बैकअप बनाता है। बहुत ही शांत। अब मैं अपने सभी प्रयोग filter-branch के साथ उड़ाना चाहता हूं।पूर्ववत करें "गिट फ़िल्टर-शाखा ... - --all"? एक आदेश में?

क्या git filter-branch <whatever filter> -- --all के प्रभावों को पूरी तरह से पूर्ववत करने का कोई आसान तरीका है? अर्थात। सभी पुनर्लेखित शाखाओं को अपने मूल राज्य में एक बार में बहाल करने के लिए?

यदि कोई पूर्ववर्ती तरीका नहीं है, तो वहां होना चाहिए। यदि कोई पूर्ववत तरीका नहीं है, तो क्या किसी के पास एक छोटी सी स्क्रिप्ट है जो यह करेगी?

स्पष्ट रूप से कामकाज है। मैं इसे मैन्युअल रूप से पुनर्स्थापित कर सकता हूं, एक समय में एक शाखा, जैसे this question में। या मैं सिर्फ nuke और फिर से क्लोन कर सकता था। या तो कई रिपब्लिक/टैग्स के साथ रेपो में तेज़ी से थकाऊ हो जाएगा (कहें) छोटे रिपो में विभाजित हो रहा है।

+0

[पूर्ववत गिट फ़िल्टर-शाखा] के संभावित डुप्लिकेट (https://stackoverflow.com/questions/14542326/undo-git-filter-branch) –

उत्तर

5

यहां फ़िल्टर शाखा पूर्ववत करने के लिए एक सरल और सुरक्षित तरीका है:

git fetch . +refs/original/*:* 

तो शाखा अभी चेक आउट (HEAD) शाखाओं में से एक से बहाल किया जा रहा है, इस आदेश असफल हो जायेगी। आप को git fetch सभी शाखाओं को अपडेट करने के लिए पहले से चला सकते हैं। git fetch चलाने के बाद शाखा को चेकआउट करना याद रखें!

एक बार refs सफलतापूर्वक पुनर्स्थापित किया गया है, तो आप refs/original refs सुरक्षित रूप से इस आदेश के साथ नष्ट कर सकते हैं:

git for-each-ref refs/original --format='delete %(refname) %(objectname)' | git update-ref --stdin 

पुराना जवाब:

git for-each-ref refs/heads refs/tags \ 
     --format='git update-ref "%(refname)" "%(refname)@{1 hour ago}"' 

जोड़ा सुरक्षा आप सकता है के लिए परीक्षण करें कि फ़िल्टर-शाखा वास्तव में रेफरी अपडेट करती है:

git for-each-ref refs/heads refs/tags --format=' 
     { git reflog -1 "%(refname)" | sed -n "/filter-branch: rewrite$/Q1"; } \ 
        || git update-ref -m "reset to before filter-branch" \ 
          %(refname) %(refname)@{1}' | sh -x 
+0

यह एक अच्छा स्क्रिप्ट समाधान की तरह दिखता है (और इसे पार्सिंग ने मेरे sed और git क्षितिज का विस्तार किया)। गिट अपडेट-रेफ के उपयोग से फ़ाइलों की मैन्युअल प्रतिलिपि (गिट डॉक्स के अनुसार) से सुरक्षित होना चाहिए।जब मैंने कोशिश की तो यह ज्यादातर काम करता था, लेकिन मुझे कुछ त्रुटियां भी मिलीं जैसे 'घातक: लॉग फॉर' रेफ्स/रिमोट्स/मूल/मास्टर 'में केवल 1 प्रविष्टियां हैं।' अभी तक क्यों नहीं है। sh -x भी एक अच्छा स्पर्श है, हालांकि आउटपुट किसी कारण से खराब हो गया है। मुझे संदेह है कि उपप्रोसेस से आउटपुट टर्मिनल आउटपुट पर दौड़ रहा है और एक-दूसरे पर मुद्रित हो रहा है। – stochastic

+0

हां, शायद इसे 'प्रत्येक-रेफरी रेफ/हेड रेफ/टैग --format = आदि' के लिए' गिट बनाना चाहिए। फिक्स्ड। – jthill

+0

बात यह है कि यदि गिट ने कभी-कभी-कभी-उपयोगी-चीज के लिए पुशबटन को कार्यान्वित करने का प्रयास किया है, तो आप स्क्रिप्ट की कुछ पंक्तियों के साथ प्राप्त कर सकते हैं, इसमें पुशबटन को ढूंढने में अधिक समय लगेगा जो आप इसे लागू करने के बजाय जो चाहते हैं वह करता है। उस अंतिम टिप्पणी पर – jthill

1

एहम्म, से .git/refs/heads में अपने स्थान पर सभी रेफरी ले जाएं? मेरा मतलब सचमुच चलता है, ये सादा पाठ फाइलें हैं। यदि आप मौजूद हैं तो भी .git/packed-refs पर एक नज़र डालें।

+0

उस उत्तर के लिए धन्यवाद। मुझे पता था कि उन फाइलें मौजूद थीं और उन्होंने क्या किया था, लेकिन .git फ़ोल्डर में मैन्युअल रूप से गड़बड़ करना आपदा से जूझ रहा था। मैंने यह किया: 'सीडी myrepo/.git/refs/original' ' cp -r refs/* ..' और यह चाल चल रहा था। उस पैक-रेफ फ़ाइल मुझे चिंता करता है, यद्यपि। मुझे पता है कि फ़ाइल मौजूद नहीं होने पर पैक-रेफ को फ़ॉलबैक के रूप में उपयोग किया जाता है। मुझे लगता है कि 'गिट फ़िल्टर-शाखा' पैक-रेफ को छूता नहीं है। क्या यहां कोई अन्य गॉचा है? – stochastic

+0

'पैक-रेफ' 'जीआईटी जीसी' के दौरान बनाया गया है और '.git/refs' में फ़ाइलों के लिए एक वसादार विकल्प के रूप में उपयोग किया जाता है। आमतौर पर, यह कोई समस्या नहीं है क्योंकि .git/refs में प्रविष्टियां इसे ओवरराइड करती हैं, और 'गिट फ़िल्टर-शाखा' एक दुर्लभ ऑपरेशन है इसलिए "चीजों को स्वचालित करने" की आवश्यकता नहीं है, लेकिन यह सुनिश्चित करने के लिए कि सब कुछ आपके नियंत्रण में है :) – user3159253

संबंधित मुद्दे