当Git子模块离线时会发生什么?

4

我仍在努力弄清楚如何使用Git子模块。假设我正在使用指向一个公共存储库的子模块,而我只有读取权限。

当该存储库被下线并且无法访问时,我的项目会发生什么?

3个回答

4
这就是git/DSCM的一大优势:你本地的克隆是一个完整的仓库,子模块也不例外。任何“中央”仓库只是项目开发者同意推送更改的位置。简单来说,写访问权限意味着您可以向此预先协商的位置推送。理论上,您甚至可以在多个“中央”仓库主机之间进行网络,并让开发人员向每个仓库推送,或者让每个仓库运行挂钩以相互同步。因为git仓库的每个克隆(包括子模块)本身都是一个完整的仓库,所以如果该中央官方推送位置发生更改或消失,则仍然具有完全可用的仓库,并且具有对本地克隆的完全读/写访问权限。如果子模块官方开发人员决定要简单地重定位其“中央”克隆,则所有您需要做的就是更新子模块的远程引用以指向新的、正确的位置。参见: GitHug:添加远程, GitBook:远程分支

GitBook:使用远程库

更新

假设您的项目可以被其他人访问。这意味着这些用户还需要访问您的项目使用的任何子模块。

您可以重新托管本地子模块(称为“forks”),并修改主要项目仓库以引用分叉的仓库。这比复制/粘贴更可取,即使官方仓库仍然存在,这也可能是一个好主意。当然,这取决于原始项目所提供的许可证。

以下是这样做的几个原因:

  1. 即使没有被授予对“official”中央仓库的写入访问权限,您也可以更改您的fork。
  2. 如果官方中央仓库停止服务,您仍然拥有完整的实时版本,供任何想查看您的项目的人使用。
  3. 与复制/粘贴版本不同,相对容易将forked repo与官方repo保持同步。此外,您可以保留原始repo的所有分支和历史记录,而使用复制/粘贴只能获得一个初始副本提交历史项。
  4. 子模块repo维护者可能决定将您的一些更改合并回“official”版本。如果他们有一个完整的repo克隆来工作(这是一个子模块),那么这个过程相对容易完成。

谢谢你的回答。如果子模块仓库永久下线,那么就没有URL可以指向了,这时如果我从我的主分支创建一个新分支,子模块初始化会失败吗?如果是这样,那么我的解决方案是从我的主分支复制/粘贴文件到我的分支中吗?(如果我听起来很傻,请原谅...我正在从SVN转移到GIT,并试图适应它。我已经阅读了很多文档,并试图在短时间内消化它们) - Sid
非常感谢您提供的答案,回答了我所有的问题! - Sid

2

从某种意义上讲,子模块被视为独立的存储库。因此,如果您的子模块存储库离线 - 就无法更新子模块。

当您使用子模块时,意味着整个开发周期内所有开发人员都可以访问该存储库。

只在相对稳定的组件中使用子模块。


如果我在主分支上运行git submodule update,更新将失败。明白了。如果子模块仓库离线后我从主分支创建一个新分支会怎样?在新创建的分支中会发生什么?子模块初始化是否失败,导致子模块文件夹为空? - Sid
1
@Sid 分支是从现有提交创建的,因此如果您从已初始化子模块的提交中分支出来 - git 将使用该提交,并不会重新初始化子模块:您可以使用先前更新的子模块。 - Ruslan Osipov

1
你的存储库是属于你自己的,你仍然拥有以前的所有内容。如果你能找到该项目的另一个来源,只需更改URL即可。在.gitmodules中的内容是管理分发的行政帮助,没有任何东西说你必须使用建议的URL。你的存储库使用.git/config中的内容。git submodule只加载默认值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接