फ़िल्टर-शाखा -ट्री-फ़िल्टर के बाद जीआईटी रेपो से रेफ / मूल / सिर / मास्टर निकालें?


180

मेरा यहाँ भी वही सवाल था जो रूट डाइरेक्टरी में न्यू git रिपॉजिटरी को एक उप-डायरेक्टरी में मौजूद रिपोजिटरी को सब्सक्राइब करने के लिए होता है।

मैंने इस उत्तर का यहाँ अनुसरण किया है: रूट डायरेक्टरी में नया git रिपॉजिटरी एक उप-निर्देशिका में मौजूद रिपॉजिटरी को सब्सक्राइब करने के लिए

अब, gitk --allदो इतिहास दिखाता है: एक वर्तमान में समापन master, और एक नाम original/refs/heads/master

मुझे नहीं पता कि यह दूसरा इतिहास क्या है, या इसे रेपो से कैसे हटाया जाए। मुझे अपने भंडार में दो इतिहासों की आवश्यकता नहीं है।

मुझे इससे छुटकारा कैसे मिलेगा?

अपने आप को पुन: पेश करने के लिए:

mkdir -p project-root/path/to/module
cd project-root/path/to/module
mkdir dir1 dir2 dir3 
for dir in * ; do touch $dir/source-file-$dir.py ; done
git init
git add .
git commit -m 'Initial commit'

अब हमें मूल पोस्टर की समस्या है। चलिए ऊपर दिए गए उत्तर का उपयोग करके git रेपो के रूट को प्रोजेक्ट-रूट में ले जाते हैं:

git filter-branch --tree-filter 'mkdir -p path/to/module ; git mv dir1 dir2 dir3 path/to/module' HEAD
rm -rf path
cd ../../../ # Now PWD is project-root
mv path/to/module/.git .
git reset --hard

अब, मेरी वर्तमान समस्या देखें:

gitk --all &
git show-ref

मुझे refs/original/heads/masterऔर सभी संबद्ध इतिहास से कैसे छुटकारा मिलेगा ?


जवाबों:


321

refs/original/*वहाँ एक बैकअप के रूप में है, यदि आप अपनी फ़िल्टर-शाखा को गड़बड़ करते हैं। मेरा विश्वास करो, यह वास्तव में एक अच्छा विचार है।

एक बार जब आप परिणामों का निरीक्षण कर लेते हैं, और आप बहुत आश्वस्त होते हैं कि आपके पास वह है जो आप चाहते हैं, तो आप बैकअप अप को हटा सकते हैं:

git update-ref -d refs/original/refs/heads/master

या यदि आपने कई रेफ के लिए ऐसा किया है, और आप इसे मिटा देना चाहते हैं:

git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d

(यह फ़िल्टर-शाखा मैनपेज से सीधे लिया जाता है।)

यह आपके लिए लागू नहीं होता है, लेकिन अन्य लोगों के लिए जो इसे पा सकते हैं: यदि आप एक फ़िल्टर-शाखा करते हैं जो महत्वपूर्ण डिस्क स्थान लेने वाली सामग्री को निकालता है, तो आप भी चलाना चाह सकते हैं git reflog expire --expire=now --allऔर git gc --prune=nowअपने रिफ्लेक्स को समाप्त कर सकते हैं और अब-अप्रयुक्त वस्तुओं को हटा सकते हैं। । (चेतावनी: पूरी तरह से, पूरी तरह से अपरिवर्तनीय। ऐसा करने से पहले बहुत यकीन है।)


अपडेट-रेफ करने के बाद, reflog expire और gc, ये दोनों फाइलें अभी भी मूल रेफरी को संदर्भित करती हैं: .it / info / refs और ref git update-ref -d refs/original/refs/heads/master
.it

1
मुझे लगता है कि आपने गलती से शब्दों को मिला दिया है: अगर मैं सही हूं, तो यह होना चाहिए git update-ref -d original/refs/heads/master? हालांकि, केवल आपके दूसरे कमांड ने मेरे लिए काम किया।
JJD

4
यह git update-ref -d refs/original/refs/heads/masterbtw है। आप पूर्ण नाम का उपयोग करके देख सकते हैं git show-ref
प्रहार करें

4
छोटे के बारे में क्या git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d?
चार्ल्सबी


7

filter-branchबैकअप रखता है ताकि भंडार और कचरा इकट्ठा करने के लिए भंडार को साफ किया जा सके। सुनिश्चित करें कि विलोपन से पहले इस बैकअप की कोई आवश्यकता नहीं है:

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