【问题标题】:How to disable sparse checkout after enabled?启用后如何禁用稀疏结帐?
【发布时间】:2016-03-23 23:42:23
【问题描述】:

我启用了稀疏结帐

git init
git remote add <url>
git config --global core.sparseCheckout true
echo "assets" >> .git/info/sparse-checkout
git pull origin master

Git 只为我检查了 assets 文件夹

但是现在,我想再次启用完整的分支结帐(结帐文件夹/文件),但它似乎不起作用。

1) 首先我禁用了配置

git config --global core.sparseCheckout false

2) 删除 .git/info/sparse-checkout 中的条目

但是 git 并没有为我签出任何其他文件夹/文件,它似乎坚持“资产”文件夹。

谁能告诉我如何在不创建新存储库的情况下重置/禁用此稀疏结帐?

【问题讨论】:

    标签: git


    【解决方案1】:

    使用 git 2.25+(2020 年第一季度)更新,正如我在“Git sparse checkout with exclusion”中提到的,您现在拥有git sparse-checkout command。

    更准确地说,如Tao 的answer 所述:

    git sparse-checkout disable

    禁用core.sparseCheckout 配置设置,并恢复工作目录以包含所有文件。
    保持稀疏签出文件完好无损,以便稍后的git sparse-checkout init 命令可以将工作目录返回到相同的状态。


    原答案:2016

    您可以看到 Roscoe A. Bartlett 的“撤消”稀疏结帐 in this script 的示例:

    git read-tree 很重要。

    echo "Undoing sparse checkout"
    
    # Get the full tree back
    echo "*" > $SC_FILE
    git config core.sparsecheckout true
    git read-tree --reset -u HEAD
    
    # Wipe out all traces of sparse checkout support
    rm $SC_FILE
    git config core.sparsecheckout false
    

    Rich Somerfield 的文章“Adventures in Git - SparseCheckouts”提出了一个类似的选项(也适用于子模块):

    echo "/*" > .git/info/sparse-checkout
    echo "/*" > .git/modules/<MODULEPATH>/info/sparse-checkout
    git read-tree -mu HEAD
    git config core.sparseCheckout false
    

    braham-snyder 添加了in the comments,可以通过以下方式更新 .git/info/sparse-checkout(用于签出和跟踪其他文件)

    git read-tree --dry-run HEAD
    

    【讨论】:

    • 经过测试,这对我来说很好。关键是发出我错过的“git read-tree -mu”。
    • FWIW:我来到这里是因为我只是想让 git 识别我对现有 .git/info/sparse-checkout 的更新(以签出和跟踪其他文件)——只运行 git read-tree --dry-run HEAD 似乎可以实现这一目标
    • @braham-snyder 好点,谢谢。我已将您的评论包含在答案中以提高知名度。
    【解决方案2】:

    虽然 VonC 的回答肯定是正确的,并且有助于解决迫在眉睫的问题,但我觉得有必要详细说明和解释根本问题。

    背景

    Git 的 sparse-checkout 使用 skip-worktree bit,它基本上告诉 git 将您工作目录中的文件视为“最新的”,无论其真实状态如何。

    当使用sparse-checkout 时,git 会将此位应用于所有与sparse-checkout 文件中描述的模式不匹配的文件。禁用sparse-checkout 或删除模式文件时,仍会设置此位并且文件不会返回。 You can read about it here.

    因此,您必须从相关文件中手动删除skip-worktree 位。最简单的方法当然是来自 VonC 的建议。

    但是为什么呢?

    这背后的原因很简单。 skip-worktree 位并非专门用于sparse-checkout,而是 git 工具包中的一个工具。其他进程使用相同的位,或者用户甚至可以使用自己的位(我个人经常使用它来在调试时忽略对配置文件的更改)。


    附注:您实际上可以通过使用git ls-files -v 获得已用skip-worktree 位标记的文件列表。这将列出版本控制下的所有文件;带有skip-worktree 位的文件以S 为前缀。

    如果您只想列出 skip-worktree 标记的文件,您可以使用以下命令轻松解析和 grep 列表:git ls-files -v | grep '^S' | cut -d' ' -f2。

    【讨论】:

    • 一开始我没有看到你的答案。 +1。很好地提到了跳过工作树位。
    【解决方案3】:

    虽然它在 git 2.27 中仍处于试验阶段,但现在有一个命令可以更透明/直观地处理这个问题:

    git sparse-checkout disable
    

    我的理解是您不必再手动设置core.sparseCheckout,应该使用这个新的git sparse-checkout 命令启用、配置和禁用它。

    https://git-scm.com/docs/git-sparse-checkout

    【讨论】:

    • 好点。赞成。我之前已经提交了git sparse-checkout(2019 年 12 月:stackoverflow.com/a/59515426/6309),但我没有更新我的答案。我已经解决了这个问题,并在我的参考了你自己的答案。
    猜你喜欢
    • 1970-01-01
    • 2017-08-31
    • 2015-04-29
    • 2013-01-02
    • 2020-11-23
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多