拉入时下载新的稀疏检出文件 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 checkout
或 git restore
将这些文件复制到您的工作树中。
假设我创建了一个 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 checkout
或 git restore
将这些文件复制到您的工作树中。