背景:最近安装了一台新笔记本电脑,并将我的 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
打印 true
,git 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/