रिपॉजिटरी से निपटने के लिए कैसे-रिपॉजिटरी के साथ एक निरंतर सवाल किया गया है। ट्रैक को बनाए रखने के लिए थोड़ी और जटिलता जोड़ने की कीमत पर, गिट के सबमॉड्यूल्स स्थिति को संबोधित करने का एक तरीका है। Git साइट में सबमॉड्यूल का परिचय है ।
मूल विचार यह है कि आपकी रिपॉजिटरी में एक पथ से जुड़े अन्य गिट रिपॉजिटरी का संदर्भ रखा जाए। ये संदर्भ .gitmodulesआपकी रिपॉजिटरी की जड़ में एक फ़ाइल में संग्रहीत हैं (जिसे गिट द्वारा प्रबंधित किया जाता है, इसलिए इसे अकेला छोड़ दें)। रेपो क्लोनिंग करते समय कुछ जटिलताएँ आती हैं, जिसमें सबमॉड्यूल्स होते हैं: आपको फ़ाइल git submodule initबनाने के लिए स्पष्ट रूप से .gitmodules, और फिर git submodule updateसबमॉड्यूल्स को क्लोन करना होगा।
यहाँ बताया गया है कि मैं अपने dotfiles रिपॉजिटरी में एक नया vim प्लगइन कैसे जोड़ूंगा (मैंने ~/.vim/इस रेपो को aliased किया है .vim/) सबमॉड्यूल का उपयोग करके:
$ cd dotfiles/
$ git submodule add https://github.com/elixir-lang/vim-elixir.git .vim/bundle/vim-elixir
इसके बाद submodule add, एक git statusऐसा दिखाएगा कि आपने .gitmodulesफ़ाइल को संशोधित (या बनाया) किया है, कुछ इस तरह से:
[submodule ".vim/bundle/vim-elixir"]
path = .vim/bundle/vim-elixir
url = https://github.com/elixir-lang/vim-elixir.git
इसे .vim/bundle/vim-elixirनई फाइल के रूप में भी दिखाना चाहिए । Git उस पथ को विशेष रूप से अब व्यवहार करता है: यह आपकी फ़ाइल सिस्टम पर एक सामान्य निर्देशिका है (इसलिए इसे सामान्य रूप से लोड करता है), लेकिन git diffइसे अपनी रिपॉजिटरी से एक विशिष्ट प्रतिबद्ध के रूप में व्यवहार करेगा। जब उस पथ (जैसे git log -1 -u .vim/bundle/vim-elixir) के लिए अंतर या लॉग को देखते हैं , तो git इसे इस तरह एक-पंक्ति स्ट्रिंग के रूप में दिखाएगा:
Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
प्लगइन के नवीनतम संस्करण के लिए अद्यतन सबमॉड्यूल के रिपॉजिटरी में जाने और एक नई कमेटी की जाँच करने से संबंधित है, और फिर आपकी रिपॉजिटरी के लिए प्रतिबद्ध है :
$ cd .vim/bundle/vim-elixir
$ git remote -v # note: the submodule repo's origin, not my repo's
origin https://github.com/elixir-lang/vim-elixir.git (fetch)
origin https://github.com/elixir-lang/vim-elixir.git (push)
$ git pull
# ...
$ cd - # back to my repository's root
$ git status
# ...
modified: .vim/bundle/vim-elixir (new commits)
$ git diff .vim/bundle/vim-elixir
# ...
-Subproject commit 2d59d1d52a9bcf9342d42fa7d6b59e6a1aaa7b9e
+Subproject commit d59784e7afbd0d55c501e40c43b57cbe6f6e04c2
$ git commit -m "update vim-elixir" .vim/bundle/vim-elixir