Ser*_*rge 4 git git-submodules
我有多个单独的 git 存储库,其中没有子模块。任务是组装这些存储库的层次结构树并使用它在用户之间共享。这对于“子树”或“子存储库”方案来说是微不足道的,但它似乎不适用于“子模块”。尝试子模块的原因是 nfs 系统上的 git 性能缓慢。以我为例,结账需要 2 个小时以上
我正在尝试创建一个包含子模块的共享存储库。到目前为止,第一次克隆尝试失败了。这是测试用例:
mkdir m1 ; cd m1 ; git init ; date > a.txt ; git add --all ; git commit -m added ; cd -
mkdir m2 ; cd m2 ; git init ; date > b.txt ; git add --all ; git commit -m added ; cd -
mkdir m3 ; cd m3 ; git init ; date > c.txt ; git add --all ; git commit -m added ; cd -
mkdir msub; cd msub; git init; date > d.txt; git add --all; git commit -m added;
git submodule add `realpath ../m1` m1
cd m1
git submodule add `realpath ../../m2` m2
git submodule add `realpath ../../m3` m3
git commit -m 'added submodules'
cd ..
git commit -m 'added a submodule'
cd ..
git clone --recursive msub msub1
Run Code Online (Sandbox Code Playgroud)
结果,它创建了带有单个顶级子模块 (m1) 的 msub1。
在其他情况下,在克隆第一个子模块后,我遇到了与此类似的致命错误。
fatal: git upload-pack: not our ref 89434ad65c1e697bfa311cd0260dfe1997985e65
fatal: remote error: upload-pack: not our ref 89434ad65c1e697bfa311cd0260dfe1997985e65
Fetched in submodule path 'soc', but it did not contain 89434ad65c1e697bfa311cd0260dfe1997985e65. Direct fetching of that commit failed.
Run Code Online (Sandbox Code Playgroud)
我尝试直接将子模块添加到“m1”,这似乎改善了情况,但我无法使用真正的存储库来做到这一点。
所以,想要的方案似乎行不通。有办法解决吗?
“不是我们的引用”响应通常意味着您的服务器配置为限制通过 ID 直接获取对象,并且没有合适的引用允许获取该对象。
Git 提供了三个选项来控制是否可以获取任意对象 ID:一个允许获取 Git 有权访问的任何任意对象,一个允许从引用获取可访问的任何对象,还有一个还允许从隐藏引用获取可访问的对象。大多数服务器提供商选择禁用其中的一个或多个,这通常意味着您只能在非隐藏引用(即分支或标签)指向对象 ID 时才能请求该对象 ID。
“not our ref”消息意味着您正在尝试通过对象 ID 获取对象,该对象用于子模块,但服务器由于上述原因不允许这样做。如果您使用 Bitbucket Server 的引用缓存,这也可能意味着服务器缓存了过时的数据;在这种情况下,如果您需要工作,则应该禁用引用缓存。
您可以做几件事。如果您需要签出任意修订版的能力,您可以创建一个指向它的分支。或者,如果您的子模块不需要特定的修订版,而只需要最新的分支,那么您可以设置该submodule.<name>.branch选项(请参阅 参考资料man gitmodules),然后您将始终签出最新的分支。如果您使用的是自托管服务器,则可以设置uploadpack.allowAnySHA1InWant为 true。最后,您可以手动获取子模块(可能使用git submodule foreach),它通常会有您想要的修订版。
| 归档时间: |
|
| 查看次数: |
7740 次 |
| 最近记录: |