如何测试Git存储库是否浅薄?

时间:2016-05-30 18:16:50

标签: git

当我从存储库创建本地克隆时,如果源存储库很浅,则克隆将失败。

git clone -l -- . target-dir

由于情况并非总是如此,我想找出之前的克隆但不知道如何做到这一点。

到目前为止我尝试的内容很少,基本上是在克隆上创建错误消息。目前我只是获取unshallow,如果失败了,我会做一个简单的获取,因为如果repo很浅,那么之后它应该是unshallow:

if ! git fetch --unshallow; then
    git fetch
fi

然而,之后不能保证unshallow(远程提取也可能很浅),因此测试git存储库的(un)浅度会好得多。

2 个答案:

答案 0 :(得分:13)

可能git rev-parse,其中公开了其他几个项目(--is-inside-git-dir--is-inside-work-tree--is-bare-repository),应该进行浅度测试({ {1}})。 Until Git version 2.15,但事实并非如此。如果您的Git较旧, 1 只需测试Git存储库目录中的文件--is-shallow-repository

shallow

或(更短):

if [ -f $(git rev-parse --git-dir)/shallow ]; then
    echo this is a shallow repository;
else
    echo not a shallow repository;
fi

1 [ -f $(git rev-parse --git-dir)/shallow ] && echo true || echo false 将打印当前版本号:

git --version

等。 (此时我在不同的VM /机器上有多个版本。)您也可以运行:

$ git --version
2.14.1

$ git --version
git version 2.7.4

如果它只是打印git rev-parse --is-shallow-repository ,那么你的Git是2.15之前的版本而且没有选项。

答案 1 :(得分:1)

当您无权访问远程存储库时(这里不是这种情况,但仍然是一种可能的情况),git clone 仍然是测试远程存储库是否浅层的好方法。< /p>

当克隆最终失败时,问题不是不必要地传输/创建文件,因为所述远程存储库的性质很浅。

此问题现已在 Git 2.32(2021 年第二季度)中得到修复:"git clone"(man) 新的 --reject-shallow 选项在我们执行克隆后立即失败请注意,我们是从浅层存储库进行克隆。

请参阅 commit 4fe788bLi Linchao (Cactusinhand)(2021 年 4 月 1 日)。
(由 Junio C Hamano -- gitster --commit 22eee7f 合并,2021 年 4 月 8 日)

<块引用>

builtin/clone.c:添加--reject-shallow选项

签字人:李林超

<块引用>

在某些情况下,用户可能想要比提供用于克隆的存储库更多的历史记录,这恰好是一个浅存储库,可以给他们。
但是因为用户在下载到本地之前并不知道它是一个浅存储库,所以我们可能希望拒绝克隆这种存储库,而不创建任何不必要的文件。

'--depth=x' 选项不能用作解决方案;源代码的深度可能足以在克隆时为我们提供“x”提交,但用户稍后可能需要将历史记录加深到任意深度。

将 '--reject-shallow' 选项教给 "git clone"(man) 以在我们发现我们正在从浅存储库进行克隆时立即中止.

未创建本地文件!

错误信息将是(使用测试克隆命令):

git -c clone.rejectshallow=true clone --no-local shallow-repo
source repository is shallow, reject to clone.

git config 现在包含在其 man page 中:

<块引用>

clone.rejectShallow

拒绝克隆一个浅的仓库,可以被覆盖 在命令行中传递选项 --reject-shallow

git clone 现在包含在其 man page 中:

<块引用>

--[no-]reject-shallow

如果源存储库是浅存储库,则失败。
'clone.rejectShallow' 配置变量可用于 指定默认值。