【问题标题】:Download newly sparse checkedout files when pulling in git拉入 git 时下载新的稀疏签出文件
【发布时间】:2021-03-02 12:52:04
【问题描述】:

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

之后,我添加一个原点并拉取。现在我只会在稀疏签出文件中包含与模式匹配的文件。

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

任何帮助将不胜感激。

【问题讨论】:

    标签: git clone pull sparse-checkout


    【解决方案1】:

    没有必要再拉任何东西。您的操作基于错误的假设,这将导致您得出错误的结论。

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

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

    相反,当您git checkout 某个提交时,Git 复制 提交的文件 out,将它们展开为可用的形式。使用稀疏检出,您只是在告诉 Git:不要复制所有文件,只需复制一些选定的文件子集 如果某些文件很大和/或杂乱无章和/或检出速度很慢,这有助于您处理提交中的文件——您使用 提取的副本,与实际文件无关(因为它们无法使用)。

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

    【讨论】:

    • 所以 sparse-checkout 确实会复制所有文件。这确实解决了我的问题。但我最初的想法是只复制某些文件,而不是全部。你知道有没有办法做到这一点?
    • @lolsu:Any 结帐复制文件。这是 Git 的基本原理。稀疏检出只是限制哪些从索引复制到工作树。文件必须存在于索引中,以便它们将在下一次提交中:索引充当建议的下一次提交,并且索引中的文件是提交中的文件。留下一个文件(或取出一个文件),下一次提交会省略该文件——与它的前任相比,这意味着删除文件
    • Git 确实有一种延迟 obtaining 文件的方法,通过所谓的 承诺包。但是,当您尝试签出该提交时,Git 必须调用 promisor(另一个 Git 存储库)并获取有问题的树和 blob,因为必须将文件复制到 Git 的索引中。所以这对你的特殊情况没有帮助。如果你想要一个更小的.git,唯一有帮助的就是浅克隆。这实际上是否有帮助以及有多大帮助在很大程度上取决于存储库。
    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 2012-06-03
    • 2020-02-21
    • 2019-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多