【问题标题】:Swap git submodule with own fork用自己的 fork 交换 git 子模块
【发布时间】:2012-07-23 03:26:40
【问题描述】:

我向我的 git 存储库添加了一个子模块,如下所示:

$ git submodule add git://github.com/user/some-library some-library

我决定创建一个该库的分支来进行一些调整。我如何交换那个子模块,让它指向我自己的 github fork?

【问题讨论】:

  • 这可能与某些人有关 - 您不能创建公共存储库的私有分支,因此如果您希望您的存储库副本是私有的,您需要 duplicate the repository。跨度>

标签: git github fork git-submodules


【解决方案1】:

子模块存储在.gitmodules:

$ cat .gitmodules
[submodule "ext/google-maps"]
    path = ext/google-maps
    url = git://git.naquadah.org/google-maps.git

如果您使用文本编辑器编辑url,则需要运行以下命令:

$ git submodule sync

这会更新.git/config,其中包含此子模块列表的副本(您也可以手动编辑.git/config 的相关[submodule] 部分)

虽然submodule 系统似乎有点不完整(例如,参见the instructions to remove a submodule

【讨论】:

  • git submodule sync 命令可用于同步 .git/config 与 .gitmodules 中的更改
  • 只是想指出一些不言自明的事情:我想使用我的 fork,因为我做了一些我想要的提交。更新子模块 URL 和同步不包括任何新的提交,它只从新的分叉中签出相同的提交。要获得最新版本,您仍然需要 cd 进入子模块,签出 master(或其他),然后在父 repo 中提交子模块的新版本。
【解决方案2】:

我不知道这是真的多久,但即使在相当老的 git 1.8 子模块中也肯定有遥控器。所以,你可以这样做

cd some-library   # this is entering the submodule
git remote -v     # just to see what you have; I guess origin only
git remote add myrepo git-URL-of-the-fork
git checkout -b my_new_idea
git push -u myrepo my_new_idea

现在子模块可以与您的 fork 一起使用,而不是原来的 repo。你可以做普通的push, pull, rebase等。当你的拉取请求被合并时,你可以用普通的git remote remove myrepo删除远程。当然,关于使用子模块的所有其他注意事项都适用(例如,您必须将子模块的更改作为超级模块中的新提交提交)。

【讨论】:

  • 请注意, pull / fetch 采用存储库参数,默认为“origin”。所以你需要git fetch myrepo,新叉子的分支才会出现在你的本地工作区中。
  • 与手动编辑.gitmodules 相比,我认为这是更简洁的方法。
猜你喜欢
  • 2012-06-06
  • 2020-02-29
  • 1970-01-01
  • 2014-08-31
  • 2015-04-24
  • 1970-01-01
  • 2013-01-03
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多