启用后如何禁用稀疏结账?

时间:2016-03-23 23:42:24

标签: git

我启用了稀疏结帐

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

Git只检查了我的资产文件夹

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

1)首先我禁用了配置

git config --global core.sparseCheckout false

2)删除.git / info / sparse-checkout

中的条目

但git没有为我检查任何其他文件夹/文件,似乎它正在粘贴'assets'文件夹。

有人能告诉我如何在不创建新回购的情况下重置/禁用此稀疏结账。?

3 个答案:

答案 0 :(得分:14)

您可以看到&#34;撤消&#34;的示例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

文章&#34; Adventures in Git - SparseCheckouts&#34; Rich Somerfield提出了一个类似的选项(对子模块也有效):

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 更新 a .git/info/sparse-checkout(以结帐和跟踪其他文件)可以通过

实现
git read-tree --dry-run HEAD

答案 1 :(得分:10)

虽然VonC的答案肯定是正确的,并且有助于解决即将发生的问题,但我觉得有必要详细说明并解释潜在的问题。

背景

Git&#39; sparse-checkout使用skip-worktree bit,它基本上告诉git将您工作目录中的文件视为&#34;最新&#34;,无论真实的状态。

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

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

但为什么?

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

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

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

答案 2 :(得分:1)

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

git sparse-checkout disable

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

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