首页 > 解决方案 > 我自己的存储库中第三方存储库的 git 版本分支

问题描述

我想在我自己的 git 存储库中使用托管在 git 存储库中的第三方代码。我将需要修改和扩展第三方代码的某些部分。但我仍然希望能够将第三方 repo 的某些新提交合并到我的项目中。

我试着用git submodule这个。我将遥控器留在第三方存储库中,以便进行更改。我在子模块上创建了一个新分支,我不推送到第三方存储库(无论如何我没有写访问权限)。

但是当其他人克隆我的仓库时,他们会继续Fetched in submodule path 'thirdparty-repo', but it did not contain abcdgit submodule update因为仍然配置的远程仓库.gitmodules不包含提交abcd

我怎样才能解决这个问题?还是有更好的方法来满足我的要求?

标签: gitgithubgit-submodules

解决方案


phd 已经以评论的形式提供了答案——fork the submodule——你对它说:

我应该提到第 3 方 repo 托管在 github 上,而我的项目位于私人 gitlab 上。我想我可以通过几个手动步骤来执行分叉。但这对我来说似乎也有点矫枉过正。第 3 方 repo 非常大,我只修改了其中的一小部分。我还需要稍后发布两个存储库。没有直接的方法吗?

确实没有“直接方式”,除非您当然可以说服第三方存储库所有者将您的更改带入他们的存储库。您已经看到了原因:

Fetched in submodule path 'thirdparty-repo', but it did not contain hash-id

正如在任何 Git 存储库中看到的那样,Git 子模块仅由两部分组成:

  • 表格说明:如果您需要存储库本身,这里是克隆的 URL
  • 表格说明:要使这个超级项目提交具有正确的子模块提交,请进入子模块存储库(的工作树)并对哈希 ID 为 _______ 的提交进行 detached-HEAD 检出(空白填写)。

前者是文件中的一个条目.gitmodules;后者是一个gitlink,它是一个“文件”(在超级项目的索引条目中,从超级项目的提交中复制),模式160000而不是模式100644(常规读/写文件)或100755(可执行读/写文件)。所有索引条目都带有一个哈希 ID:当文件一个文件时,这是一个 blob 的哈希 ID。当文件是符号链接 (mode 120000) 时,这是包含符号链接目标路径的 blob 的哈希 ID。而且,当“文件”是 gitlink 时,这就是提交的哈希 ID。

(有些人有时希望子模块基于分支名称而不是 gitlinks 工作。Git 对此的支持微不足道,但有一个项目可以让它变得更好,对此我们可能会有一些未来的希望。现在我们' re 很大程度上坚持使用 gitlinks。这在这里并不真正相关,但值得记住:子模块不能基于分支名称工作,原因很充分:分支名称通常是无意义的和不受控制的,并且不像哈希 ID 那样唯一。 )

很少有额外的资源可以用于你的 GitHub 分支。GitHub 上的 fork一个克隆,但它是一个与原始共享存储的克隆。所以你并没有真正给 GitHub 增加太多负载(尽管想到了骆驼、背部和稻草的比喻)——任何克隆你的 repo 的人都会在克隆子模块的时候克隆一些存储库。这将占用尽可能多的空间:无论多少兆字节,加上你的提交,如果它们被合并,如果他们克隆第三方的存储库,无论多少兆字节,加上你的提交,如果他们克隆你的分叉。由于您只修改了几个文件,因此添加到 fork 的额外提交几乎不会增加任何权重到你的分叉:他们实际上与早期的提交共享所有未修改的文件。


推荐阅读