जवाबों:
के अनुसार क्या एक "Git निर्यात" (जैसे "SVN निर्यात")?
आप इसके लिए उपयोग कर सकते हैं git checkout-index, यह एक निम्न स्तर की कमांड है, यदि आप सब कुछ निर्यात करना चाहते हैं, तो आप उपयोग कर सकते हैं -a,
git checkout-index -a -f --prefix=/destination/path/
आदमी पृष्ठों को उद्धृत करने के लिए:
अंतिम "/" [उपसर्ग पर] महत्वपूर्ण है। निर्यातित नाम शाब्दिक रूप से निर्दिष्ट स्ट्रिंग के साथ उपसर्ग है।
यदि आप एक निश्चित निर्देशिका निर्यात करना चाहते हैं, तो इसमें कुछ तरकीबें शामिल हैं। कमांड केवल फाइलें लेती है, निर्देशिका नहीं। इसे निर्देशिकाओं पर लागू करने के लिए, 'खोज' कमांड का उपयोग करें और आउटपुट को गिट करने के लिए पाइप करें।
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
मैन पेज से भी:
आंतकवाद यहाँ लक्ष्य नहीं है। पुनरावृत्ति है।
GIT_WORK_TREE=../path/to/place git checkout
git worktree(नीचे देखें) imho आज विहित उत्तर है और यहां जोड़ा जा सकता है।
एक और समाधान जो थोड़ा क्लीनर है - बस एक अलग कार्य पेड़ निर्दिष्ट करें।
एक विशिष्ट बाहर निर्देशिका के लिए अपने हेड (इंडेक्स नहीं) से सब कुछ जांचने के लिए:
git --work-tree=/path/to/outputdir checkout HEAD -- .
एक विशेष निर्देशिका के लिए अपने हेड से एक उपनिर्देशिका या फ़ाइल की जांच करने के लिए:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopyबजाय --work-tree=~/okcopy(संभवतः एक रिश्तेदार पथ का उपयोग कर, जबकि एक ही Git पेड़ के अंदर बैठे भी काम करता है, लेकिन इस तरह से झूठ पागलपन और git statusR'lyehian में आउटपुट)
git statusफिर बहुत सारे मॉड दिखाते हैं (संभवत: क्योंकि सूचकांक अब अन्य निर्देशिका से मेल खाता है और अछूता सामान्य वर्क ट्री नहीं है)। git resetइसे वापस एक अच्छे राज्य में मिला।
git statusएक ही बहुत सारे मॉड दिखाता है, और git resetमदद नहीं करता है। मुझे git checkout -f HEADअपने रेपो की स्थिति को बहाल करना था ।
fatal: This operation must be run in a work tree
git resetमुख्य कार्य वृक्ष को पवित्रता में पुनर्स्थापित करने के लिए पर्याप्त है। किसी भी SHA1, शाखा, या टैग पर सुरक्षित रूप से भंडार उपनिर्देशिका निर्यात करने के लिए, मुख्य कार्य वृक्ष को संशोधित किए बिना , चार्ल्स बैली का बदनाम git archiveसमाधान देखें । इसी तरह, एक ही समय में कई शाखाओं को सुरक्षित रूप से चेकआउट करने के लिए, नया git worktree addउपकमांड आपका मित्र है।
एक फ़ाइल के लिए:
git show HEAD:abspath/to/file > file.copy
SHA1 IDकि आसानी से पाया जा सकता है gitk। अगर मुझे केवल एक अस्थायी स्थान पर फ़ाइल "चेकआउट" करने की आवश्यकता है (यानी वापस नहीं आ रही है), तो मैं showgit show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
उपरोक्त समाधान मेरे काम नहीं आए क्योंकि मुझे पेड़ के एक विशिष्ट टैग संस्करण की जांच करने की आवश्यकता थी। इस तरह cvs exportसे इसका उपयोग किया जाना है। git checkout-indexयह टैग तर्क नहीं लेता है, क्योंकि यह सूचकांक से फाइलों की जांच करता है। git checkout <tag>काम के पेड़ की परवाह किए बिना सूचकांक को बदल देगा, इसलिए मुझे मूल पेड़ को रीसेट करने की आवश्यकता होगी। मेरे लिए काम करने वाला समाधान रिपॉजिटरी को क्लोन करना था। साझा क्लोन काफी तेज है और ज्यादा जगह नहीं लेता है। .gitअगर वांछित निर्देशिका हटाया जा सकता है।
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
जीआईटी के नए संस्करणों git clone --branch <tag>को निर्दिष्ट टैग को स्वचालित रूप से जांचने के लिए समर्थन करना चाहिए :
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .आपके लिए काम नहीं किया?
यदि आप अपनी सुविधा के तहत काम कर रहे हैं और वापस मास्टर के लिए चेकआउट नहीं करना चाहते हैं, तो आप चला सकते हैं:
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
यह ब्रांच कमिट के ../myrepo_masterसाथ डायरेक्टरी बनाएगा master, जहां आप काम जारी रख सकते हैं
git --work-tree=/path/to/outputdir checkout HEAD -- .यह सूचकांक के लिए कुछ भी नहीं करता है, बस चयनित शाखा को निर्दिष्ट स्थान पर कॉपी करता है (एक फ़ाइल के अलावा)।
myrepo_masterनिर्देशिका को हटा दें
git worktree remove ../myrepo_master
एड्रियन का जवाब "घातक: यह ऑपरेशन एक काम के पेड़ में चलाया जाना चाहिए।" निम्नलिखित वह है जो हमारे लिए काम करता है।
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
टिप्पणियाँ:
--no-checkout नए वर्कट्री में कुछ भी चेकआउट न करें।--detach नए वर्कट्री के लिए एक नई शाखा न बनाएं।<some-ref>उदाहरण के लिए, किसी भी रेफरी के साथ काम करता है HEAD~1।git worktree prune।के अलावा @ hasen का जवाब । चेकआउट करने के लिए फ़ाइलों को सूचीबद्ध करने के लिए , आप git ls-filesइसके बजाय उपयोग करना चाह सकते हैं find:
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z! अच्छा है कि आप स्क्रिप्ट प्रदान करते हैं जो कुछ प्रकार के इंजेक्शन हमलों के लिए असुरक्षित नहीं है।
मैंने इसे प्राप्त करने के लिए git उर्फ को परिभाषित किया (इससे पहले कि मैंने यह प्रश्न पाया)।
यह एक छोटा बैश फ़ंक्शन है जो वर्तमान पथ को बचाता है, गिट रेपो पर स्विच करता है, एक चेकआउट करता है और जहां यह शुरू हुआ था, वहां वापस लौटाता है।
git checkto ~ ~ my_project_git विकसित करता है
यह उदाहरण "~ / my_project_git" निर्देशिका में विकसित शाखा की जांच करेगा।
यह अंदर अन्य उपनाम है ~/.gitconfig:
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
मैं एक अस्थायी निर्देशिका में एक शाखा की जाँच के लिए इस उपनाम का उपयोग कर रहा हूँ:
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
उपयोग:
git cot mybranch
फिर आपको अस्थायी निर्देशिका में एक नए शेल में छोड़ दिया जाता है जहां आप शाखा पर काम कर सकते हैं। आप इस निर्देशिका में git कमांड का उपयोग भी कर सकते हैं।
जब आप पूरा कर लें, निर्देशिका को हटा दें और चलाएं:
git worktree prune
नए वर्कट्री को जोड़ने से पहले, यह स्वचालित रूप से उपनाम में भी किया जाता है।