如何处理嵌套的git存储库?

时间:2016-05-15 18:17:57

标签: git heroku

我有一个新项目,整个项目都受版本控制。

项目目录如下所示:

/projectname
--/web
   --nodeapp.js
--/mobile
   --androidapp

目前,.git位于/projectname项目的根目录中。是否有可能将两个子目录放入自己的仓库?例如,/web目录包含将通过Heroku部署的节点应用程序,Heroku部署使用git进行部署,因此我需要该部分作为自己的repo,因为显然部署整个项目(包括android) Heroku会很傻。

认为我读过子模块可能对这个用例有好处,但是我不太确定这是否正确,以及它是如何在我的情况下使用它们。谢谢!

3 个答案:

答案 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 subtreesubmodule更容易学习如何使用。这往往更容易与团队协作者共享,而不是处理子模块。

首先添加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