拉入时下载新的稀疏检出文件 git

Download newly sparse checkedout files when pulling in git

假设我创建了一个 git 存储库。我启用稀疏结帐,然后在 git/info/sparse-checkout.

中添加一些文件

之后,我添加一个原点并拉动。现在我将只有与稀疏结帐文件中的模式匹配的文件。

现在我想添加新文件,这些文件应该包含在稀疏结帐中。然后我想再次拉取,以便获得我刚刚添加的新文件,而没有重新克隆所有内容。

如有任何帮助,我们将不胜感激。

不用再拉东西了。你的假设是错误的,这会导致你得出错误的结论。

稀疏检出只是不检出一些文件。您仍然 文件。那是因为 Git 根本不是关于文件的。相反,Git 完全是关于 提交 。你要么有一个提交——整个事情——要么你没有,也就是说,你有 none 个。

每个提交包含个文件:事实上,每个提交都包含每个个文件的完整快照。但是提交中的文件不是普通文件。它们实际上无法用于任何 Git。它们以特殊的、只读的、压缩的和去重的格式存储。重复数据删除处理这样一个事实,即大多数提交大多只使用 相同的 文件作为一些先前的提交。压缩使得许多大文件几乎不需要 space(尽管它往往不适用于大型二进制文件,这就是为什么 Git 往往不适合保存大量大型二进制文件的原因)。但是因为提交中的文件不是 可用,所以这些文件不是您签出的文件。

相反,当您 git checkout 一些提交时,Git 复制 提交的文件 out,将它们扩展成可用的形式。使用稀疏校验,您只是告诉 Git:不要复制 所有 文件,只需复制一些选定的 子集 个文件。 如果某些文件很大 and/or 杂乱无章 and/or 签出速度很慢,这有助于您处理来自提交——您使用 提取的副本 ,而不是实际文件(因为它们不可用)。

但是,当您 运行 git pull 时,您只是在告诉 Git 到 运行 另外两个 Git 命令。这两个 Git 命令是:(1) git fetch,它获取另一个 Git 没有但你的 Git 需要的任何新提交;接着是 (2) 将您的 commits 与他们的 commits 合并的命令。第二个命令是你的选择;如果您未选择任何内容,则默认值为 git merge.

合并操作适用于 提交,而不适用于文件(尽管它需要使用您的工作树,其中您 Git 存储签出的文件,以在一些更困难的情况下进行合并)。如果不需要实际合并——这很常见——git pull 运行 的合并通常是 Git 所谓的 快进合并 .这实际上根本不是合并,它只是一种特殊的 git checkout。所以,再次,一旦你打开了稀疏检出,它只是避免从你正在使用的新提交中复制出 一些或大多数 文件,而只是复制你已经使用的特定文件列为“将这些复制出来”。

如果您更新了要复制的文件列表,您需要 Git 重新阅读列表并补偿更改。新的 (Git 2.25) git sparse-checkout command 有助于做到这一点:如果您更新了 .git/info/sparse-checkout 文件,您可以 运行 git sparse-checkout reapply。没必要再运行git pull了。实际上,这样做无济于事——甚至根本无济于事——除非有新的提交供 git fetch 获取,以便后续的 git merge 可以快进到新的提交以进行检出。

如果你没有 Git 2.25 或更高版本,最好的办法可能是升级,但你可以(相当痛苦地)清除各种索引条目上的 --skip-worktree 位您希望 Git 签出的文件,然后 运行 git checkoutgit restore 将这些文件复制到您的工作树中。