2011-11-07 117 views
2

我已經在這方面做了一些搜索,但沒有一個結果相當不錯。如何在子模塊中嵌套Git子模塊?

$ 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存儲庫)+任何自定義模塊I將添加到drupal/sites/all/modules/custom。我仍然需要研究是否有可能自動獲取子模塊是一個適當的檢出標籤發佈...

我已經看到關於git-slave(第三方插件)和git-subtree喜歡的事做將所有子模塊爲分支,並將它們融入地方?!)...

我只是覺得我失去了一些東西,因爲這是事SVN可以做真的容易,但everyoen似乎努力使用Git ...

+0

同樣的問題。我已經在docroot/profiles/drupal_profile中使用了git repo,並且在docroot/profiles/drupal_profile/themes和docroot/profiles/drupal_profile/modules dirs中下載了其他repos,並且無法強制git添加此配置文件git repo。 – kenorb

回答

1

我不想用你不想要的答案回答你的問題,但你可能會考慮將你的項目放在一個drush make文件(和將該文件添加到您的git倉庫,同時忽略yor contrib模塊目錄。

這樣你只追蹤你的模塊版本的變化,而不是所有的原始代碼本身,這個dirals git回購將爲你做,而drush將會下降。我發現它幾乎完全緩解了使用git子模塊的需要,同時仍然將我的站點當前狀態離散地綁定到貢獻的模塊本身,而不會彌補我的差異。

+0

如果我理解正確,Drush Make Files基本上是腳本,反覆說「此回購應該放在這裏」。我相信你也可以指定要應用的修補程序URL? 這當然是一個解決方案,但它是非常Drupal特定的(我認爲這符合我上面的示例)。 這看起來像SVN可以輕鬆完成但真正有用的東西,但它並沒有被添加到Git中。 Can Drush Make文件也簽出到特定的標籤? – Nick

+0

我認爲它已經可以做到這一點。根據[主項目頁面](http://drupal.org/project/drush_make),它可以「檢出」CVS,SVN,git和bzr存儲庫中的代碼「。有關更高級的用法,請參見open issue [增強生成makefile以檢測幷包含版本控制URL](http://drupal.org/node/943768)。 – colan

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 [email protected]/my-project.git 
git checkout -b my-branch-name 
git push -u origin my-branch-name 

並與其他地方 - 遞歸克隆:從你

git clone --recursive [email protected]-git-host.foo/my-project.git 

最大的區別試圖做的是,Drupal的根是git存儲庫的根,而不是./drupal上的子文件夾。如果您需要在drupal根目錄上的目錄中追蹤版本文件,則可以將此自定義drupal項目添加爲另一個超級項目的子模塊。只要你用 - 遞歸克隆,它就會按照人們期望的那樣遞歸到子模塊的子模塊中。

也就是說,在同一個工作空間中對超級項目和子項目進行大量開發可能會很麻煩,因爲您需要提交和推送子模塊以及更新和提交超級項目或遠程檢出將缺少所需的引用,所以我建議儘可能將drupal根作爲根。