我刚刚按照以下步骤进行了稀疏结帐
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_VALID
或CE_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
- git 结帐 -- 路径/
- 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