Git: एक डायरेक्टरी की सभी फाइलों को दूसरी ब्रांच से कॉपी करें


188

मैं किसी अन्य शाखा की निर्देशिका की सभी फ़ाइलों को कैसे कॉपी करूं? मैं उस निर्देशिका की सभी फाइलों को सूचीबद्ध करके सूचीबद्ध कर सकता हूं

git ls-tree master:dirname

मैं तब व्यक्तिगत रूप से सभी फाइलों को कॉपी कर सकता हूं

git checkout master -- dirname/filename

हालाँकि, वाइल्डकार्ड का उपयोग करना अब तक कुल विफल रहा है। यह कुछ नहीं करता है:

git checkout master -- dirname/*.png

हालांकि मुझे लगता है कि मैं ऐसा करने के लिए बैश स्क्रिप्ट का उपयोग कर सकता हूं, एक आसान तरीका है, है ना?

जवाबों:


289

जैसा कि आप पेड़ में फाइलों को इधर-उधर करने की कोशिश नहीं कर रहे हैं, आपको सिर्फ निर्देशिका की जांच करने में सक्षम होना चाहिए:

git checkout master -- dirname

2
अगर मैं कॉपी की गई फ़ाइलों के लिए प्रतिबद्ध संदेश बनाए रखना चाहता हूं तो क्या होगा?
totels

2
@ दूरस्थ, सख्ती से बोल रहे हैं कि फाइलों से जुड़े कोई भी प्रतिबद्ध संदेश नहीं हैं; कमिट मैसेज कमिटेड ऑब्जेक्ट से ही जुड़ा होता है। यह वह है जो मैं अनुमान लगा रहा हूं कि आप चाहते हैं: ऐसा git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;कहां $COMMIT_SHA1हो सकता है branch_aऔर वह प्रतिबद्ध वस्तु होगी जो आपके द्वारा वांछित संदेश है। मैं यह नहीं जानता कि प्रोग्राम को सबसे हाल के बदलाव के साथ प्रतिबद्ध कैसे निर्धारित किया जाएdirname
अलेक्जेंडर बर्ड

1
यह एक बहुत ही अजीब दुष्प्रभाव है। यह कॉपी dirnameकरता है, लेकिन यह किसी भी फाइल को कॉपी करता .gitignoreहै जो masterशाखा में हैं। किसी भी विचार क्यों है?
मिलीमीटर

4
एक और दुष्प्रभाव मुझे लगता है कि अगर वर्तमान शाखा में आपके द्वारा चेक की गई शाखा में अतिरिक्त फाइलें नहीं हैं (किसी दिए गए लक्ष्य फ़ोल्डर में), तो यह मूल रूप से उन्हें एक साथ मिला देगा - शायद यह सिर्फ एक पूर्वज है? मैं शर्तों के बारे में बिल्कुल निश्चित नहीं हूं, लेकिन यदि आपके पास शाखा ए में 20 फाइलें और शाखा बी में 20 फाइलें हैं और उनमें से केवल 10 का नाम एक ही फाइल नाम है, तो आप 30 फाइलों के साथ समाप्त होते हैं (कम से कम मेरे मामले में जहां शाखा ए शाखा बी का पूर्वज है)
कोडरकेक

@ बार-बार git कमांड देखें cherry-pick। यह अन्य शाखाओं से भी लागू होता है, लेकिन केवल वे फ़ाइलें जिन्हें आप चाहते हैं, कमिट में बदल दिए गए थे।
सीएस 01

18

यदि रास्तों में कोई स्थान नहीं है, और आप रुचि रखते हैं, जैसे मैं था, केवल विशिष्ट एक्सटेंशन की फ़ाइलों में, आप उपयोग कर सकते हैं

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')

4
यह एक दया है कि प्रत्यक्ष रूप से इस फ़ंक्शन का समर्थन नहीं करता है। बिल्कुल ओपी की तरह, मैंने सोचा होगा कि यह कुछ ऐसा होगाgit checkout master -- *.c
ग्रेगरी कूहन

1
इस जवाब ने मुझे जवाब देने में मदद की "मैं किसी अन्य शाखा से अपनी वर्तमान कार्यशील शाखा को दिए गए पैटर्न की फ़ाइलों की जांच कैसे कर सकता हूं?"
usr-local--
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.