2

我已经对此进行了相当多的搜索,但没有一个结果完全击中头部。

$ 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,我所有的“contrib”模块(来自 Drupal 存储库) + 我要添加到的任何自定义模块drupal/sites/all/modules/custom。我仍然需要研究是否可以自动使子模块成为适当的签出标记版本......

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

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

4

2 回答 2

1

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

这样,您只跟踪对模块版本的更改,而不是 drupal git repos 将为您执行的所有原始代码本身,并且 drush 将下拉。我发现它几乎完全减轻了使用 git 子模块的需要,同时仍然离散地将我的站点的当前状态与贡献的模块本身联系起来,而不会破坏我的差异。

于 2012-02-16T15:57:51.517 回答
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 进行克隆,它就会像预期的那样递归到子模块的子模块中。

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

于 2014-11-20T04:01:02.387 回答