Git के साथ कई काम निर्देशिका?


242

मुझे यकीन नहीं है कि यह कुछ गिट द्वारा समर्थित है, लेकिन सिद्धांत रूप में ऐसा लगता है कि यह मेरे लिए काम करना चाहिए।

मेरे वर्कफ़्लो में अक्सर एक साथ कई शाखाओं में फ़ाइलों का मेरा संपादन शामिल होता है। दूसरे शब्दों में, मैं अक्सर एक शाखा में कुछ फाइलें खोलना चाहता हूं, जबकि मैं दूसरी शाखा में किसी अन्य फ़ाइल की सामग्री को संपादित करता हूं।

इसका एक विशिष्ट समाधान दो चेकआउट करना है, लेकिन यह शर्म की बात है कि मैं उनके बीच शाखाएं और रेफरी साझा नहीं कर सकता। क्या मैं चाहूंगा कि सिर्फ दो काम करने वाली निर्देशिका एक ही .गित फ़ोल्डर द्वारा प्रबंधित हो।

मुझे स्थानीय git क्लोन समाधानों के बारे में पता है (डिफ़ॉल्ट, जो कि साझा की गई वस्तुओं को हार्डलिंक करने के लिए है, और --समस्त विकल्प, जो मूल रेपो के साथ एक वैकल्पिक ऑब्जेक्ट स्टोर सेट करता है), लेकिन ये समाधान केवल डिस्क स्थान उपयोग में कटौती करते हैं , और विशेष रूप से - के मामले में, जोखिम से भरा लगता है।

वहाँ एक .गित फ़ोल्डर का उपयोग करने का एक तरीका है, और दो कार्यशील निर्देशिकाओं द्वारा समर्थित है? या जीआईटी हार्डकोड किया गया है कि किसी भी समय केवल एक कार्यशील निर्देशिका की जाँच की जाए?


1
git-new-workdirgit checkout --to=<path>Git 2.5 द्वारा प्रतिस्थापित किया जाएगा । देखें नीचे मेरा उत्तर
VonC

3
दरअसल, कमांड git worktree add <path> [<branch>](Git 2.5 rc2) होगा। देखें नीचे मेरी संपादित जवाब
VonC

जब से आपके मूल रूप से प्रश्न पूछा गया है तब से आपको वॉनसी के उत्तर को स्वीकार करना चाहिए, क्योंकि चीजें बदल गई हैं।
xaxxon

अद्यतन उत्तर के लिए धन्यवाद!
जटॉल्स

जवाबों:


293

जुलाई 2.5 के बाद से Git 2.5 का प्रस्ताव है contrib/workdir/git-new-workdir: git worktree

जुनियो सी gitsterहमानो ( ) द्वारा प्रतिबद्ध 68a2e6a देखें ।

रिहाई टिप्पणी का उल्लेख है :

contrib/workdir/git-new-workdirउस के लिए एक प्रतिस्थापन प्रतीकात्मक लिंक पर निर्भर नहीं करता है और वस्तुओं के बंटवारे और रेफरी को एक दूसरे से अवगत कराकर बोरोवे और उधारकर्ताओं को सुरक्षित बनाते हैं।

799767cc9 प्रतिबद्ध देखें (Git 2.5rc2)

इसका मतलब है कि अब आप कर सकते हैंgit worktree add <path> [<branch>]

इसमें बनाएं <path>और चेकआउट करें <branch>। नई वर्किंग डायरेक्टरी को वर्तमान रिपॉजिटरी से जोड़ा गया है, वर्किंग डायरेक्टरी स्पेसिफिक फाइल्स जैसे HEAD, इंडेक्स आदि को छोड़कर सब कुछ साझा करना। git worktreeसेक्शन:

एक गिट रिपॉजिटरी कई कार्यशील पेड़ों का समर्थन कर सकती है , जिससे आप एक बार में एक से अधिक शाखाएं देख सकते हैं।
के साथ git worktree add, एक नया काम करने वाला पेड़ भंडार के साथ जुड़ा हुआ है।

इस नए काम करने वाले पेड़ को " git init" या " git clone" द्वारा तैयार "मुख्य काम करने वाले पेड़" के विपरीत "लिंकिंग वर्किंग ट्री" कहा जाता है
एक रिपॉजिटरी में एक मुख्य कार्यशील पेड़ होता है (यदि यह एक नंगे रिपॉजिटरी नहीं है) और शून्य या अधिक लिंक्ड वर्किंग ट्री हैं।

विवरण:

प्रत्येक लिंक किए गए कार्यशील पेड़ में रिपॉजिटरी की $GIT_DIR/worktreesनिर्देशिका में एक निजी उप-निर्देशिका है ।
निजी उप-निर्देशिका का नाम आमतौर पर लिंक्ड वर्किंग ट्री के पथ का आधार नाम है, संभवतः इसे अद्वितीय बनाने के लिए एक नंबर के साथ जोड़ा गया है।
उदाहरण के लिए, जब $GIT_DIR=/path/main/.gitकमांड git worktree add /path/other/test-next nextबनाता है:

  • में जुड़े हुए काम कर पेड़ /path/other/test-nextऔर
  • एक $GIT_DIR/worktrees/test-nextनिर्देशिका भी बनाता है (या $GIT_DIR/worktrees/test-next1यदि test-nextपहले से ही लिया गया है)।

एक जुड़े हुए काम के पेड़ के भीतर:

  • $GIT_DIRइस निजी निर्देशिका (उदाहरण /path/main/.git/worktrees/test-nextके लिए) में इंगित करने के लिए सेट है और
  • $GIT_COMMON_DIRमुख्य काम करने वाले पेड़ $GIT_DIR(जैसे /path/main/.git) को वापस इंगित करने के लिए सेट किया गया है ।

ये सेटिंग्स .gitलिंक्ड वर्किंग ट्री की शीर्ष निर्देशिका में स्थित फ़ाइल में बनाई गई हैं ।

जब आप एक लिंक किए गए काम के पेड़ के साथ किया जाता है तो आप इसे हटा सकते हैं।
भंडार में काम कर पेड़ के प्रशासनिक फ़ाइलों अंत में स्वचालित रूप से हटा दिया जाएगा (देखें gc.pruneworktreesexpireमें git config), या आप चला सकते हैं git worktree pruneकिसी भी बासी प्रशासनिक फ़ाइलों को साफ करने के मुख्य या लिंक किए गए काम कर पेड़ में।


चेतावनी: अभी भी एक git worktree"BUGS" अनुभाग है जिसके बारे में पता होना चाहिए।

सबमॉड्यूल का समर्थन अधूरा है
सुपरप्रोजेक्ट के कई चेकआउट करने की अनुशंसा नहीं की जाती है।


नोट: git 2.7rc1 (Nov 2015) के साथ आप अपने कार्यपत्रकों को सूचीबद्ध करने में सक्षम हैं ।
देखें bb9c03b प्रतिबद्ध , 92718b7 प्रतिबद्ध , प्रतिबद्ध 5,193,490 , प्रतिबद्ध 1ceb7f9 , प्रतिबद्ध 1ceb7f9 , प्रतिबद्ध 5,193,490 , प्रतिबद्ध 1ceb7f9 , प्रतिबद्ध 1ceb7f9 (08 अक्टू 2015), प्रतिबद्ध 92718b7 , प्रतिबद्ध 5,193,490 , प्रतिबद्ध 1ceb7f9 , प्रतिबद्ध 1ceb7f9 (08 अक्टू 2015), प्रतिबद्ध 5,193,490 , 1ceb7f9 (08 अक्टूबर 2015), 1ceb7f9 प्रतिबद्ध (08 अक्टूबर 2015), और प्रतिबद्ध accec761(०२ अक्टूबर २०१५) माइकल रैप्पाज़ो ( rappazzo) द्वारा
( जूनियो सी gitsterहमानो द्वारा विलय - - in a46dcfb , 26 अक्टूबर 2015)

worktree: ' list' कमांड जोड़ें

' git worktree list' वर्कट्री सूची के माध्यम से पुनरावृत्ति करता है, और वर्कट्री के लिए पथ सहित वर्कट्री का विवरण प्रस्तुत करता है, वर्तमान में पुनरीक्षण और शाखा की जाँच करता है, और यदि कार्य ट्री नंगे है।

$ git worktree list
/path/to/bare-source            (bare)
/path/to/linked-worktree        abcd1234 [master]
/path/to/other-linked-worktree  1234abc  (detached HEAD)

चीनी मिट्टी के बरतन प्रारूप विकल्प भी उपलब्ध है।

चीनी मिट्टी के बरतन प्रारूप में प्रति विशेषता रेखा होती है।

  • विशेषताओं को एक एकल स्थान द्वारा अलग किए गए एक लेबल और मूल्य के साथ सूचीबद्ध किया गया है।
  • बूलियन विशेषताओं (जैसे 'नंगे' और 'अलग') को केवल एक लेबल के रूप में सूचीबद्ध किया गया है, और केवल मौजूद हैं यदि और केवल यदि मान सत्य है।
  • एक खाली रेखा एक वर्कट्री के अंत का संकेत देती है

उदाहरण के लिए:

$ git worktree list --porcelain

worktree /path/to/bare-source
bare

worktree /path/to/linked-worktree
HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
branch refs/heads/master

worktree /path/to/other-linked-worktree
HEAD 1234abc1234abc1234abc1234abc1234abc1234a
detached

नोट: यदि आप वर्कट्री फ़ोल्डर को चलाते हैं, तो आपको मैन्युअल रूप से gitdirफाइल को अपडेट करना होगा ।

देखें प्रतिबद्ध 618244e (22 जनवरी 2016), और d4cddd6 प्रतिबद्ध (18 जनवरी 2016) द्वारा गुयेन थाई Ngọc Duy ( pclouds)
मदद-द्वारा: एरिक सनशाइन ( sunshineco)
(द्वारा विलय Junio सी Hamano - gitster- में d0a1cbc प्रतिबद्ध , 10 फरवरी 2016)

2.8 (मार्च 2016) में नए डॉक्टर में शामिल होंगे:

यदि आप एक लिंक किए गए कार्य ट्री को स्थानांतरित करते हैं, तो आपको gitdirप्रविष्टि की निर्देशिका में फ़ाइल को अपडेट करना होगा ।
उदाहरण के लिए, यदि किसी लिंक किए गए वर्किंग ट्री को ले जाया जाता है /newpath/test-nextऔर उसकी .gitफ़ाइल इंगित करती है /path/main/.git/worktrees/test-next, तो इसके बजाय /path/main/.git/worktrees/test-next/gitdirसंदर्भ के लिए अपडेट करें /newpath/test-next


शाखा हटाते समय सावधान रहें: git 2.9 (जून 2016) से पहले, आप किसी अन्य कार्यशील पेड़ में उपयोग में से एक को हटा सकते हैं ।

जब " git worktree" सुविधा उपयोग में है, " git branch -d" उस शाखा को हटाने की अनुमति देता है जिसे किसी अन्य कार्यक्षेत्र में जांचा जाता है।

काज़ुकी यामागुची ( ) द्वारा f292244 (29 मार्च 2016) देखें । मदद-द्वारा: एरिक सनशाइन ( )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 4fca4e3 , 13 अप्रैल 2016)rhenium
sunshineco
gitster

branch -d: किसी शाखा को हटाने से मना करना जो वर्तमान में चेक आउट है

जब एक शाखा को वर्तमान कार्यशील वृक्ष द्वारा जांचा जाता है, तो शाखा को हटाना मना है।
हालाँकि जब शाखा की जाँच अन्य कार्यशील वृक्षों द्वारा की जाती है, तो गलत तरीके से हटाने पर सफलता मिलती है। यह जांचने के लिए
उपयोग find_shared_symref()करें कि क्या शाखा उपयोग में है, न कि केवल वर्तमान कार्यशील पेड़ की हेड के साथ तुलना करने के लिए।


इसी तरह, git 2.9 (जून 2016) से पहले, किसी अन्य वर्कट्री में चेक की गई शाखा का नाम बदलकर, अन्य वर्कट्री में प्रतीकात्मक HEAD को समायोजित नहीं किया गया था।

प्रतिबद्ध देखें 18eb3a9 (08 अप्रैल 2016), और 70999e9 , 2233066 (27 मार्च 2016) को काज़ुकी यामागुची ( rhenium) द्वारा प्रतिबद्ध करें
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 741a694 , 18 अप्रैल 2016)

branch -m: सभी प्रति-वर्कट्री हेड्स अपडेट करें

किसी शाखा का नाम बदलने पर, वर्तमान में केवल वर्तमान कार्यशील वृक्ष का HEAD ही अद्यतन किया जाता है, लेकिन उसे सभी कार्यशील वृक्षों के HEAD को अद्यतन करना होगा जो पुरानी शाखा में इंगित करते हैं।

यह वर्तमान व्यवहार है, / पथ / से / wt का HEAD अपडेट नहीं है:

  % git worktree list
  /path/to     2c3c5f2 [master]
  /path/to/wt  2c3c5f2 [oldname]
  % git branch -m master master2
  % git worktree list
  /path/to     2c3c5f2 [master2]
  /path/to/wt  2c3c5f2 [oldname]
  % git branch -m oldname newname
  % git worktree list
  /path/to     2c3c5f2 [master2]
  /path/to/wt  0000000 [oldname]

यह पैच एक शाखा का नाम बदलने के दौरान सभी प्रासंगिक कार्यक्षेत्र हेड्स को अपडेट करके इस समस्या को ठीक करता है।


लॉकिंग मैकेनिज्म आधिकारिक तौर पर git 2.10 (Q3 2016) के साथ समर्थित है

देखें 080739b प्रतिबद्ध , 6d30862 प्रतिबद्ध , 58142c0 प्रतिबद्ध , 346ef53 प्रतिबद्ध , 346ef53 प्रतिबद्ध , प्रतिबद्ध 58142c0 , 346ef53 प्रतिबद्ध , प्रतिबद्ध 346ef53 (13 जून 2016), और 984ad9e प्रतिबद्ध , 6,835,314 प्रतिबद्ध द्वारा (03 जून 2016) गुयेन थाई Ngọc Duy ( pclouds)
सुझाए गए द्वारा: एरिक सनशाइन ( sunshineco)
(द्वारा विलय Junio सी Hamano - gitster- में प्रतिबद्ध 2c608e0 , 28 जुला 2016)

git worktree lock [--reason <string>] <worktree>
git worktree unlock <worktree>

यदि लिंक किए गए वर्किंग ट्री को पोर्टेबल डिवाइस या नेटवर्क शेयर पर संग्रहीत किया जाता है, जो हमेशा माउंट नहीं होता है, तो आप इसकी प्रशासनिक फाइलों को git worktree lockकमांड जारी करके चुभने से रोक सकते हैं , वैकल्पिक रूप से यह --reasonसमझाने के लिए कि वर्किंग ट्री लॉक क्यों है।

<worktree>: यदि काम करने वाले पेड़ों के बीच काम करने वाले मार्ग में अंतिम पथ घटक अद्वितीय हैं, तो इसका उपयोग कार्यशील पेड़ों की पहचान करने के लिए किया जा सकता है।
उदाहरण के लिए यदि आपको केवल " /abc/def/ghi" और " /abc/def/ggg" पेड़ों पर काम करना है , तो " ghi" या " def/ghi" पूर्व काम करने वाले पेड़ को इंगित करने के लिए पर्याप्त है।


Git 2.13 (Q2 2017) Nguyin Thái Ng Thc Duy ( ) द्वारा प्रतिबद्ध 507e6e9 (12 अप्रैल 2017) में एक lockविकल्प जोड़ें । सुझाव-द्वारा: डेविड टेलर ( ) । मदद-द्वारा: जेफ किंग ( )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध e311597 , 26 अप्रैल 2017)pclouds
dt
peff
gitster

इसे बनाने के तुरंत बाद वर्कट्री को लॉक करने की अनुमति दें।
यह " git worktree add; git worktree lock" और " git worktree prune" के बीच दौड़ को रोकने में मदद करता है ।

तो बाद git worktree add' --lock के बराबर है , लेकिन दौड़ की स्थिति के बिना।git worktree lockgit worktree add


Git 2.17+ (Q2 2018) इस उत्तर को जोड़ता है : git worktree move/ ।git worktree remove


Git 2.19 (Q3 2018) " --quiet" क्रिया को git worktree add"कम क्रिया" बनाने के लिए जोड़ें ।

एलिया पिंटो ( ) द्वारा प्रतिबद्ध 371979 सी (15 अगस्त 2018) देखें । हेल्प-बाय: मार्टिन engren, Duy Nguyen ( ) , और Eric Sunshine ( )(द्वारा विलय Junio सी Hamano - - में a988ce9 प्रतिबद्ध , 27 अगस्त 2018)devzero2000
pcloudssunshineco
gitster

worktree: --quietविकल्प जोड़ें

अन्य आदेशों के अनुसार, ' --quiet' विकल्प जोड़ें । ' ' केवल एक ही कमांड है जो इससे प्रभावित है, ' ' को छोड़कर अन्य सभी कमांड्स वर्तमान में डिफ़ॉल्ट रूप से चुप हैं।git worktreegit
addlist


ध्यान दें कि " git worktree add" स्टेट के साथ mkdir" और उसके बाद एक उपलब्ध नाम ढूंढता था ", जो रेस-प्रोन है।
यह लूप में उपयोग mkdirऔर प्रतिक्रिया करके Git 2.22 (Q2 2019) के साथ तय किया गया है EEXIST

Michal Suchanek ( ) द्वारा प्रतिबद्ध 7af01f2 (20 फ़रवरी 2019) देखें । (द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध 20fe798 , 09 अप्रैल 2019)hramrach
gitster

worktree: worktree addदौड़ को ठीक करें

Git एक काम करने वाले नाम को खोजने के लिए एक स्टेटमेंट लूप चलाता है जो उपलब्ध है और फिर mkdirपाए गए नाम पर करता है । कार्यपत्रों के एक और आह्वान से बचने के
लिए इसे mkdirलूप में बदल दें और समान मुक्त नाम खोजकर पहले डायरेक्टरी बनाएं।


Git 2.22 (Q2 2019) यह बताने के लिए तर्क को ठीक करता है कि क्या Git रिपॉजिटरी में एक कार्यशील पेड़ git branch -Dहै जो वर्तमान में गलती से जाँच की गई शाखा को हटाने से बचाता है।
इस तर्क का कार्यान्वयन असामान्य नाम वाले रिपॉजिटरी के लिए टूट गया था, जो दुर्भाग्य से इन दिनों सबमॉड्यूल्स के लिए आदर्श है।

जोनाथन टैन ( ) द्वारा प्रतिबद्ध f3534c9 (19 अप्रैल 2019) देखें । (द्वारा विलय Junio सी Hamano - - में ec2642a प्रतिबद्ध , 08 मई 2019)jhowtan
gitster

कोड पुल 178 अंतर्दृष्टि का अनुरोध करता है

worktree: अद्यतन is_bareआंकड़े

जब " git branch -D <name>" चलाया जाता है, तो गिट आमतौर पर पहले चेक करता है कि क्या वह शाखा वर्तमान में चेक आउट है।
लेकिन यह चेक नहीं किया जाता है यदि उस रिपॉजिटरी की Git डायरेक्टरी " <repo>/.git" पर नहीं है , जो कि यदि रिपॉजिटरी एक सबमॉड्यूल है तो इसकी Git डायरेक्टरी को " super/.git/modules/<repo>", उदाहरण के लिए स्टोर किया जाता है ।
शाखा में यह परिणाम हटाए जाने के बावजूद इसे चेक किया जाता है।

इसका कारण यह है get_main_worktree()में worktree.cसेट is_bareएक worktree केवल अनुमानी है कि एक रेपो नंगे है अगर worktree के मार्ग में "अंत नहीं है का उपयोग करने पर /.git", और नहीं तो नंगा नहीं।
इस is_bareकोड को 92718b7 (" worktreeवर्कट्री स्ट्रक्चर में विवरण जोड़ें", 2015-10-08, Git v2.7.0-rc0) में एक हेयुरिस्टिक के बाद पेश किया गया था pre-core.bare

यह पैच 2 काम करता है:

  • टीच get_main_worktree()का उपयोग करने के is_bare_repository()बजाय, में शुरू की 7d1864c ( "is_bare_repository परिचय () और core.bare विन्यास चर", 2007-01-07, Git v1.5.0-RC1) और में अद्यतन e90fdc3 , 2007 ( "स्वच्छ ऊपर काम पेड़ हैंडलिंग" -08-01, जीआईटी v1.5.3-आरसी 4)।
    यह git branch -D <name>ऊपर वर्णित " " समस्या को हल करता है।

हालाँकि ... यदि एक रिपॉजिटरी है, core.bare=1लेकिन " git" कमांड उसके एक द्वितीयक कार्यपत्रक से चलाया जा रहा है, तो is_bare_repository()वह गलत है (जो ठीक है, क्योंकि वर्कट्री उपलब्ध है)।

और, मुख्य कार्यक्षेत्र को गैर-नंगे के रूप में मानने पर जब यह समस्या होती है:

उदाहरण के लिए, मुख्य वर्कट्री के HEAD द्वारा संदर्भित एक सेकेंडरी वर्कट्री से एक शाखा को हटाने में विफलता, भले ही वह मुख्य वर्कट्री नंगी हो।

उससे बचने के लिए, core.bareसेटिंग करते समय भी जांच करें is_bare
यदि core.bare=1, इस पर भरोसा करें, और अन्यथा, उपयोग करें is_bare_repository()


1
यह उनके द्वारा बनाई गई सबसे अच्छी चीज़ है, बस मैं जो चाह रहा था। उसके लिए धन्यवाद!

केवल काम करने वाले पेड़ को कैसे हटाएं और अभी भी शाखा को बनाए रखें
रणदीप सिंह

@DotnetRocks आप किसी भी कार्यशील पेड़ (आपके कंप्यूटर पर एक स्थानीय फ़ोल्डर) को हटा सकते हैं: जिसका शाखा पर कोई प्रभाव नहीं होगा: मुख्य .गित रेपो में अभी भी पूर्ण प्रतिबद्ध इतिहास शामिल होगा, इसकी सभी शाखाओं के साथ, चाहे या नहीं। काम कर रहे पेड़ को हटा दिया गया है।
VonC

हाँ, लेकिन अगर मेरे सिस्टम पर बस उस फ़ोल्डर में जाकर काम करने वाले पेड़ को हटा दें और फिर हटा दें तो git मुझे उस शाखा पर चेकआउट करने नहीं देता है और कहता है कि पहले से ही <path> (<path> worktree path) पर चेकआउट करें। लेकिन ऐसा लगता है कि अगर मैं निम्नलिखित करता हूं: rm -rf <path> git worktree prune तो यह काम करता है। क्या वह सही है ?
रणदीप सिंह

1
@ जयन शुक्रिया। मैंने यह स्पष्ट कर दिया है कि 2.5 और 2.7 अब बाहर हैं।
VonC

113

gitवितरण के साथ आता है एक योगदान स्क्रिप्ट कहा जाता है git-new-workdir। आप इसका उपयोग इस प्रकार करेंगे:

git-new-workdir project-dir new-workdir branch

जहाँ प्रोजेक्ट-डायर निर्देशिका का नाम है जिसमें आपकी .gitरिपॉजिटरी है। यह स्क्रिप्ट उन .gitफ़ाइलों के अलावा मूल एक के लिए कई सिम्लिंक के साथ एक और निर्देशिका बनाता है जिसे साझा नहीं किया जा सकता (जैसे वर्तमान शाखा), आपको दो अलग-अलग शाखाओं में काम करने की अनुमति देता है।

यह थोड़ा नाजुक लगता है, लेकिन यह एक विकल्प है।


3
+1 मैं सही खड़ा हूं, यह बहुत बढ़िया है। यह इतिहास और शाखाओं को दो अलग-अलग चेक आउट रिपॉजिटरी के बीच बिना किसी धक्का / खींच के, केवल सिम्लिंकिंग के साथ साझा करने के लिए प्रतीत होता है। मैं इस बात से पूरी तरह अनजान था कि git इसे संभाल सकता है। काश, यह मेरे वितरण में शामिल नहीं होता।
meagar

2
Msysgit (विंडोज़) का उपयोग करने वालों के लिए आप स्क्रिप्ट के इस पोर्ट किए गए संस्करण का उपयोग कर सकते हैं: github.com/joero74/git-new-workdir
amos

9
आमतौर पर यह अच्छा काम करता है, लेकिन अगर आपने गलती से एक ही शाखा को अलग-अलग स्थानों पर संपादित किया है, तो चीजों को वापस ठीक करना अनौपचारिक है।
grep

Git <2.5 पर अटके और जिनके पास सबमॉड्यूल्स हैं, उनके लिए कोशिश करें git-new-workdir-recursiveकि वह किसके लिए रैपर है git-new-workdir
वालफ

13

मैं इस सवाल के समाधान के लिए आया था जो मुझे यहां नहीं मिला। इसलिए अब जब मुझे वह मिला, जिसकी मुझे जरूरत थी, तो मैंने इसे दूसरों के लिए पोस्ट करने का फैसला किया।

कैविएट: यह एक अच्छा समाधान नहीं है यदि आपको ओपी राज्यों की तरह एक साथ कई शाखाओं को संपादित करने की आवश्यकता है। यह एक साथ कई शाखाओं की जाँच करने के लिए है जिसे आप संपादित करने का इरादा नहीं रखते हैं। (एकाधिक काम निर्देशिका एक .गित फ़ोल्डर द्वारा समर्थित है।)

पहली बार इस सवाल पर आने के बाद मैंने कुछ चीजें सीखीं:

  1. " नंगे भंडार " क्या है। यह अनिवार्य रूप से .gitनिर्देशिका की सामग्री है , बिना काम के पेड़ में स्थित है।

  2. तथ्य यह है कि आप विकल्प के .gitसाथ कमांड लाइन पर आपके द्वारा उपयोग किए जा रहे रेपो के स्थान (आपके डीआईआर का स्थान ) को निर्दिष्ट कर सकते हैंgit--git-dir=

  3. तथ्य यह है कि आप के साथ अपने काम की नकल के स्थान को निर्दिष्ट कर सकते हैं --work-tree=

  4. "मिरर रेपो" क्या है।

यह अंतिम एक महत्वपूर्ण अंतर है। मैं वास्तव में रेपो पर काम नहीं करना चाहता , मुझे सिर्फ अलग-अलग शाखाओं की प्रतियां और / या टैग एक साथ चेक करने की आवश्यकता है। वास्तव में, मुझे यह गारंटी देने की आवश्यकता है कि शाखाएं मेरे रिमोट की शाखाओं से अलग नहीं हैं। तो एक दर्पण मेरे लिए एकदम सही है।

तो मेरे उपयोग के मामले के लिए, मुझे वह मिल गया जो मुझे करने की आवश्यकता थी:

git clone --mirror <remoteurl> <localgitdir> # Where localgitdir doesn't exist yet
mkdir firstcopy
mkdir secondcopy
git --git-dir=<localgitdir> --work-tree=firstcopy checkout -f branch1
git --git-dir=<localgitdir> --work-tree=secondcopy checkout -f branch2

इस बारे में बड़ी चेतावनी यह है कि दोनों प्रतियों के लिए एक अलग HEAD नहीं है। इसलिए उपरोक्त के बाद, रनिंग git --git-dir=<localgitdir> --work-tree=firstcopy statusब्रांच 2 से ब्रांच 1 तक के सभी अंतरों को बिना किसी परिवर्तन के दिखाएगा - क्योंकि HEAD ब्रांच 2 की ओर इशारा कर रहा है। (इसलिए मैं -fविकल्प का उपयोग करता हूं checkout, क्योंकि मैं वास्तव में स्थानीय स्तर पर कोई भी बदलाव करने की योजना नहीं बना रहा हूं। जब तक मैं -fविकल्प का उपयोग करता हूं, तब तक मैं किसी भी कार्य-वृक्ष के लिए किसी भी टैग या शाखा की जांच कर सकता हूं ।)

एक ही कंप्यूटर पर उन्हें संपादित करने की आवश्यकता के बिना कई चेकआउट होने के मेरे उपयोग के मामले के लिए , यह पूरी तरह से काम करता है। मुझे नहीं पता कि स्क्रिप्ट के बिना कई काम के पेड़ों के लिए कई हेड होने का कोई तरीका है जैसे कि अन्य उत्तरों में कवर किया गया है, लेकिन मुझे उम्मीद है कि यह किसी और के लिए उपयोगी है।


यह वही है जो मैं देख रहा था, लेकिन मुझे यह काम करने के लिए नहीं मिल रहा है ... मैं "घातक हो रहा हूं: एक गिट रिपॉजिटरी नहीं:" <स्थानीयजितिर>> "। कोई विचार?
दान आर।

कोई बात नहीं, मुझे लगता है कि मैं अपनी निर्देशिका नाम में "~" का उपयोग कर रहा था, और git को यह पसंद नहीं था। जब मैंने पूरा रास्ता इस्तेमाल किया, तो यह ठीक काम किया।
दान आर

@DRR, खुशी है कि यह मदद की। :) आप भी उपयोग कर सकते हैं $HOME। उपरोक्त विधि के बारे में एक और चेतावनी है जिसे मैंने बाद में खोजा, जिसका उन फाइलों के साथ क्या है जो एक या किसी अन्य शाखा में मौजूद नहीं हैं। यदि आप A को dir1 में चेकआउट करते हैं, तो B को dir2 में चेकआउट करते हैं, फिर चेकआउट C को dir1 में बाध्य करते हैं, यदि कोई ऐसी फ़ाइल है जो A में मौजूद है, लेकिन B या C में नहीं है, तो फ़ाइल को dir1 से बल चेकआउट द्वारा भी नहीं हटाया जाएगा। । तो आपको git cleanऐसे मामले में प्रयोग करने की आवश्यकता हो सकती है - या मैंने जो किया, वह करें और केवल इस पद्धति का उपयोग करके हौसले से बनाई गई निर्देशिका को आबाद करें।
वाइल्डकार्ड

पारितोषिक के लिए धन्यवाद। मैं वैसे भी रूबी में एक CLI उपकरण के हिस्से के रूप में इसे लपेटने जा रहा हूं, इसलिए मैं यह सुनिश्चित करूंगा कि यह हमेशा खरोंच से शुरू होता है।
दान आर

@DRR, उस समय आपको उस कोड को देखने में रुचि हो सकती है जो मैं लिख रहा था । यह ज्यादातर आम तौर पर किसी भी git मंचन स्क्रिप्ट के लिए लागू होता है, CFEngine सिंटैक्स चेक के अपवाद के साथ। (शायद आप इसे रूबी सिंटैक्स चेक से बदल सकते हैं।) :)
वाइल्डकार्ड

3

एकमात्र उपाय जो मैं सोच सकता हूं, वह दो निर्देशिकाओं को क्लोन करना और उन्हें एक-दूसरे के रिमोट रिपोजिटरी के रूप में जोड़ना है। फिर आप बदले हुए सामान को दूसरे से वास्तव में दूरस्थ रिपॉजिटरी में धकेलने के बिना एक से दूसरे में सामान खींच सकते हैं।

मैं मान रहा हूं कि आपके पास दो कार्यशील निर्देशिकाएं हैं और रिमोट के दो क्लोन नहीं हैं क्योंकि आप कुछ शाखाओं को रिमोट पर नहीं धकेलना चाहते हैं। अन्यथा, आपके रिमोट के दो क्लोन ठीक काम करेंगे - आपको केवल तीनों को सिंक में रखने के लिए कुछ पुश और पुल करने की आवश्यकता है।


नमस्ते। ऊपर के व्यक्ति ने एक अच्छा समाधान साझा किया, गिट वर्कट्री कमांड। यह एक ही रिपॉजिटरी से कई बार क्लोन की तुलना में अधिक अच्छी तरह से काम करता है। इसे आज़माएं, आपको यह नई सुविधा पसंद आएगी।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.