GIT: किसी विशिष्ट फ़ोल्डर में चेकआउट करें


128

मैं कुछ इसी तरह का उपयोग करना चाहते हैं:

git checkout -- <path>/<file>

लेकिन मैं फ़ाइल को कुछ फ़ोल्डर में चुनना चाहता हूँ जो मैं चुनता हूँ, बजाय स्थानीय ओवरराइटिंग के <path>/<file>

कोई उपाय?


जवाबों:


57

के अनुसार क्या एक "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 1.9.1 के साथ परीक्षण किया गया)
apeiros

1
यदि आप एक शाखा / नंगे गिट भंडार की जाँच करना चाहते हैं, तो उपयोग करेंGIT_WORK_TREE=../path/to/place git checkout
allicoder

4
git worktree(नीचे देखें) imho आज विहित उत्तर है और यहां जोड़ा जा सकता है।
geek-merlin

213

एक और समाधान जो थोड़ा क्लीनर है - बस एक अलग कार्य पेड़ निर्दिष्ट करें।

एक विशिष्ट बाहर निर्देशिका के लिए अपने हेड (इंडेक्स नहीं) से सब कुछ जांचने के लिए:

git --work-tree=/path/to/outputdir checkout HEAD -- .

एक विशेष निर्देशिका के लिए अपने हेड से एक उपनिर्देशिका या फ़ाइल की जांच करने के लिए:

git --work-tree=/path/to/outputdir checkout HEAD -- subdirname

4
माइनर टिप्पणी - आप यानी एक निरपेक्ष पथ की क्या ज़रूरत है विस्तार टिल्ड शेल के रूप में नहीं होती है, --work-tree=/home/thomasg/okcopyबजाय --work-tree=~/okcopy(संभवतः एक रिश्तेदार पथ का उपयोग कर, जबकि एक ही Git पेड़ के अंदर बैठे भी काम करता है, लेकिन इस तरह से झूठ पागलपन और git statusR'lyehian में आउटपुट)
टॉम गुडफेलो

10
यह पुराने कमिट के साथ अपेक्षा के अनुसार भी काम करता है (जैसे कि HEAD के स्थान पर SHA दें), लेकिन git statusफिर बहुत सारे मॉड दिखाते हैं (संभवत: क्योंकि सूचकांक अब अन्य निर्देशिका से मेल खाता है और अछूता सामान्य वर्क ट्री नहीं है)। git resetइसे वापस एक अच्छे राज्य में मिला।
टॉम गुडफेलो

2
यहाँ git statusएक ही बहुत सारे मॉड दिखाता है, और git resetमदद नहीं करता है। मुझे git checkout -f HEADअपने रेपो की स्थिति को बहाल करना था ।
DUzun

11
FYI करें: आपको निर्देशिका स्वयं बनाने की आवश्यकता है, अन्यथा आपको यह त्रुटि मिलती है:fatal: This operation must be run in a work tree
timaschew

13
यह विनाशकारी रूप से मुख्य कार्यशील पेड़ के सूचकांक को संशोधित करता है, जो आमतौर पर खराब होता है। जैसा कि @TomGoodfellow सुझाव देता है, git resetमुख्य कार्य वृक्ष को पवित्रता में पुनर्स्थापित करने के लिए पर्याप्त है। किसी भी SHA1, शाखा, या टैग पर सुरक्षित रूप से भंडार उपनिर्देशिका निर्यात करने के लिए, मुख्य कार्य वृक्ष को संशोधित किए बिना , चार्ल्स बैली का बदनाम git archiveसमाधान देखें । इसी तरह, एक ही समय में कई शाखाओं को सुरक्षित रूप से चेकआउट करने के लिए, नया git worktree addउपकमांड आपका मित्र है।
सेसिल करी

25

एक फ़ाइल के लिए:

git show HEAD:abspath/to/file > file.copy

2
+1 और "कुछ पिछले प्रतिबद्ध" (HEAD के बजाय) पर स्पष्ट करने के लिए: यह संदर्भित करता है SHA1 IDकि आसानी से पाया जा सकता है gitk। अगर मुझे केवल एक अस्थायी स्थान पर फ़ाइल "चेकआउट" करने की आवश्यकता है (यानी वापस नहीं आ रही है), तो मैं showgit show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
उपकॉन्ड का

19

उपरोक्त समाधान मेरे काम नहीं आए क्योंकि मुझे पेड़ के एक विशिष्ट टैग संस्करण की जांच करने की आवश्यकता थी। इस तरह 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

3
git --work-tree=/path/to/outputdir checkout <tag> -- .आपके लिए काम नहीं किया?
वॉरवरियुक

1
नहीं, यह नहीं है। मूल कार्य निर्देशिका में वास्तविक फ़ाइल अपरिवर्तित है, लेकिन चरणबद्ध संस्करण खो गया है और टैग से संस्करण के साथ बदल दिया गया है। यह विशेष रूप से बुरा है यदि मंचित संस्करण में प्रतिबद्ध होने के लिए परिवर्तनों का सावधानीपूर्वक उठाया गया सेट शामिल है। मैं नहीं चाहता कि निर्यात कमांड मेरे सूचकांक, अवधि को छू सके।
प्रोस्की

19

यदि आप अपनी सुविधा के तहत काम कर रहे हैं और वापस मास्टर के लिए चेकआउट नहीं करना चाहते हैं, तो आप चला सकते हैं:

cd ./myrepo

git worktree add ../myrepo_master master

git worktree remove ../myrepo_master

यह ब्रांच कमिट के ../myrepo_masterसाथ डायरेक्टरी बनाएगा master, जहां आप काम जारी रख सकते हैं


1
सबसे अच्छा जवाब - सरल, और इसके विपरीत git --work-tree=/path/to/outputdir checkout HEAD -- .यह सूचकांक के लिए कुछ भी नहीं करता है, बस चयनित शाखा को निर्दिष्ट स्थान पर कॉपी करता है (एक फ़ाइल के अलावा)।
रोजर ड्यूक

और मैं इस परिवर्तन को पूर्ववत कैसे करूंगा?
स्कॉट पी।

@ ScottP.just myrepo_masterनिर्देशिका को हटा दें
इसका लोकार्पण

1
इसे पूर्ववत करना वर्कट्री का एक उप-समूह है:git worktree remove ../myrepo_master
मार्टिज़न डासॉर्स्ट

8

एड्रियन का जवाब "घातक: यह ऑपरेशन एक काम के पेड़ में चलाया जाना चाहिए।" निम्नलिखित वह है जो हमारे लिए काम करता है।

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

+1 सफाई के लिए टिप्पणी करने के लिए - वर्तमान रेपो की गड़बड़ी करने के लिए हर कोई खुश है। केवल इसका कोई साइड-इफेक्ट नहीं है।
एंड्रयू हिल

1

के अलावा @ hasen का जवाबचेकआउट करने के लिए फ़ाइलों को सूचीबद्ध करने के लिए , आप git ls-filesइसके बजाय उपयोग करना चाह सकते हैं find:

git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin

ठीक से उपयोग करने के लिए धन्यवाद -z! अच्छा है कि आप स्क्रिप्ट प्रदान करते हैं जो कुछ प्रकार के इंजेक्शन हमलों के लिए असुरक्षित नहीं है।
ErikE

0

मैंने इसे प्राप्त करने के लिए 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"

0

मैं एक अस्थायी निर्देशिका में एक शाखा की जाँच के लिए इस उपनाम का उपयोग कर रहा हूँ:

[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

नए वर्कट्री को जोड़ने से पहले, यह स्वचालित रूप से उपनाम में भी किया जाता है।


0

git archive branch-index | tar -x -C your-folder-on-PCकिसी अन्य फ़ोल्डर में एक शाखा क्लोन करने के लिए उपयोग करें । मुझे लगता है, तब आप किसी भी फाइल को कॉपी कर सकते हैं, जिसकी आपको जरूरत है

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