如何将对子模块所做更改的提交推送到主git仓库?

时间:2013-06-05 22:51:12

标签: git git-submodules

我决定从SVN切换到我的app存储库的git。

我的回购结构是这样的:

~/AndroidStudioProjects/MyMine $ tree -L 1
.
├── ActionBarSherlock
├── Android-Universal-Image-Loader
├── Android-ViewPagerIndicator
├── Crouton
├── ListViewAnimations
├── MyMine
├── SlidingMenu
├── aFileChooser
├── drag-sort-listview
└── out

10 directories, 0 files

正如您所看到的,我有很多库,我的应用程序核心位于MyMine文件夹中。

我已将这些库添加为git子模块:

~/AndroidStudioProjects/MyMine $ cat .gitmodules
[submodule "ActionBarSherlock"]
    path = ActionBarSherlock
    url = https://github.com/JakeWharton/ActionBarSherlock.git
[submodule "Android-Universal-Image-Loader"]
    path = Android-Universal-Image-Loader
    url = https://github.com/nostra13/Android-Universal-Image-Loader.git
[submodule "Android-ViewPagerIndicator"]
    path = Android-ViewPagerIndicator
    url = https://github.com/JakeWharton/Android-ViewPagerIndicator.git
[submodule "Crouton"]
    path = Crouton
    url = https://github.com/keyboardsurfer/Crouton.git
[submodule "drag-sort-listview"]
    path = drag-sort-listview
    url = https://github.com/bauerca/drag-sort-listview.git
[submodule "ListViewAnimations"]
    path = ListViewAnimations
    url = https://github.com/nhaarman/ListViewAnimations.git
[submodule "SlidingMenu"]
    path = SlidingMenu
    url = https://github.com/jfeinstein10/SlidingMenu.git
[submodule "aFileChooser"]
    path = aFileChooser
    url = https://github.com/iPaulPro/aFileChooser.git

现在,假设我对其中一个库/子模块进行了更改。但我不想将这些变化推向原点,因为:

  • 作者可能/将拒绝我的提交
  • 我的更改只与我有关
  • 我的更改只是修改代码的一行修改,以便在我的项目中编译

然而,我想要的是将我的提交(对这些子模块做出)推送到项目的原点。这是因为这些更改对于编译我的项目是必需的。因此,如果我决定将完整的回购克隆到新的开发机器,我希望它们在回购中。或者如果一个新人加入团队并需要设置其开发机器。

那么,我已经提交了对其中一个库的修改。然后,我将相应的子模块提交到我的存储库,并将其推送到原点。

问题在于(在我的服务器上),子模块项目指向错误的快照,因为该快照仅存在于我的本地存储库中,而不存在于原始存储库中。我不能推动它,因为git会尝试将提交推送到子模块的原点,这不是我项目的起源。

如何提交对子模块所做的更改,并从主存储库中获取这些更改?所有这些都没有将子模块推到原点?

如果我使用的术语或方法看起来很愚蠢或不合适,我道歉。正如我所说,我正在尝试转换为git,即使我花了一些时间阅读一本git书,我也可能误解了一些过程或词汇。

1 个答案:

答案 0 :(得分:3)

据我所知,你不能这样做。

您需要分叉子模块repo并将项目的子模块指向fork而不是当前位置。然后,您可以将更新推送到分支,在那里维护它们,并且主项目可以指向您的更改。

您拥有的另一个选择是将更改维护为修补程序,并让编译系统在编译之前应用它们。

也许有人会为你提供一个巧妙的技巧。