如何在子模块中嵌套Git子模块?

时间:2011-11-07 13:14:50

标签: git drupal git-submodules svn-externals

我已经对此进行了相当多的搜索,但没有一个结果在头上钉了一针。

$ mkdir blah
$ git init
$ git submodule add -b 7.x http://git.drupal.org/project/drupal.git drupal
$ git submodule add -b 7.x-1.x http://git.drupal.org/project/devel.git drupal/sites/all/modules/contrib/devel

然后我得到错误:

The following path is ignored by one of your .gitignore files:
drupal/sites/all/modules/contrib/devel
Use -f if you really want to add it.

所以我添加-f参数...

$ git submodule add -f -b 7.x-1.x http://git.drupal.org/project/devel.git drupal/sites/all/modules/contrib/devel

...但是,在克隆到正确的地方后,我收到了这个错误:

fatal: Path 'drupal/sites/all/modules/contrib/devel' is in submodule 'drupal'
Failed to add submodule 'drupal/sites/all/modules/contrib/devel'

我正在研究校长,一旦我将所有子模块检查到位,我就可以在'容器'仓库上做一个“git clone --recursive”,然后抓住Drupal,我的所有“贡献” “模块(来自Drupal存储库)+我将添加到drupal/sites/all/modules/custom的任何自定义模块。我仍然需要研究是否可以自动将子模块作为适当的签出标记版本...

我见过关于git-slave(第三方插件)和git-subtree的帖子(看起来像是将所有子模块添加到分支并将它们合并到位?)...

我只是觉得我错过了一些东西,因为这是SVN可以轻易做到的真的然而每个人似乎都在努力使用Git ...

2 个答案:

答案 0 :(得分:1)

我讨厌用你不想要的答案回答你的问题,但你可能会考虑将你的项目基于drush make文件(并将该文件添加到你的git repo而忽略yor contrib模块目录。

通过这种方式,您只能跟踪模块版本的更改,而不是所有的原始代码本身,这些干扰git repos将为您做什么,并且drush将会拉下来。我发现它减少了几乎完全使用git子模块的需要,同时仍然将我站点的当前状态与所贡献的模块本身分离,而不会破坏我的差异。

答案 1 :(得分:1)

这是一个超级老问题,但是..你不能完全按照你试图做的原因是git只存储一个特殊的“gitlink”文件类型来存储指向引用的存储库的指针(实际上是特定的提交)并且对该存储库中的文件一无所知。因此,就超级项目而言,初始子模块引用中的目录不存在,并且实际上被阻止在git索引中使用,因为它保留供子模块使用。

我们这样做的方法是创建一个使用drupal存储库作为起点的项目。我们将drupal项目添加为基础存储库的子模块。

git clone http://git.drupal.org/project/drupal.git drupal
cd drupal
# add submdoules inside the original drupal repository
git submodule add http://git.drupal.org/project/devel.git sites/all/modules/contrib/devel
# even better drush does this for you (but might require you install git_deploy first):
drush dl devel --package-handler=git_drupalorg --gitsubmodule
# commit
git commit -m"Add devel module"

您可以更改遥控器或添加新遥控器,然后按:

git remote set-url origin git@my-git-host.foo/my-project.git
git checkout -b my-branch-name
git push -u origin my-branch-name

使用--recursive:

在其他地方克隆
git clone --recursive git@my-git-host.foo/my-project.git

与您尝试做的最大区别在于,Drupal的根是git存储库的根,而不是./drupal的子文件夹。如果需要在drupal根目录上的目录中安装版本跟踪文件,可以将此自定义drupal项目添加为另一个超级项目的子模块。只要您使用--recursive进行克隆,它就会像预期的那样递归到子模块的子模块中。

也就是说,在同一工作空间中对超级项目和子项目进行大量开发可能会很麻烦,因为您需要提交和推送子模块以及更新和提交超级项目或远程检出将缺少所需的引用,所以如果可能的话,我建议将drupal root作为root。