[英]How to handle nested git repositories?
我有一個新項目,整個項目都受版本控制。
項目目錄如下所示:
/projectname
--/web
--nodeapp.js
--/mobile
--androidapp
所以目前,.git位於/projectname
項目的根/projectname
。 是否有可能將兩個子目錄放入自己的倉庫? 例如, /web
目錄包含將通過Heroku部署的節點應用程序,Heroku部署使用git進行部署,因此我需要該部分作為自己的repo,因為顯然將整個項目(包括android)部署到Heroku將是愚蠢。
我想我讀過子模塊可能對這個用例有好處,但我不太確定這是否正確,以及它是如何在我的情況下使用它們。 謝謝!
是否有可能將兩個子目錄放入自己的倉庫?
是。 這正是子模塊的意義所在。 當你這樣做時會發生什么,子目錄的git add
存儲該目錄中當前檢出的提交的id。
您不需要使用git submodule
命令。 它經常需要做的任務,但它們是顯而易見的,而且幾乎所有這些任務都是直接的oneliner - 而那些不是,並不比那更難的。 子模塊命令最有用的功能是將實際存儲庫從子目錄中提升到現有存儲庫中的一個方便(和任意)的角落,這樣你仍然可以不受懲罰地破壞你的工作樹。
以下是您如何找到所有當前跟蹤的子模塊,無論您是否已告知子模塊命令:
git ls-files -s|grep ^16 # ls-files -s output: mode id stage path
提交中的所有子模塊,無論您是否告訴子模塊命令:
git ls-tree -r $id|grep ^16 # ls-tree -r output: mode type id path
( $id
可以是例如master
,或@
aka HEAD
)
Id是子模塊的跟蹤狀態
git rev-parse :path/to/it # from index i.e. last add/checkout/reset/etc
git rev-parse $id:path/to/it # from $id, e.g. `master` or `3fac3`
找出目前在子模塊中檢出的內容:
(cd "$submodule"; git rev-parse HEAD)
檢查子模塊中的正確提交:
(id=`git rev-parse :"$submodule"` && cd "$submodule" && git checkout $id)
......等等。
那么,submodule命令真正為你做了什么? 除了上方的提升,它確實增加了唯一的事情是一個方便的地方,以保持筆記-例如,哪來的默認現場找到這些提交? git submodule
命令已經確定.gitmodules
是一個存儲這樣的東西的好地方。 就像所有git一樣,唯一重要的是提交。 包括.gitmodules
文件在內的所有其他文件只是方便但可有可無的筆記。
是的,子模塊似乎非常適合你。
使用子模塊,您將擁有一個外部存儲庫“projectname”,以及兩個內部存儲庫“web”和“mobile”。
Git子模塊將在外部和內部存儲庫之間創建強大的版本關系。 外部存儲庫將始終指向內部存儲庫中的特定提交。
我發現git subtree
比submodule
更容易學習如何使用。 這往往更容易與團隊協作者共享,而不是處理子模塊。
首先添加web
遠程
git remote add weborigin https://path.to/remotes/plugin.git
創建指定新文件夾前綴的子樹
weborigin
是遠程名稱, master
是指子樹的存儲庫上的master
分支。 --prefix
指的是子樹存儲庫根目錄的文件夾路徑
git subtree add --prefix=web weborigin master
拉weborigin
正常提交
git subtree pull --prefix=web weborigin master
在超級項目中提交的提交將被后向移植
git commit -am "new changes to be backported"
checkout new branch for merge,設置為跟蹤子樹repo
git checkout -b backport weborigin/master
櫻桃挑選后衛
git cherry-pick -x --strategy=subtree master
將更改推回到插件源
git push weborigin backport:master
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.