我正在尝试从 github 进行检出,但收到以下错误消息:
[user@arch ~]$ git clone --recursive https://github.com/simsong/tcpflow.git
Cloning into 'tcpflow'...
The authenticity of host 'github.com (192.30.253.113)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,192.30.253.113' (RSA) to the list of known hosts.
remote: Counting objects: 4190, done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 4190 (delta 21), reused 29 (delta 12), pack-reused 4146
Receiving objects: 100% (4190/4190), 50.27 MiB | 2.21 MiB/s, done.
Resolving deltas: 100% (2954/2954), done.
Submodule 'src/be13_api' (https://github.com/simsong/be13_api.git) registered for path 'src/be13_api'
Submodule 'src/dfxml' (https://github.com/simsong/dfxml.git) registered for path 'src/dfxml'
Submodule 'src/http-parser' (https://github.com/nodejs/http-parser.git) registered for path 'src/http-parser'
Cloning into '/home/user/tcpflow/src/be13_api'...
remote: Counting objects: 1203, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 1203 (delta 2), reused 5 (delta 1), pack-reused 1194
Receiving objects: 100% (1203/1203), 477.47 KiB | 1.96 MiB/s, done.
Resolving deltas: 100% (821/821), done.
Cloning into '/home/user/tcpflow/src/dfxml'...
remote: Counting objects: 1929, done.
remote: Total 1929 (delta 0), reused 0 (delta 0), pack-reused 1929
Receiving objects: 100% (1929/1929), 572.09 KiB | 2.89 MiB/s, done.
Resolving deltas: 100% (1294/1294), done.
Cloning into '/home/user/tcpflow/src/http-parser'...
remote: Counting objects: 1487, done.
remote: Total 1487 (delta 0), reused 0 (delta 0), pack-reused 1487
Receiving objects: 100% (1487/1487), 667.24 KiB | 2.46 MiB/s, done.
Resolving deltas: 100% (916/916), done.
Submodule path 'src/be13_api': checked out 'c81521d768bb78499c069fcd7c47adc8eee0350c'
Submodule path 'src/dfxml': checked out 'c31224626cf5f6678d42cbcfbfcd4e6191c9a864'
error: Server does not allow request for unadvertised object 5bbcdc5df9d01b521e8da011bab0da70bdec3653
Fetched in submodule path 'src/http-parser', but it did not contain 5bbcdc5df9d01b521e8da011bab0da70bdec3653. Direct fetching of that commit failed.
[user@arch ~]$
所以我是这些 repo 的维护者。src/http-parser 是另一个 repo 的分支,而该 repo 的维护者一直不接受我的拉取请求(没有给出任何理由)以将一些自动生成的文件添加到文件.gitignore
。但我不认为这是这里的问题。
答案1
jgit - git 公布的 refs 是什么? - 代码日志:
在获取过程中,服务器可以列出它拥有的以及客户端可能希望获取的引用。这些是已公布的引用。
- 看起来像您无法直接从服务器获取任何单个特定的提交,只能获取引用(即分支和标签)。或者更确切地说,Github 服务器配置为不允许此类请求。
所以,如果你想获得一个特定的提交
--depth
,它必须<depth>-1
距离获取的引用最多有提交(这是子模块元数据中指定的分支/标签)通常,人们建议只设置
depth
一个相当大但仍比仓库中的提交总数小得多的数字 - 比如50
或100
。例如,50
Travis 在为项目进行初始克隆时使用的值。
如果您没有使用 更新子模块--depth
,则无法找到提交可能意味着以下情况:
- 子模块的树处于“浅”状态,并且上述情况适用(仅当它之前已使用
--depth
或更新时才有可能)其进入.gitmodules
有shallow = true
) - 提交不在子模块正在使用的分支上
- 提交根本不在子模块的存储库中:
- 要么有人犯了错误,
- 或者它曾经存在,但被强制推送删除
为了记录,在您的具体情况下,这是最后一种情况:提交根本5bbcdc5df9d01b521e8da011bab0da70bdec3653
不在https://github.com/simsong/http-parser.git
存储库中。
答案2
获取未公开对象的一种方法是同步。然后子模块更新应该可以工作,例如:
git submodule sync --recursive
git submodule update
答案3
当您指向已通过历史重写或压缩删除的子模块提交时,可能会发生这种情况。您能做的最好的事情是:
- 首先清楚了解您的团队一直在做什么,这样您就知道它应该是什么样子。
- 使用 git pull 更新您的本地,然后找到与您的分支最接近的提交(它可能是最新的),然后将其添加到您的父存储库。例如:
parent-repo$ git fetch
parent-repo$ cd submodule-a
submodule-a$ git pull
submodule-a$ git checkout best-commit-according-to-team-and-your-branch
submodule-a$ cd ../
parent-repo$ git status
...
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
(commit or discard the untracked or modified content in submodules)
modified: submodule-a (modified content)
...
git add submodule-a
git commit -m "updated submodule-a reference"
一旦您确信它是正确的,并且您的团队同意您可以将其推上去,错误就会消失。
答案4
对我来说,当我将父 git repo 推回 github 而不推回我已修改和提交但尚未推回的子模块时,往往会发生这种情况。