【问题标题】:How to Test if Git Repository is Shallow?如何测试 Git 存储库是否浅?
【发布时间】:2016-09-28 15:13:13
【问题描述】:

当我从存储库进行本地克隆时,如果源存储库很浅,则克隆会失败。

git clone -l -- . target-dir

由于情况并非总是如此,我想找出以前的克隆,但不知道该怎么做。

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

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

但是不能保证之后不浅(从远程获取也可能是浅的),因此测试 git 存储库的(非)浅度会好得多。

【问题讨论】:

  • 有什么问题?
  • @Whymarrh: "How to Test if Git Repository is Shallow?",刚刚编辑过,首先使用内置搜索的标题。

标签: git


【解决方案1】:

如果您的 Git 是 2.15 或更高版本,请运行:

git rev-parse --is-shallow-repository

将打印false(不浅)或true(浅):

if $(git rev-parse --is-shallow-repository); then
    ... repository is shallow ...
fi

下面的答案可以追溯到 2.15 之前的 Git 版本。


如果您的 Git 版本早于 2.15,1 只需在 Git 存储库目录中测试文件 shallow:

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

或(更短):

[ -f $(git rev-parse --git-dir)/shallow ] && echo true || echo false

你可以把它变成一个shell函数:

test_shallow() {
    [ -f $(git rev-parse --git-dir)/shallow ] && echo true || echo false
}

甚至自动化 Git 版本检查:

test_shallow() {
    set -- $(git rev-parse --is-shallow-repository)
    if [ x$1 == x--is-shallow-repository ]; then
        [ -f $(git rev-parse --git-dir)/shallow ] && set true || set false
    fi
    echo $1
}

1git --version 将打印当前版本号:

$ git --version
2.14.1

$ git --version
git version 2.7.4

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

git rev-parse --is-shallow-repository

如果它只打印 --is-shallow-repository,那么您的 Git 是 2.15 之前的版本并且缺少该选项。

【讨论】:

  • 所以只要存储库很浅,git-dir 中就有shallow 文件,不是吗?对此进行测试,听起来很有希望,到目前为止已经感谢您的回答。
  • 来自测试:删除浅文件使 git 认为它不是浅文件并允许本地克隆。接下来只是注意到我当前的 git 版本 --local 如果检测到浅层并被克隆,则会被忽略,但仍会退回到非本地。那么退出状态码为0。
  • shallow 文件不仅是标记,它还包含 使其 成为浅存储库的移植物(如果您删除文件,它只是一个损坏的存储库) .仅仅删除它通常是不明智的:将其留给成功地 unshallows 的 fetch。
  • @torken:我删除它只是为了测试,因为我想试试会发生什么。我做检查,如果很浅,通过 fetch 取消它。
【解决方案2】:

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

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

此问题现已通过 Git 2.32(2021 年第二季度)修复:“git clone”(man) 新的 --reject-shallow 选项一旦我们注意到我们正在从一个浅层存储库。

参见Li Linchao (Cactusinhand) 的commit 4fe788b(2021 年 4 月 1 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 22eee7f,2021 年 4 月 8 日)

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

签字人:李林超

在某些情况下,用户可能需要比提供用于克隆的存储库(恰好是浅存储库)所能提供的更多历史记录。
但由于用户在下载到本地后才知道它是一个浅层存储库,因此我们可能希望拒绝克隆这种存储库,而不创建任何不必要的文件。

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

一旦我们发现我们正在从浅存储库克隆,就教“git clone”的“git clone”选项(man)中止。

没有创建本地文件!

错误消息将是(使用 test clone 命令):

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' 配置变量可用于 指定默认值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多