这只是为将来遇到同样问题的人提供的报告。
我花了很多时间来调查为什么在从 git 安装软件包时“uv install”在 docker 中失败。问题表现是:
error: Failed to download and build: `gunicorn @ git+https://github.com/StarfishStorage/gunicorn.git@a5bf38eea1f7642ac092e4a1639e2ccf0f4cf93b`
02:24:37 Caused by: Git operation failed
02:24:37 Caused by: process didn't exit successfully: `git clone --local /root/.cache/uv/git-v0/db/a172a1434ad2fe00 /root/.cache/uv/git-v0/checkouts/a172a1434ad2fe00/a5bf38ee` (exit status: 128)
02:24:37 --- stderr
02:24:37 Cloning into '/root/.cache/uv/git-v0/checkouts/a172a1434ad2fe00/a5bf38ee'...
02:24:37 fatal: hardlink different from source at '/root/.cache/uv/git-v0/checkouts/a172a1434ad2fe00/a5bf38ee/.git/objects/pack/pack-f885b85a815c5038c511818577ead54db50e3281.idx'
创建硬链接成功,但因为底层文件系统是overlayfs,然后创建指向
dest_path
的硬链接src_path
可能会导致src_path
会改变它的inode(因为它会出现在不同的fs层)。因此 git 拒绝这样的硬链接,因为它需要具有相同的属性:
https://github.com/git/git/blob/master/builtin/clone.c#L405
恕我直言,这是“git”中的小错误,可以通过创建硬链接后刷新统计值
iter->st
来解决。
重试“关闭”也可以解决问题,因为一旦创建硬链接,就会导致硬链接文件出现在新的 fs 层中,并且稍后创建硬链接不会更改 inode。
可以通过
uv
选项export UV_CACHE_DIR=copy
或export UV_CACHE_DIR=symlink
来解决,但它也会带来后果。
我的选择是在创建 docker 镜像后删除
/root/.cache/uv/git-v0
目录。