मैं केवल यहां चिंतन कर रहा हूं क्योंकि मुझे लगता है कि @ वोनसी का जवाब पूरी तरह से समझा नहीं जाता है कि पता @ जैकाबीट की चिंताओं को क्यों डूबता है।
मुझे लगता है कि वे ठीक होने से अधिक मुद्दों का कारण बनेंगे; हाल ही में हमें तीन साल के फर्मवेयर को डीबग करना पड़ा, जिसके लिए स्थिर विश्लेषण करने के लिए जारी होने वाली समस्या के लिए हमारे स्थानीय कोडेबेस को रीसेट करना आवश्यक था। जैसा कि मैं समझता हूं कि सबमिशन के स्थानीय संस्करण को उस भंडार से अलग किया गया है जिसमें यह रहता है, जिसका मतलब है कि भंडार को पुरानी प्रतिबद्धता में रीसेट करना बाकी के भंडार के संबंध में "भविष्य" में सबमिशन छोड़ देगा।
यह पूरी तरह से गलत नहीं है। हालांकि, यह कहना गलत है कि submodules आपको अपने कोडबेस का पुराना संस्करण देखने की अनुमति नहीं देते हैं। यह भ्रम इस तथ्य से उत्पन्न होता है कि git checkout
प्रसंस्करण कार्यरत पेड़ों को अपडेट नहीं करता है, बल्कि आपको वह नौकरी छोड़ देता है (git submodule update --init --recursive
यह आपके लिए करेगा)।
सबमोड्यूल रिपोजिटरी निर्भरताओं को नियंत्रित करने के लिए शानदार उपकरण हैं। वास्तव में, वे विशेष रूप से क्या आप उन्हें करना चाहते हैं: निर्भरता की एक विशिष्ट संस्करण साथ अपने कोड की एक विशिष्ट संस्करण संबद्ध करते हैं। विशेष रूप से, एक "सबमिशन" वास्तव में केवल एक टेक्स्ट फ़ाइल है जिसमें SHA-1 हैश है जो सबमिशन रेपो पर एक प्रतिबद्धता के अनुरूप है (.gitmodules
में सबमिशन रिमोट के बारे में गिट स्टोर्स मेटाफॉर्मेशन, यह है कि यह कैसे जानता है कि सबमिशन की एक प्रति कहां प्राप्त करें से रेपो)।
हालांकि, submodules के साथ काम करना, कांटेदार हो सकता है। इसके लिए आपको गिट मॉडल की अच्छी समझ होनी चाहिए (& काम करने वाले पेड़/स्टेजिंग/रेपो) और सबमिशन सिस्टम की समझ स्वयं ही होती है। लेकिन अगर आप सुनिश्चित करते हैं कि लोग जानते हैं कि वे क्या कर रहे हैं (और यह बहुत बड़ा है), तो आप अपने पैर में खुद को शूटिंग से बच सकते हैं।
तुम बहुत विशेष रूप से अपने codebase के एक पुराने संस्करण को रोलबैक करने की क्षमता के बारे में चिंतित होने लगते हैं, और @ VonC के जवाब अपनी चिंताओं allayed गए हैं लगता नहीं है, इसलिए मैं एक पूर्वाभ्यास कैसे की यहाँ प्रदान करेंगे ऐसा करने के लिए:
मैं अपने personal .dotfiles repo एक उदाहरण के रूप इस्तेमाल करेंगे (मैं submodules के रूप में विम एक्सटेंशन में खींच; इस लेखन के समय में, HEAD
d9c0a797ad45a0d2fd92a07d3c3802528ed7b82a
है):
$ git clone https://github.com/sxlijin/.dotfiles dotfiles
Cloning into 'dotfiles'...
remote: Counting objects: 350, done.
remote: Compressing objects: 100% (31/31), done.
remote: Total 350 (delta 12), reused 0 (delta 0), pack-reused 318
Receiving objects: 100% (350/350), 86.61 KiB | 0 bytes/s, done.
Resolving deltas: 100% (176/176), done.
$ cd dotfiles/
$ git submodule update --init --recursive
Submodule 'bundle/jedi-vim' (http://github.com/davidhalter/jedi-vim) registered for path 'vim/bundle/jedi-vim'
Submodule 'bundle/nerdtree' (https://github.com/scrooloose/nerdtree.git) registered for path 'vim/bundle/nerdtree'
Submodule 'bundle/supertab' (https://github.com/ervandew/supertab.git) registered for path 'vim/bundle/supertab'
Submodule 'vim/bundle/vim-flake8' (https://github.com/nvie/vim-flake8.git) registered for path 'vim/bundle/vim-flake8'
Submodule 'bundle/vim-pathogen' (https://github.com/tpope/vim-pathogen.git) registered for path 'vim/bundle/vim-pathogen'
Cloning into '/home/pockets/dotfiles/vim/bundle/jedi-vim'...
warning: redirecting to https://github.com/davidhalter/jedi-vim/
Cloning into '/home/pockets/dotfiles/vim/bundle/nerdtree'...
Cloning into '/home/pockets/dotfiles/vim/bundle/supertab'...
Cloning into '/home/pockets/dotfiles/vim/bundle/vim-flake8'...
Cloning into '/home/pockets/dotfiles/vim/bundle/vim-pathogen'...
Submodule path 'vim/bundle/jedi-vim': checked out '8cf616b0887276e026aefdf68bc0311b83eec381'
Submodule 'jedi' (https://github.com/davidhalter/jedi.git) registered for path 'vim/bundle/jedi-vim/jedi'
Cloning into '/home/pockets/dotfiles/vim/bundle/jedi-vim/jedi'...
Submodule path 'vim/bundle/jedi-vim/jedi': checked out 'f05c0714c701ab784bd344aa063acd216fb45ec0'
Submodule path 'vim/bundle/nerdtree': checked out '281701021c5001332a862da80175bf585d24e2e8'
Submodule path 'vim/bundle/supertab': checked out 'cdaa5c27c5a7f8b08a43d0b2e65929512299e33a'
Submodule path 'vim/bundle/vim-flake8': checked out '91818a7d5f5a0af5139e9adfedc9d00fa963e699'
Submodule path 'vim/bundle/vim-pathogen': checked out '7ba2e1b67a8f8bcbafedaf6763580390dfd93436'
कि पिछले आदेश 012,ने HEAD
में संग्रहीत सबड्यूलर हैश को देखा, और मेरे काम करने वाले पेड़ को अपडेट किया (यह उन्हें अपने संबंधित रिपो में सबसे हालिया कामों में अपडेट नहीं करता है; यह git submodule update --remote
है), संबंधित पथों पर संबंधित रिपॉजिटरीज की सामग्रियों को जोड़कर, इतनी बार कर रहा है (इसलिए यदि मेरे किसी भी submodules में submodules हैं, जो वे करते हैं, तो उन भंडारों की सामग्री भी मेरे काम करने वाले पेड़ में जोड़ दी जाती है)।
अब, यह इतना है कि मैं HEAD~2
में मेरी विम प्लगइन्स अद्यतन:
$ git show HEAD~2 -- vim/bundle/*
commit 27bfe76851991026bd026b4bf2ab10d6ecbc6f74
Author: First Last <[email protected]>
Date: Thu Feb 2 13:33:30 2017 -0600
update dependencies
diff --git a/vim/bundle/jedi-vim b/vim/bundle/jedi-vim
index f191ccd..8cf616b 160000
--- a/vim/bundle/jedi-vim
+++ b/vim/bundle/jedi-vim
@@ -1 +1 @@
-Subproject commit f191ccd6fb7f3bc2272a34d6230487caf64face7
+Subproject commit 8cf616b0887276e026aefdf68bc0311b83eec381
diff --git a/vim/bundle/nerdtree b/vim/bundle/nerdtree
index eee431d..2817010 160000
--- a/vim/bundle/nerdtree
+++ b/vim/bundle/nerdtree
@@ -1 +1 @@
-Subproject commit eee431dbd44111c858c6d33ffd366cae1f17f8b3
+Subproject commit 281701021c5001332a862da80175bf585d24e2e8
diff --git a/vim/bundle/supertab b/vim/bundle/supertab
index 6651177..cdaa5c2 160000
--- a/vim/bundle/supertab
+++ b/vim/bundle/supertab
@@ -1 +1 @@
-Subproject commit 66511772a430a5eaad7f7d03dbb02e8f33c4a641
+Subproject commit cdaa5c27c5a7f8b08a43d0b2e65929512299e33a
कहते हैं कि कुछ अभी मेरी विम प्लग इन के साथ अजीब हो रहा है, और मुझे लगता है के लिए प्रतिबद्ध है कि इसके बाद के संस्करण के लिए जिम्मेदार है यह अजीबता है, इसलिए मैं अपने प्लगइन को उन चीज़ों पर वापस रोल करना चाहता हूं जो मैंने उन्हें अपडेट करने से पहले किया था।
$ git checkout -b testing HEAD~2^
M vim/bundle/jedi-vim
M vim/bundle/nerdtree
M vim/bundle/supertab
Switched to a new branch 'testing'
$ git status
On branch testing
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: vim/bundle/jedi-vim (new commits)
modified: vim/bundle/nerdtree (new commits)
modified: vim/bundle/supertab (new commits)
no changes added to commit (use "git add" and/or "git commit -a")
ठीक है, अब सामान थोड़ा अजीब लगता है। जब मैंने यह चेकआउट किया था, तो मेरे काम के पेड़ में मेरे पास कोई बदलाव नहीं था, तो ऐसा लगता है कि चेकआउट मेरे काम करने वाले पेड़ में बदलाव पेश कर रहा है? यहाँ क्या चल रहा है?
$ git diff
diff --git a/vim/bundle/jedi-vim b/vim/bundle/jedi-vim
index f191ccd..8cf616b 160000
--- a/vim/bundle/jedi-vim
+++ b/vim/bundle/jedi-vim
@@ -1 +1 @@
-Subproject commit f191ccd6fb7f3bc2272a34d6230487caf64face7
+Subproject commit 8cf616b0887276e026aefdf68bc0311b83eec381
diff --git a/vim/bundle/nerdtree b/vim/bundle/nerdtree
index eee431d..2817010 160000
--- a/vim/bundle/nerdtree
+++ b/vim/bundle/nerdtree
@@ -1 +1 @@
-Subproject commit eee431dbd44111c858c6d33ffd366cae1f17f8b3
+Subproject commit 281701021c5001332a862da80175bf585d24e2e8
diff --git a/vim/bundle/supertab b/vim/bundle/supertab
index 6651177..cdaa5c2 160000
--- a/vim/bundle/supertab
+++ b/vim/bundle/supertab
@@ -1 +1 @@
-Subproject commit 66511772a430a5eaad7f7d03dbb02e8f33c4a641
+Subproject commit cdaa5c27c5a7f8b08a43d0b2e65929512299e33a
हू, ठीक है, तो यह दिलचस्प है। किसी कारण से, git diff
कह रहा है कि मेरे वर्तमान काम करने वाले पेड़ में चेक किए गए सबमिड्यूल के संस्करण मेल नहीं खाते हैं - लेकिन यह भिन्नता लॉट जैसा कि मैंने ऊपर किया है git show
जैसा दिखता है। मुझे आश्चर्य है कि क्या submodules HEAD
में वास्तव में कर रहे ...
$ git ls-tree HEAD -- vim/bundle/
160000 commit f191ccd6fb7f3bc2272a34d6230487caf64face7 vim/bundle/jedi-vim
160000 commit eee431dbd44111c858c6d33ffd366cae1f17f8b3 vim/bundle/nerdtree
160000 commit 66511772a430a5eaad7f7d03dbb02e8f33c4a641 vim/bundle/supertab
160000 commit 91818a7d5f5a0af5139e9adfedc9d00fa963e699 vim/bundle/vim-flake8
160000 commit 7ba2e1b67a8f8bcbafedaf6763580390dfd93436 vim/bundle/vim-pathogen
अहा! वहां हम जाते हैं - git checkout
ने काम करने वाले पेड़ में सबमिशन के संस्करण को अपडेट नहीं किया है! गिट खुद को अभी भी पता है कि इन सबोडोड्यूल को किस हशों की जांच की जानी चाहिए। बदल जाता है वहाँ एक आदेश है कि आप के लिए यह कर देगा है बाहर:
$ git submodule update --init --recursive
Submodule path 'vim/bundle/jedi-vim': checked out 'f191ccd6fb7f3bc2272a34d6230487caf64face7'
Submodule path 'vim/bundle/jedi-vim/jedi': checked out '2ba78ab725f1e02dfef8bc50b0204cf656e8ee23'
Submodule path 'vim/bundle/nerdtree': checked out 'eee431dbd44111c858c6d33ffd366cae1f17f8b3'
Submodule path 'vim/bundle/supertab': checked out '66511772a430a5eaad7f7d03dbb02e8f33c4a641'
अलग से आपकी चिंताओं को दूर करने के लिए: आम कोड से
-
तोड़ मंच विशिष्ट कोड दूर तो आम में परिवर्तन कोड और/या एसडीके के पास अन्य प्लेटफॉर्म पर अप्रत्याशित परिणाम नहीं हैं।
हाँ। Submodules।
-
प्रत्येक प्लेटफ़ॉर्म के लिए प्रत्येक रिपॉजिटरीज़ बनाएं, प्रत्येक सामान्य कोड बेस और प्रत्येक एसडीके।
इस तरह आप अपने वर्तमान codebase बाहर रखी है, उन पर एक बहुत निर्भर करने के लिए जा रहा है। यह संभव है कि git subtree
हो जो आप चाहते हैं (विशेष रूप से git subtree split
आपको एक अलग गिट रेपो में एक उपट्री में फ़ाइलों को निकालने देता है, प्रतिबद्ध इतिहास के साथ भर जाता है, लेकिन मुझे नहीं पता कि यह रिपो के साथ बड़े और पुराने के रूप में कितना अच्छा काम करेगा जैसा कि आप वर्णन कर रहे हैं - अधिक जानकारी के लिए man git subtree
देखें)।
-
एक स्थानीय मशीन एक रिमोट भंडार क्लोनिंग एक एक कदम प्रक्रिया होना चाहिए; नए उपयोगकर्ताओं को प्लेटफार्म बनाने से पहले प्रत्येक उप-संग्रह को खींचने के लिए मजबूर नहीं होना चाहिए।
नहीं। उप-मॉड्यूल, डिज़ाइन द्वारा, उप-भंडार की सामग्री को ट्रैक न करें: यह सब-रिपोजिटरी का काम है। वे सब उप-रेपो में एक विशिष्ट प्रतिबद्धता के लिए एक सूचक रखें।
-
इसके अतिरिक्त; पुराने कोड को बहाल करना, जिसमें सामान्य कोड और एसडीके शामिल है जिसका उपयोग किसी दिए गए प्लेटफ़ॉर्म के संस्करण XXX-YYY को बनाने के लिए किया गया था, संभव होना चाहिए। सामान्य कोड को संशोधित करने से प्लेटफार्मों को प्रभावित नहीं किया जाना चाहिए जब तक प्लेटफ़ॉर्म के रखरखाव नए सामान्य कोड में खींचें।(मेरा मानना है कि इस आम कोड के टैग से एक जोड़कर उपतरू के साथ संभव है आम कोड के मास्टर के बजाय करता है)
submodules डिजाइन करके करते हैं। यही कारण है कि वे रिमोट के बजाय विशिष्ट प्रतिबद्धताओं को इंगित करते हैं।
-
केवल पढ़ने-योग्य उप-संग्रह एक स्वीकार्य सीमा है। (मंच के भंडार यानी उप भंडार या तो मंच के भंडार या उप-भंडार में परिवर्तन में बदला नहीं जा सकता से नहीं भेजा जा सकता है)
submodules आम तौर पर केवल पढ़ने के लिए उप-खजाने के रूप में व्यवहार किया जाना चाहिए । Submodules से अद्यतन को धक्का देना संभव है, लेकिन यह सुनिश्चित करने के लिए उपयोगकर्ता पर अधिक ओवरहेड डालता है कि वे उस सबमिशन के संस्करण को पेंच नहीं करते हैं जिसके साथ वे काम कर रहे हैं। के रूप में सभी लेकिन हमारे सदस्यों में से एक का उपयोग करता है
-
SmartGit/HG समर्थन वांछनीय है।
यहाँ कोई गारंटी। इसे समझने के लिए आपको शायद सभी 3 विकास समुदायों (गिट, स्मार्टगिट, मर्कुरियल) तक पहुंचना होगा।
-
स्क्रिप्टिंग एक बार कार्य स्वीकार्य है, लेकिन मैं स्क्रिप्ट है कि इसके लिए Git का काम करते हैं साथ प्लेटफार्मों अपवित्र नहीं करना चाहती।
निर्भर करता है आप कैसे जटिल बात कर रहे हैं। मुझे लगता है कि अपने कोड के एक पुराने संस्करण बाहर की जाँच के ऊपर दिखाए गए हैं सिर्फ दो आदेशों है: checkout
और submodule update --init --recursive
है, लेकिन यह स्पष्ट नहीं है कि आप जो चाह रहे हैं।
नहीं धन्यवाद; सबमिशन दस्तावेज को फिर से पढ़ने के बाद भी मुझे लगता है कि सबमिशन पैराडाइम कुछ गंभीर परेशानी को आमंत्रित करता है। उदाहरण के लिए; गिट के दस्तावेज़ीकरण के अनुसार 'गिट सबमिशन अपडेट' रिमोट रिपोजिटरी से सबसे अद्यतित प्रतिबद्धता प्राप्त करेगा लेकिन सबमिशन के सिर को अलग करेगा। क्या होगा यदि किसी ने परिवर्तन किया और सोचा कि उन्होंने उन्हें धक्का दिया, और फिर एक अलग सिर के साथ एक रिहाई किया? बाधाएं हैं कि वे कोड पर अपना काम खो देंगे जो इसे कभी भी भंडार में नहीं बनायेगा। – JacaByte
"गिट सबमिशन अपडेट रिमोट रिपोजिटरी से सबसे अद्यतित प्रतिबद्धता प्राप्त करेगा": नहीं, यह नहीं होगा। तब तक जब तक आप स्पष्ट रूप से कॉन्फ़िगर नहीं करते हैं, ऐसा करने के लिए सबमिशन कहा जाता है। पुश के लिए इसे http://stackoverflow.com/questions/5814319/git-submodule-push/10878273#10878273 के साथ ख्याल रखा जाता है। फिर, सबमिशन समाधान है। Subtree पुराने तंत्र है जो submodules से पहले अस्तित्व में था। – VonC
यह subrepositories के सिर को अलग करने के बारे में मेरी चिंता का समाधान नहीं करता है। – JacaByte