Git 稀疏结帐错误"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输出相同。

如果函数ie_match_stat与统计信息不匹配,则会发生错误(对于工作树中的文件)。 这种对ie_match_stat的特定调用传递CE_MATCH_IGNORE_VALID|CE_MATCH_IGNORE_SKIP_WORKTREE,因为ie_match_stat通常会遵守缓存条目标志CE_VALIDCE_SKIP_WORKTREE,方法是说:工作树副本是最新的,即使它不是最新的。 稀疏签出代码使用 skip-worktree 标志 (CE_SKIP_WORKTREE) 来标记不应该签出的文件,这样 Git的其余部分就不会抱怨它们丢失了。

因此,这里的奇怪之处在于:

跳过工作树
  • 位是在工作树中的文件上设置的。为什么?
  • 此文件的索引条目的缓存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 中的错误,或者 IMO 某种文件损坏。

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

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

首先,在 Git 2.27(2020 年第 2 季度)中,删除文件后,您可以使用git sparse-checkout reapply

其次,错误消息已更改(仍然使用 Git 2.27+):

请参阅提交 5644ca2、提交 681c637、提交ebb568b、提交 22ab0b3、提交 6271d77、提交 1ac83f4、提交 cd002c1、提交 4ee5d50、提交 f56f31a、提交 7af7a25、提交 30e89c1、提交 3cc7c50、提交 b0a5a12、提交 72064ee、提交 fa0bde4、提交 d61633a、提交 d7dc1e1、提交 031ba55(2020 年 3 月 27 日)由 Elijah Newren (newren).
(由 Junio C Hamano --gitster合并 -- 在提交 48eee46 中, 29 4月 2020)

unpack-trees:使稀疏路径消息听起来像警告

评论者: 德里克·斯托利
签名者: 以利亚·纽伦

稀疏路径问题的消息被表述为导致操作中止的错误,即使我们没有使操作中止。

改写消息以使其在新上下文中有意义。

这不再是:

Cannot update sparse checkout

但是:

The following paths are not up to date

最新更新