我使用 git 和稀疏检出功能来处理非常大的单片存储库的子集。使用稀疏检出时性能很好,不使用时性能很差。
有时我的索引会被损坏(Xcode 的 git 集成是我的常见根本原因,但我已通过多种不同的方式解决它)。
对于正常的工作树,这很好,我只需删除索引文件,并且git reset
我可能有一些暂存的更改会回到未暂存的状态,但通常我不会丢失任何重要的东西。
但是对于稀疏签出,git reset
不会从干净的状态考虑稀疏清单,因此会得出结论,完整存储库中不在工作树中的所有文件(即,我的稀疏签出排除的所有内容)必须已被删除,给我留下大量“已删除”文件列表。
因此,使用稀疏签出信息重置索引的推荐方式(即设置 skip-worktree 标志)是调用git read-tree -mu HEAD
,但这要求没有未暂存的更改,我需要保留这些未暂存的更改,并且不能提交它们或暂存它们或任何东西,因为我没有索引(并且考虑到所有“已删除”的文件,一旦 git 意识到它们不在稀疏签出中,它也需要很长时间才能将它们签出,这样它就可以再次删除它们)。
如果我愿意放弃本地更改,我可以改为调用git read-tree -m --reset HEAD
,这样可行。但由于目标是保留未提交的更改,因此这还不够。
答案1
到目前为止我发现的最佳解决方案是将所有更改移动到临时位置,运行git read-tree -mu HEAD
,然后删除 git 创建的所有文件并将其替换为原始更改。
这意味着要等待 git 重新创建所有稀疏的签出文件,但至少我不必等待它创建仓库中我不想签出的所有其他文件(这往往是很多更长)。