जुलाई 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 lock
git 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
pclouds
sunshineco
gitster
worktree
: --quiet
विकल्प जोड़ें
अन्य आदेशों के अनुसार, ' --quiet
' विकल्प जोड़ें ।
' ' केवल एक ही कमांड है जो इससे प्रभावित है, ' ' को छोड़कर अन्य सभी कमांड्स वर्तमान में डिफ़ॉल्ट रूप से चुप हैं।git worktree
git
add
list
ध्यान दें कि " 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()
।
git-new-workdir
git checkout --to=<path>
Git 2.5 द्वारा प्रतिस्थापित किया जाएगा । देखें नीचे मेरा उत्तर