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

拉入git时下载新的稀疏签出文件,git,clone,pull,sparse-checkout,Git,Clone,Pull,Sparse Checkout,假设我创建了一个git回购。我启用稀疏签出,然后在git/info/sparse-checkout中添加一些文件 之后,我添加一个原点和拉力。现在,我将只在稀疏签出文件中有与模式匹配的文件 现在我想添加新文件,这些文件应该包含在稀疏签出中。然后我想再拉一次,为了有新的文件,我只是添加了没有倾斜一切 如有任何帮助,我们将不胜感激。无需再次拉任何东西。你是在错误的假设下操作的,这将导致你得出错误的结论 稀疏签出所做的只是不签出某些文件。你还有文件。这是因为Git根本不是关于文件的。相反,Git是关于

假设我创建了一个git回购。我启用稀疏签出,然后在git/info/sparse-checkout中添加一些文件

之后,我添加一个原点和拉力。现在,我将只在稀疏签出文件中有与模式匹配的文件

现在我想添加新文件,这些文件应该包含在稀疏签出中。然后我想再拉一次,为了有新的文件,我只是添加了没有倾斜一切


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

无需再次拉任何东西。你是在错误的假设下操作的,这将导致你得出错误的结论

稀疏签出所做的只是不签出某些文件。你还有文件。这是因为Git根本不是关于文件的。相反,Git是关于提交的。你要么对整个事情有承诺,要么就没有承诺,也就是说,你一点都没有

每个提交都包含文件:事实上,每个提交都包含每个文件的完整快照。但是提交中的文件不是普通文件。除了Git之外,它们对任何东西都是不可用的。它们以特殊、只读、压缩和消除重复的格式存储。重复数据消除可以处理这样一个事实,即大多数提交都只使用与以前的一些提交相同的文件。压缩使得许多大文件几乎不占用任何空间(尽管它不适用于大型二进制文件,这就是为什么Git不适合保存大量大型二进制文件的原因)。但由于提交中的文件不可用,因此这些文件不是您签出的文件

相反,当您
git checkout
some commit时,git会将文件从commit中复制出来,并将其扩展为可用的形式。使用稀疏签出,您只需告诉Git:不要复制所有文件,只需复制一些选定的文件子集。如果某些文件较大和/或杂乱无章和/或签出速度较慢,这将有助于您处理提交中的文件,而不是实际文件(因为它们不可用)

但是,当您运行
git pull
时,您只是告诉git运行另外两个git命令。这两个Git命令是:(1)
Git fetch
,它获取其他Git所拥有的、您的Git所需要的任何新提交;然后是(2)一个命令,用于将COMMMIT与其提交组合在一起。第二个命令是你的选择;如果您没有选择任何内容,则默认设置为
git merge

合并操作在提交上工作,而不是在文件上工作(尽管在某些更困难的情况下,它需要使用工作树(您在其中让Git存储签出的文件)来进行合并)。如果不需要非常常见的实际合并,
git pull
运行的合并通常是git所称的快进合并。这实际上根本不是一个合并,它只是一种专门的
git签出。因此,同样,一旦启用了稀疏签出,它只会避免从正在使用的新提交中复制出一些或大部分文件,而只会复制出列为“do copy this out”的特定文件

如果您已经更新了要复制的文件列表,那么您需要的是让Git重新读取列表并补偿更改。新的ish(Git 2.25)有助于做到这一点:如果您已经更新了
.Git/info/sparse checkout
文件,则可以运行
Git sparse checkout重新应用。无需再次运行
git pull
。事实上,这样做不会有任何帮助,甚至不会做任何事情,除非有新的提交用于
git-fetch
获取,以便后续的
git-merge
可以快速前进到新的提交以签出


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

因此稀疏签出毕竟会复制所有文件。这确实解决了我的问题。但我最初的想法是只复制某些文件,而不是全部。你知道有没有办法做到这一点吗?@lolsu:任何结帐副本文件。这是Git的一个基本原理。稀疏签出仅限制从索引复制到工作树的数据。这些文件必须存在于索引中,以便它们在下一次提交中:索引充当建议的下一次提交,而索引中的文件就是提交中的文件。保留一个文件(或删除一个文件),下一次提交会忽略该文件,与前一个文件相比,这意味着删除该文件。Git确实有一种延迟获取文件的方法,即通过所谓的promisor包获取提交对象,但不获取与之相关的树和/或blob。但是,当您尝试签出提交时,Git必须调用promisor(另一个Git存储库)并获取有问题的树和blob,因为文件必须复制到Git的索引中。所以这对你的特殊情况没有帮助。如果你想要一个更小的
.git
,唯一有用的就是一个浅克隆。这是否以及有多大帮助在很大程度上取决于存储库。