दिलचस्प पोस्ट
कोल्डफ्यूज़न 10 रिटर्नस्वरूप = "JSON" वर्ण जोड़ना इकाई प्रकार ApplicationUser वर्तमान संदर्भ के लिए मॉडल का हिस्सा नहीं है एंड्रॉइड होम स्क्रीन विजेट (आइकन, लेबल शैली) कमजोर संदर्भ लाभ मूल रखने के दौरान स्ट्रिंग पर मैं पर्ल प्रतिस्थापन कैसे करूं? मैं सक्रिय स्क्रीन आयाम कैसे प्राप्त करूं? WPF उपयोगकर्ता नियंत्रण अभिभावक एक ग्राफ में कनेक्ट किए गए घटकों को खोजें फेसबुक ग्राफ़ एपी – एक व्यवस्थापक के रूप में फैन पेज पर पोस्टिंग एक एनोटेट और असैनोटेड टैग के बीच अंतर क्या है? जैक्सन JSON का उपयोग करते हुए वसंत MVC में JSON को पार्स करना 2 डी में दूसरे बिंदु से एक बिंदु घुमाएं पी-वैल्यू खींचें और रैखिक प्रतिगमन से आर-स्क्वायर खींचें सीएसएस संपत्ति से पहले तारांकन का उद्देश्य Android.intent.action.MAIN का क्या अर्थ है?

उप-निर्देशिकाओं को संरक्षित करते समय एक जीआईटी रिपॉजिटरी को कैसे विभाजित किया जाए?

मैं क्या चाहता हूं इस प्रश्न के समान है। हालांकि, मैं उस निर्देशिका को चाहूंगा जो एक अलग रिपो में विभाजित है जो कि रेपो में उप-डायरेक्टरी रहती है:

मेरे पास यह है:

foo/ .git/ bar/ baz/ qux/ 

और मैं इसे दो पूरी तरह से स्वतंत्र रिपॉजिटरी में विभाजित करना चाहता हूं:

 foo/ .git/ bar/ baz/ quux/ .git/ qux/ # Note: still a subdirectory 

यह कैसे git में करने के लिए?

मैं इस उत्तर से इस पद्धति का उपयोग कर सकता हूं कि इतिहास में सभी नई रेपो की सामग्री को सबडिरेक्टरी में स्थानांतरित करने का कोई तरीका है।

Solutions Collecting From Web of "उप-निर्देशिकाओं को संरक्षित करते समय एक जीआईटी रिपॉजिटरी को कैसे विभाजित किया जाए?"

आप वास्तव में उप-डायरेक्टरी में सामग्री को वापस करने के लिए एक इंडेक्स फिल्टर के बाद उप-डायरेक्टरी फिल्टर का इस्तेमाल कर सकते हैं, लेकिन क्यों परेशान, जब आप अपने आप ही इंडेक्स फ़िल्टर का प्रयोग कर सकते थे?

यहां मैन पेज से एक उदाहरण दिया गया है:

 git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD 

यह सिर्फ एक फ़ाइल नाम को हटा देता है; आप क्या करना चाहते हैं सब कुछ निकाल दिया जाता है लेकिन दिए गए उपनिर्देशिका यदि आप सतर्क रहना चाहते हैं, तो आप स्पष्ट रूप से निकालने के लिए प्रत्येक मार्ग की सूची कर सकते हैं, लेकिन यदि आप अभी-अभी जाना चाहते हैं, तो आप ऐसा कुछ कर सकते हैं:

 git filter-branch --index-filter 'git ls-tree -z --name-only --full-tree $GIT_COMMIT | grep -zv "^directory-to-keep$" | xargs -0 git rm --cached -r' -- --all 

मुझे उम्मीद है कि शायद एक और अधिक सुंदर तरीका है; अगर किसी को कुछ है कृपया यह सुझाव है!

उस कमांड पर कुछ नोट्स:

  • फ़िल्टर-शाखा आंतरिक रूप से वर्तमान प्रतिबद्ध SHA1 को GIT_COMMIT सेट करता है
  • मुझे उम्मीद नहीं होती थी कि --full-tree आवश्यक हो, लेकिन जाहिरा तौर पर फ़िल्टर-शाखा ने रिपो के शीर्ष स्तर के बजाय .git-rewrite/t निर्देशिका से सूचकांक फ़िल्टर चलाता है।
  • grep शायद overkill है, लेकिन मुझे नहीं लगता कि यह एक गति मुद्दा है।
  • --all सभी सभी --all पर यह लागू होता है; मुझे लगता है कि आप वास्तव में चाहते हैं कि। (the -- यह फ़िल्टर-शाखा विकल्पों से अलग करता है)
  • -z और -0 फाइल नामों में रिक्त स्थान को संभालने के लिए NUL समाप्ति का उपयोग करने के लिए एलएस-ट्री, जीआरपी और एक्सग्स को बताएं।

बहुत बाद में संपादित करें: थॉमस ने मददगार तरीके से अभी-खाली कमिट को हटाने का सुझाव दिया है, लेकिन यह अब पुराना है संपादन इतिहास को देखो यदि आपके पास गिट का एक पुराना संस्करण है, लेकिन आधुनिक जीआईटी के साथ, आपको यह विकल्प चुनने की ज़रूरत है:

 --prune-empty 

यह इंडेक्स फिल्टर के आवेदन के बाद खाली किए गए सभी कमिट को निकाल देगा।

मैं एक समान काम करना चाहता था, लेकिन जब से उन फाइलों की सूची जिसे मैं रखना चाहता था, वह बहुत लंबा था, यह अनगिनत ग्रिप्स का उपयोग करने के लिए यह समझ में नहीं आया था मैंने एक स्क्रिप्ट लिखा है जो फाइल की फाइलों की सूची पढ़ती है:

 #!/bin/bash # usage: # git filter-branch --prune-empty --index-filter \ # 'this-script file-with-list-of-files-to-be-kept' -- --all if [ -z $1 ]; then echo "Too few arguments." echo "Please specify an absolute path to the file" echo "which contains the list of files that should" echo "remain in the repository after filtering." exit 1 fi # save a list of files present in the commit # which is currently being modified. git ls-tree -r --name-only --full-tree $GIT_COMMIT > files.txt # delete all files that shouldn't be removed while read string; do grep -v "$string" files.txt > files.txt.temp mv -f files.txt.temp files.txt done < $1 # remove unwanted files (ie everything that remained in the list). # warning: 'git rm' will exit with non-zero status if it gets # an invalid (non-existent) filename OR if it gets no arguments. # If something exits with non-zero status, filter-branch will abort. # That's why we have to check carefully what is passed to git rm. if [ "$(cat files.txt)" != "" ]; then cat files.txt | \ # enclose filenames in "" in case they contain spaces sed -e 's/^/"/g' -e 's/$/"/g' | \ xargs git rm --cached --quiet fi 

काफी आश्चर्य की बात है, यह मुझे पहले से अपेक्षा की तुलना में अधिक काम करने के लिए निकला, इसलिए मैंने इसे यहां पोस्ट करने का निर्णय लिया।

जब मैंने यह स्वयं किया था, तब इस मुद्दे को हल करने के लिए मैं यही कर रहा हूं:

 git filter-branch --index-filter \ 'git ls-tree --name-only --full-tree $GIT_COMMIT | \ grep -v "^directory-to-keep$" | \ sed -e "s/^/\"/g" -e "s/$/\"/g" | \ xargs git rm --cached -r -f --ignore-unmatch \ ' \ --prune-empty -- --all 

यह समाधान जेफोमी के उत्तर पर आधारित है और अलग-अलग गीटम भंडार में अलग-अलग डिटैच (चाल) उप-डायरेक्टरी पर आधारित है, और यहां पर बहुत से टिप्पणियां हैं।

जेफमी का समाधान मेरे लिए काम नहीं करने का कारण था, मेरे पास मेरे रिपो में फाइल और फ़ोल्डर्स थे, जिनके नाम में विशेष वर्ण (अधिकतर स्थान) थे। इसके अतिरिक्त git rm ने बेजोड़ फाइलों के बारे में शिकायत की है ( --ignore-unmatch साथ हल)

आप रिपो के रूट में नहीं जा रहे डायरेक्टरी को फ़िल्टरिंग अज्ञेयवादी रख सकते हैं या चारों ओर ले जाया जा सकता है:

 grep --invert-match "^.*directory-to-keep$" 

और अंत में, आप इसका उपयोग फ़ाइलों या निर्देशिकाओं के एक निश्चित उप-समूह को फ़िल्टर करने के लिए कर सकते हैं:

 egrep --invert-match "^(.*file-or-directory-to-keep-1$|.*file-or-directory-to-keep-2$|…)" 

बाद में आप इन कमांड का उपयोग कर सकते हैं:

 $ git reset --hard $ git show-ref refs/original/* --hash | xargs -n 1 git update-ref -d $ git reflog expire --expire=now --all $ git gc --aggressive --prune=now 

क्लीनर विधि:

 git filter-branch --index-filter ' git read-tree --empty git reset $GIT_COMMIT path/to/dir ' \ -- --all -- path/to/dir 

या सिर्फ मुख्य आज्ञाओं के साथ छड़ी करने के लिए, git read-tree --prefix=path/to/dir/ $GIT_COMMIT:path/to/dir रीसेट के लिए git read-tree --prefix=path/to/dir/ $GIT_COMMIT:path/to/dir

Rev-list arg पर path/to/dir निर्दिष्ट करना, जल्दी से छंटनी करता है, एक फिल्टर के साथ यह सस्ता होता है, इससे कोई फर्क नहीं पड़ता, लेकिन वैसे भी वैसे प्रयास से बचने के लिए अच्छा है।