Git 稀疏结帐错误 "Entry 'path/to/file' not update. Cannot update sparse checkout"

Git sparse checkout error "Entry 'path/to/file' not update. Cannot update sparse checkout"

我刚刚按照以下步骤进行了稀疏结帐

git clone http://location/repo.git
# create .git/info/sparse-checkout file
git config --bool core.sparsecheckout true
git read-tree -mu HEAD

很遗憾,最后一步失败并显示错误消息

Entry 'path/to/file' not update. Cannot update sparse checkout

这很奇怪,因为 (1) path/to/file 存在 (2) 稀疏结帐过程在另一台机器 git 版本 1.7.1 (Centos 6) 上成功。当前机器是安装了 git 版本 1.8.3.1 的 Centos 7 盒子。 git config --list 的输出在两台机器上是相同的。

我基本上通过删除所有文件并重复相同的步骤来解决问题。 suggested 这可能是 git 中的错误,或者是 IMO 某种文件损坏。

另一个对我有用的解决方案 (YMMV)。尝试反复检查有问题的目录和 运行 git read-tree

  1. git结帐--路径/
  2. git read-tree -mu HEAD

如果函数 ie_match_stat 无法匹配统计信息,则会发生错误(对于 work-tree 中的文件)。这个对 ie_match_stat 的特定调用传递 CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE 因为 ie_match_stat 通常会服从缓存条目标志 CE_VALIDCE_SKIP_WORKTREE 通过说:the work-tree 副本是最新的 即使不是。稀疏签出代码使用 skip-worktree 标志 (CE_SKIP_WORKTREE) 来标记应该 不应该 签出的文件,这样 Git 的其余部分就赢了'抱怨他们失踪了。

因此,这里的奇怪之处是:

  • skip-worktree 位设置在 的文件上 work-tree。为什么?
  • 此文件的索引条目缓存 stat 数据与此文件的 lstat 结果不匹配。为什么?

第一个问题的答案可能是:因为用户设置了它(使用git update-index)。第二个答案可能是:因为用户修改了文件。所以它们一点也不奇怪,它们只是暗示该文件与初始签出或 git read-tree 操作创建的任何内容都不匹配。如果您不介意丢失文件内容,请随时将其删除。如果您确实关心内容,请清除 skip-worktree 位 (git update-index --no-skip-worktree),之后 git diff 应该会显示不同之处。

这方面可能存在一些错误,尤其是在这么古老的 Git 版本中(Git 1.8.x—当前 Git 是 2.22) .

首先,对于 Git 2.27(2020 年第 2 季度),删除文件后,您可以使用

其次,报错信息变了(还是用Git 2.27+):

commit 5644ca2, commit 681c637, commit ebb568b, commit 22ab0b3, commit 6271d77, commit 1ac83f4, commit cd002c1, commit 4ee5d50, commit f56f31a, commit 7af7a25, commit 30e89c1, commit 3cc7c50, commit b0a5a12, commit 72064ee, commit fa0bde4, commit d61633a, commit d7dc1e1, commit 031ba55 (27 Mar 2020) by Elijah Newren (newren)
(由 Junio C Hamano -- gitster -- in commit 48eee46 合并,2020 年 4 月 29 日)

unpack-trees: make sparse path messages sound like warnings

Reviewed-by: Derrick Stolee
Signed-off-by: Elijah Newren

The messages for problems with sparse paths are phrased as errors that cause the operation to abort, even though we are not making the operation abort.

Reword the messages to make sense in their new context.

这不再是:

Cannot update sparse checkout

但是:

The following paths are not up to date