在 RISC-V GNU 工具链中获取子模块时出错:服务器不允许请求未通告的对象

问题描述 投票:0回答:1

操作系统:Ubuntu20.04LTS

描述:

我按照 riscv-gnu-toolchain README 中的说明进行操作。首先,我跑了:

git clone https://github.com/riscv/riscv-gnu-toolchain

我安装了所需的依赖项:

sudo apt-get install autoconf automake autotools-dev curl python3 python3-pip libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo gperf libtool patchutils bc zlib1g-dev libexpat-dev ninja-build git cmake libglib2.0-dev libslirp-dev

执行以下命令来配置和构建:

./configure --prefix=/opt/riscv
make

结果是

make
cd /home/fufu/gits/riscv-gnu-toolchain && \
flock `git rev-parse --git-dir`/config git submodule init /home/fufu/gits/riscv-gnu-toolchain/newlib/ && \
flock `git rev-parse --git-dir`/config git submodule update --progress --depth 1 /home/fufu/gits/riscv-gnu-toolchain/newlib/
Submodule 'newlib' (https://sourceware.org/git/newlib-cygwin.git) registered for path 'newlib'
Cloning into '/home/fufu/gits/riscv-gnu-toolchain/newlib'...
remote: Enumerating objects: 6971, done.        
remote: Counting objects: 100% (6971/6971), done.        
remote: Compressing objects: 100% (5327/5327), done.        
remote: Total 6971 (delta 2582), reused 3275 (delta 1516), pack-reused 0        
Receiving objects: 100% (6971/6971), 14.31 MiB | 3.46 MiB/s, done.
Resolving deltas: 100% (2582/2582), done.
remote: Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
error: Server does not allow request for unadvertised object 26f7004bf73c421c3fd5e5a6ccf470d05337b435
Fetched in submodule path 'newlib', but it did not contain 26f7004bf73c421c3fd5e5a6ccf470d05337b435. Direct fetching of that commit failed.
make: *** [Makefile:348: /home/fufu/gits/riscv-gnu-toolchain/newlib/.git] Error 1

我尝试过的:

关注gpt

cd newlib
git checkout master
git pull origin master
git submodule update --init --recursive

错误变成了

Cloning into '/home/fufu/gits/riscv-gnu-toolchain/spike'...
Cloning into '/home/fufu/gits/riscv-gnu-toolchain/uclibc-ng'...
error: Server does not allow request for unadvertised object beb2cdbcda911764b2bed5e57921fe90493260bd
Fetched in submodule path 'binutils', but it did not contain beb2cdbcda911764b2bed5e57921fe90493260bd. Direct fetching of that commit failed.

我在 binutils 中再次执行此操作,但仍然

error: Server does not allow request for unadvertised object beb2cdbcda911764b2bed5e57921fe90493260bd
Fetched in submodule path 'binutils', but it did not contain beb2cdbcda911764b2bed5e57921fe90493260bd. Direct fetching of that commit failed.

我尝试

git submodule sync 
git submodule update --init --recursive

同样的问题

我的问题: 是什么导致了错误:“服务器不允许请求未通告的对象”? 我该如何解决这个问题? 非常感谢您的帮助!

git git-submodules ubuntu-20.04 riscv
1个回答
0
投票
error: Server does not allow request for unadvertised object 26f7004bf73c421c3fd5e5a6ccf470d05337b435
Fetched in submodule path 'newlib', but it did not contain 26f7004bf73c421c3fd5e5a6ccf470d05337b435. Direct fetching of that commit failed.

当 Git 直接通过其哈希获取提交时,即会发生此错误,即它执行了

git fetch origin 26f7004bf73c421c3fd5e5a6ccf470d05337b435
,并且服务器(此处 https://sourceware.org/git/newlib-cygwin.git)不允许获取对象直接通过它们的哈希值。服务器不允许这些提取,因为通信使用 Git 协议 v0 并且 https://sourceware.org
 上的配置 
uploadpack.allowTipSHA1InWant
uploadpack.allowReachableSHA1InWant
uploadpack.allowAnySHA1InWant 均为 false(其默认值) .

Git 直接通过哈希值获取提交的原因是

git submodule update
首先尝试一个简单的
git fetch
,并且如果超级项目中记录的提交在该获取之后不可用(因为它无法从获取的分支访问) )然后它直接获取它,这就是这里发生的情况。

在 Ubuntu 20.04 上,Git 版本为 2.25.1,该版本仍然默认协议 v0,这就是您收到上述错误的原因。在 Ubuntu 22.04 上,Git 版本为 2.34.1,其中默认协议版本为 v2(从 Git 2.26.0 开始是默认协议),并且上述配置在使用协议 v2 时不起作用:始终通过哈希获取允许的。这解释了为什么它可以在 Ubuntu 22 上运行。

请注意,协议 v2 是从 Git 2.18.0 开始实现的,因此即使在 Ubuntu 20 上,您也可以通过要求 Git 使用它来使其工作:

git config --global protocol.version 2

另请注意,要使其正常工作,服务器还必须足够新才能默认使用协议 v2,sourceware.org 上就是这种情况,因为它使用的是 Git 2.43.5,您可以通过执行以下操作来查看:

 GIT_TRACE_BARE=1 GIT_TRACE_PACKET=1 git -c protocol.version=2 ls-remote --heads https://sourceware.org/git/newlib-cygwin.git 2>&1 | head
© www.soinside.com 2019 - 2024. All rights reserved.