【问题标题】:Make change to a git submodule, and keep the changes更改 git 子模块,并保留更改
【发布时间】:2012-06-07 00:58:32
【问题描述】:

我已将我的一个库的一个 git 子模块克隆到我正在处理的项目中。问题是,克隆后,我需要更改克隆子模块中的一些行,但我不想将这些更改推送到原始存储库中。

我希望这些更改保留在超级项目中。这可能吗?我怎样才能做到这一点?

编辑:正如@GoZoner 所说,基本上是它:

  1. git clone foo;
  2. cd foo;
  3. git 子模块初始化;
  4. git 子模块更新;
  5. cd 路径/到/子模块;
  6. git checkout master;
  7. 更改子模块
  8. git commit -am "Something";
  9. git push origin(超级项目);

然后,当我在另一台计算机上克隆超级项目时(直到第 4 步),我希望将这些更改保存在 超级项目中。

【问题讨论】:

  • 当您说“我希望这些更改保留在超级项目中”时,您的意思是:当有人执行“git clone foo; cd foo; git submodule init; git submodule update”时,他们应该有包含我对克隆子模块的更改的工作目录?
  • @GoZoner 是的 - 但子模块中的更改不应推送到其原始存储库。我将根据您的评论重新构建问题。
  • 对,这就是我认为你在问的问题,我认为这不可能。 Git 专门标记包含子模块的目录,并且不会在该目录之外查找“本地”更改。

标签: git git-submodules


【解决方案1】:

我认为您需要放松“不提交子模块”约束。有两种选择:

  1. 将您的子模块更改提交到子模块分支。它是您团队的分支,也是您的团队放置子模块更改的地方。当有人克隆超级项目并更新子模块时,他们会获得您团队分支的内容。
  2. 克隆子模块存储库“紧邻”您的超级项目存储库,并初始化子模块以指向您的克隆。然后,当您提交对子模块的更改时,它们将提交给您的克隆。任何克隆超级项目的人都会从您的子模块克隆中获取子模块内容。

否则,我看不到实现您愿望的方法。

【讨论】:

  • 这些实际上是不错的选择。我无法实现我实际上想要做的事情,但这些都是可行的选择。我想对这些文件做的是更改路径,这是基本的,但在某些情况下知道该做什么仍然很好。我想我将来可能可以使用选项 2 和一些 difftools。谢谢!
  • 我不明白“就在旁边”的意思。你能详细说明一下吗?谢谢。
  • @ywu 他可能是指将两个存储库克隆到同一个目录中。
  • 感谢@Mit94 的回复。我认为在超级项目 repo 中有一个子模块 repo 的副本(克隆)并随身携带。它不再是一个子模块,因为选项 2 中对该 repo 的更改需要保存在超级项目 repo 中。
  • @ywu 似乎很可能他建议您将子模块 fork 到您团队的版本控制中。它仍然是您的超级项目的子模块,但分叉的 repo 现在是超级项目特定的,您可以随意更改它。如果您的团队不拥有子模块存储库,这将是在子模块中创建分支的替代方法。但是,如果您想从主存储库中提取更新,您仍然需要与冲突作斗争。
【解决方案2】:

您可以为您的更改签出一个单独的分支。不要把那根树枝往上推。您确实想要推送的更改,在原始分支之一上进行。将该分支合并到您不向上推的特殊分支中。不要在您的特殊分支上做任何其他工作,因为您将不得不以另一种方式合并。你可以这样做,但它会变得复杂。

【讨论】:

  • 如果我签出一个不会推送到原始分支的不同分支,然后在那里提交,当我克隆 repo 并初始化子模块时,引用将丢失。这就是我在发布之前尝试过的。将出现缺少参考错误,我会回到第 1 格,除非我遗漏了什么。
  • 您必须使用确切的结构更新您的问题。对不起。
猜你喜欢
  • 2019-08-09
  • 2014-02-17
  • 1970-01-01
  • 2023-01-19
  • 2022-01-23
  • 2019-02-22
  • 2018-07-05
  • 2012-05-06
  • 2017-10-05
相关资源
最近更新 更多