我有一个新项目,整个项目都受版本控制。
项目目录如下所示:
/projectname
--/web
--nodeapp.js
--/mobile
--androidapp
目前,.git位于/projectname
项目的根目录中。是否有可能将两个子目录放入自己的仓库?例如,/web
目录包含将通过Heroku部署的节点应用程序,Heroku部署使用git进行部署,因此我需要该部分作为自己的repo,因为显然部署整个项目(包括android) Heroku会很傻。
我认为我读过子模块可能对这个用例有好处,但是我不太确定这是否正确,以及它是如何在我的情况下使用它们。谢谢!
答案 0 :(得分:2)
是否可以将两个子目录放入自己的仓库?
是。这正是子模块的意义所在。当你这样做时会发生什么,子目录的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
,或@
a.k.a. 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
文件,只是方便但可有可无的笔记。
答案 1 :(得分:1)
是的,子模块似乎非常适合你。
使用子模块,您将拥有一个外部存储库" projectname",以及两个内部存储库," web"和"移动"。
Git子模块将在外部和内部存储库之间创建强大的版本关系。外部存储库将始终指向内部存储库中的特定提交。
答案 2 :(得分:0)
我发现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"
结帐新分支进行合并,设置为跟踪子树回购
git checkout -b backport weborigin/master
cherry-pick backports
git cherry-pick -x --strategy=subtree master
将更改推送回插件源
git push weborigin backport:master