git - 为什么 git 认为我有一个稀疏 checkout ? "You are in a sparse checkout with 100% of tracked files present."

标签 git

背景:最近安装了一台新笔记本电脑,并将我的 repo 从以前的笔记本电脑压缩并在新笔记本电脑上解压缩。其他一切似乎工作正常。我从来没有在这个仓库或这台机器上进行过稀疏检查。

$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

You are in a sparse checkout with 100% of tracked files present.

$ git sparse-checkout list
warning: this worktree is not sparse (sparse-checkout file may not exist)

$ tree .git/info
.git/info
├── exclude
└── refs

我正在使用工作树,所以我创建了一个新的工作树,但它给出了相同的结果。上述命令是从主工作树目录运行的。

我找到了禁用稀疏 checkout 的命令,但它似乎没有任何影响:

$ git sparse-checkout disable
$ git sparse-checkout disable --global
$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

You are in a sparse checkout with 100% of tracked files present.

我很确定我可以简单地重新克隆存储库以使其消失,但我想确保这种情况不会继续发生。

更新

运行 git config --get --bool core.sparsecheckout 打印 truegit config --list --show-origin code> 显示它来自本地 .git/config 文件,我可以在其中看到它确实是 true。运行 git sparse-checkout disable 并立即 cat 文件后,我可以看到该值保持不变。该文件的权限是 644,我认为这是可以的。

在仔细查看 .git/config 时,我看到了 extensions.worktreeConfig = true,尽管我没有相应的 config.worktree(虽然我正在使用工作树)。我运行 git config extensions.worktreeConfig false 并且该值反射(reflect)在文件中。然而,如果我再次运行 git sparse-checkout disable,它会将 extensions.worktreeConfig 重置为 true

一时兴起,我运行了 git config core.sparsecheckout false,这似乎做出了预期的改变——更好的是,extensions.worktreeConfig 保留了它的值.是的,git status 不再提及“稀疏 checkout ”,这很棒。

这一切都在 git v2.28.0 上。 git sparse-checkout 的文档页面指出:THIS COMMAND IS EXPERIMENTAL,所以也许我应该认真对待它们并将其视为一个错误 :)

最佳答案

根据评论(以及一些在 Git 源代码中搜索),我可以说这似乎是一些新的稀疏支持中的错误,就其与 Git 2.20 中首次引入的功能的交互而言,即extensions.worktreeConfig ,以及 Git 2.28 发布的内容。

要修复它,您应该能够运行:

git config core.repositoryformatversion 1

(或者,你可以做你所做的😀)。

详情

extensions.worktreeConfig setting is, or at least was originally, 打算与git worktree一起使用.它导致 Git 读取两个 本地(特定于存储库的)配置文件:名为 config 的文件在$GIT_DIR (即 .git/config ),以及名为 config.worktree 的文件.

就其本身而言,此功能似乎毫无用处:为什么要为一个配置读取两个单独的文件?这里的技巧是 .git/config适用于所有添加的工作树,而每个添加的工作树都有自己的 config.worktree文件。因此,您可以在每个添加的工作树中配置不同的设置:您想要为附加到此存储库的所有 工作树配置的任何内容都在 .git/config 中。 , 并且任何你想要在一个特定的 work-tree 中附加到这个存储库的东西都在 $GIT_DIR/worktrees/<id>/config.worktree 中(假设它是一个添加的工作树而不是主工作树:主工作树没有 worktrees/ 子目录,所以一个文件将在 $GIT_DIR/config.worktree 中)。

与稀疏 checkout 本身的交互很简单:稀疏 checkout 意味着每个工作树。所以任何时候你使用 git sparse-checkout , Git 尝试打开每个工作树扩展并分别在每个工作树中设置配置。但是这里有一个错误,与稀疏 checkout 没有直接关系。

Git 中有一个更古老的设置,称为 core.repositoryformatversion .此设置早于 Git 1.0(包含添加它的提交的最旧标记是 v0.99.9l ,对于 Git 1.0 是 rc4)。此设置从创建之时 (2005) 到 extensions.* 一直设置为零创建于 2015 年([commit 00a09d57eb8a041e6a6b0470c53533719c049bab (https://github.com/git/git/commit/00a09d57eb8a041e6a6b0470c53533719c049bab))。 所有 扩展(extensions.* 设置)应该需要core.repositoryformatversion设置为 1 ,以便启用它们。但事实上,他们没有。

对于 Git 版本 2.28.0,Git 添加了代码以检查上述要求。如果core.repositoryformatversion设置为,所有扩展都被禁用。一旦设置为 1,扩展将被启用。

不幸的是,像git sparse-checkout 这样的程序将使用扩展,而不首先设置 core.repositoryformatversion .在 Git 2.28 之前,这是可行的。因此,就目前而言,所有这些实验性命令都奏效了。但后来这个长期存在的错误得到了修复,它破坏了使用扩展的一切。1

在 Git 2.29 中,我相信 Git 会注意到错误并发出警告 repositoryformatversion设置,或自动修复它。 (我没有检查或测试过这个。)


1扩展的主要其他用户可能是部分克隆的东西,通过 extensions.partialClone 启用和 extensions.partialCloneRemote .其他的是extensions.objectFormat , extensions.preciousObjects ,当然还有 extensions.worktreeConfig .

关于git - 为什么 git 认为我有一个稀疏 checkout ? "You are in a sparse checkout with 100% of tracked files present.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64541671/

相关文章:

git - 如何使用 git clone --depth 1 check out 远程分支?

Git 和 Github 工作流程,使用父级更改更新子树

git - git gc 是否以确定的时间间隔执行?

git clean 不删除子目录(非递归)

git - 如何将我的代码推送到 github fork

svn - 使用中央存储库是否违背了 GIT 的目的?

git - 获取有关 SHA-1 提交对象的信息?

Git 预提交 Hook 无法运行 gradle 命令

git diff 输出仅更改行

git - 用图形查看本地 git 提交