अपस्ट्रीम प्रोजेक्ट फोर्स को मास्टर पर धकेलने के बाद मैं git सबट्री कैसे ठीक करूं?


13

मैं git सबट्री का उपयोग करके प्रयोग कर रहा हूं और निम्नलिखित स्थिति में चला गया हूं।

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

जैसा कि यह पता चला है, अपस्ट्रीम परियोजना में एक और योगदानकर्ता ने गलती से एक बड़ी फाइल को मास्टर शाखा में धकेल दिया। इसे ठीक करने के लिए, अपस्ट्रीम परियोजना ने इतिहास को फिर से लिखा और मास्टर पर धकेल दिया। अपना "मोनोरेपो" बनाते समय, मैंने इस कमिट को शामिल किया और मैं इसे हटाना भी चाहूंगा।

उपशीर्षक के नए इतिहास को दर्शाने के लिए मैं अपनी रिपॉजिटरी को कैसे अपडेट कर सकता हूं?

मेरा पहला प्रयास सबट्री और सभी इतिहास को पूरी तरह से हटाने के लिए फ़िल्टर-शाखा का उपयोग करना था।

git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD

एक बार सबट्री के पुराने संस्करण को हटा दिए जाने के बाद, मैं नए अपस्ट्रीम मास्टर का उपयोग करके सबट्री को फिर से जोड़ सकता हूं। हालाँकि, यह काम नहीं किया क्योंकि किसी कारण से कमिट हिस्ट्री अभी भी गिट लॉग आउटपुट में दिखाई देती है।

अपडेट करें

मैंने एक न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण बनाने के लिए कदम उठाए हैं।

  1. सबसे पहले एक खाली गिट रेपो बनाएं।

    git init test-monorepo
    cd ./test-monorepo
    
  2. एक प्रारंभिक प्रतिबद्ध बनाएँ।

    echo hello world > README
    git add README
    git commit -m 'initial commit'
    
  3. अब किसी बाहरी प्रोजेक्ट के लिए एक सबट्री जोड़ें।

    git remote add thirdparty git@github.com:teivah/algodeck.git
    git fetch thirdparty
    git subtree add --prefix algodeck thirdparty master
    
  4. मोनोरपो पर कुछ कमिट करें

    echo dont panic >> algodeck/README.md
    git commit -a -m 'test commit'
    
  5. अब सबट्री को हटाने के लिए गिट फ़िल्टर-ब्रांच का उपयोग करने का प्रयास करें।

    git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
    
  6. जीआईटी लॉग आउटपुट की जांच करें, मैं केवल मेरी प्रारंभिक प्रतिबद्धता को देखने की उम्मीद कर रहा हूं।

    git log
    

क्या आपने gc --prune = को अब पुराने कमिट्स को बाहर निकालने की कोशिश की है? क्या पुराने संस्करण के लिए कुछ रेफरी हैं?
डेमियानो

1
मैंने अभी तक यह कोशिश नहीं की, लेकिन git gc --prune=nowकेवल उन कमिट्स को डिलीट नहीं करेगा, जो दिखाई नहीं देते हैं git log?
20

git Branch -all का उपयोग करके (जो मुझे लगता है कि आप "पुराने" कमिट्स देखने के लिए उपयोग कर रहे हैं) को अपनी वर्तमान शाखा से असंबंधित कमेंट्स को भी दिखाना चाहिए।
डेमियानो

1
दरअसल, मैं बस कर रहा था git log, कोई तर्क नहीं और मैं अभी भी पुराने कमिट्स को देखता हूं।
21

क्या आप अपना git लॉग - प्रॉजेक्ट --all --graph पोस्ट कर सकते हैं? बस अपनी स्थिति को समझने के लिए
डेमियानो

जवाबों:


0

आपको अपने इतिहास में पहले से ही खराब-कमिटमेंट मिला है और जारी रखने से पहले आपको इससे छुटकारा पाने की जरूरत है

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

आप पिछली प्रतिबद्ध जांच कर सकते हैं और अपने शाखा मार्कर को 1 कदम पीछे (या एक्स कदम पीछे) धक्का दे सकते हैं जो किसी भी मामले में हानिरहित होगा और फिर फिर से खींचेगा

जैसे

git checkout master~1
git branch master -f
git checkout master
git pull
  1. git checkout master~1 मास्टर की माता-पिता की जाँच के लिए, हम चेतावनी देते हैं कि हम शाखाएँ हैं
  2. git branch master -f वर्तमान चेकआउट को फिर से मास्टर करने के लिए मजबूर करने के लिए, अर्थात यह वास्तव में मास्टर शाखा को अपनी पिछली प्रतिबद्ध (या एक्स पिछली प्रतिबद्ध) को याद दिलाता है, और यहां से, यह कोई फर्क नहीं पड़ता कि अपस्ट्रीम ने एक बल किया या नहीं, हम सामान्य रूप से फिर से शुरू कर सकते हैं, या यहां तक ​​कि यदि आवश्यक हो तो ऊपर दिए गए चरण पर वापस जाएं, हम केवल मास्टर को फिर से खींच सकते हैं, ऊपर से कुछ भी खोए बिना (जो हमारे लिए केवल-पढ़ने के लिए भी हो सकता है, हम इसके लिए कुछ भी धक्का नहीं देंगे)
  3. git checkout master हमारे "रिवाइंड" मास्टर ब्रांच पर होना, वही कमिटमेंट जिस पर हम कदम रख रहे हैं, लेकिन अब ब्रांच पर होने के बजाय
  4. git pullमास्टर को फिर से खींचने के लिए (साथ या बिना हो सकता है --prune), अगर अपस्ट्रीम को डायवर्ट किया गया है, तो हम यहाँ से ट्रैक पर वापस आएँगे, यदि नहीं, तो हमें वही मिलेगा जो हमारे पास था, अगर हमें वही मिला और माना नहीं गया, तो शायद हम ऊपर दिए गए 1 कदम पर वापस जाने की जरूरत है और अधिक कमिट्स, जैसे git checkout master~5या जो भी आवश्यक हो , वापस करें।

मुझे नहीं लगता कि इस के साथ काम करेंगे हैgit subtree
csnate

@csnate यह एक subrepo से पिछले प्रतिबद्ध चेकआउट और बहुत समान प्रक्रिया का पालन करें, यदि आप एक MCVE निर्माण यह आप सटीक आदेशों को बताने के लिए पालन करने के लिए आसान होगा के लिए संभव है stackoverflow.com/help/minimal-reproducible-example
arhak

मैं GitHub पर एक नमूना रेपो बनाने की कोशिश करूंगा।
15

मैंने मूल प्रश्न में चरणों का एक समूह बनाया है जो इस मुद्दे को दर्शाता है।
सीएसएनटी

0
  1. अपने रेपो पर, इस रिमोट के लिए आने वाले इतिहास को साफ करें:

    git fetch upstream
    
  2. यदि आपकी खुद की एक कमिट में एक बड़ी फाइल शामिल है, तो अपने इतिहास को फिर से लिखें ताकि यह बड़ी फाइल अब संदर्भित न हो

    # using one or more of the following commands :
    git rebase --interactive
    git filter-branch
    ...
    

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


यदि आपको अपनी हार्ड ड्राइव से इस बड़ी फ़ाइल ASAP को हटाने की तत्काल आवश्यकता है:

मैन्युअल रूप से चलाते हैं

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