【问题标题】:How to push commits from changes made to a submodule into main git repo?如何将对子模块所做更改的提交推送到主 git 存储库中?
【发布时间】:2013-06-05 22:51:11
【问题描述】:

我决定为我的应用程序库从 SVN 切换到 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

现在,假设我对其中一个库/子模块进行了更改。但我不想将这些更改推送到它们的起源,因为:

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

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

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

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

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

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

【问题讨论】:

    标签: git git-submodules


    【解决方案1】:

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

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

    您的另一个选择是将您的更改作为补丁维护,并让您的构建系统在编译之前应用它们。

    也许有人会为你带来一个巧妙的技巧。

    【讨论】:

    • 还有可能拉进那个叉子吗?我的意思是这些库还活着,我可能想不时更新以从新功能和错误修复中受益。
    • 当然,为什么不呢?只需将原始 repo 设置为 fork 的遥控器,并偶尔将git pull --rebase 放入其中以保持最新状态。确保在执行此操作时更新您的主项目。
    • 好的。非常感谢您的回复,我担心这是唯一的解决方案。不过我会等几天,以防有人丢了更好的。
    • 这就是我最终所做的。实际上这是一个很好的解决方案。再次感谢卡尔。
    猜你喜欢
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2020-09-03
    • 2021-01-31
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多