git - 没有 Remote 的嵌套 git 存储库(也称为没有 Remote 的 git 子模块)

标签 git git-submodules

我有一个项目,我有兴趣将其中的部分拆分为开源项目。我已经设置了嵌套的 git 存储库 main、一、二和三:

main/
├── one
├── three
└── two

我认为通过进入“主要”并做

git add one
git add two
git add three

(注意尾部没有斜杠),我会用子存储库设置子模块,然后就可以开始了。

但是,如 How to track untracked content? 中所述, 这只会创建 gitlink 而不是真正的子模块。

不幸的是,这个答案没有帮助,因为它假定在某处有一个“主”存储库else用于“main/one”、“main/two”和“main/three” ”。我希望这些子存储库成为主存储库。我正在考虑伪造子模块(根据 Git fake submodules ),但这不是克隆的特别理想情况。

还有其他建议吗?

最佳答案

你可以做你想做的事,但是你的onetwothree 需要对任何需要克隆的人开放它们——“随机”开发存储库通常不是这种情况。

如果你确实设置了它,你需要非常小心不要删除“你的”存储库(或以其他方式使其无法访问),因为它不仅仅是“你的”:它将是 origin 在你的合作者的克隆中,它将作为“中央”/“上游”存储库(如 .gitmodules 中指定)。


如果您所有的协作者都是本地的(并且可以从存储库中读取),您可以通过将其本地路径作为 URL 来将现有的子存储库添加为子模块:

git rm --cached one two three
git submodule add `pwd`/one
git submodule add `pwd`/two
git submodule add `pwd`/three

如果不是所有的协作者都在同一台机器上工作,那么这可能无法正常工作(因为它将在 .gitmodules 中存储本地路径;非本地协作者将不得不调整git submodule init 之后的 URL。

如果您的 onetwothree 可以远程 Git 访问,那么您可以改为指定它们的有效 URL:

git rm --cached one two three
git -c protocol.file.allow=always submodule add server:/path/to/your/main/one
git -c protocol.file.allow=always submodule add server:/path/to/your/main/two
git -c protocol.file.allow=always submodule add server:/path/to/your/main/three

在这两种情况下,由于您已经有一个子存储库,git submodule add 将使用它而不是尝试从指定的路径/URL 克隆。

关于git - 没有 Remote 的嵌套 git 存储库(也称为没有 Remote 的 git 子模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6100966/

相关文章:

git - 如何在没有第一次提交的情况下撤消 git rm -rf dirname?

git - Atom 文本编辑器将 "^M"添加到空行

git - 如何 pull 一个新的子模块

git - 如何查看 git 子模块指向哪个提交

git - 如何在本地更改 git 子模块 url?

git - 从存储库中删除不正确的 merge

git - Git 使用的术语

windows - 为什么 git 要我输入密码?

git - 我如何 "git clone"一个 repo,包括它的子模块?

git - 为什么 Teamcity 无法 pull git 子模块