2015-11-26 72 views
8

我想结账到其他分支或以前的提交,但我想保留一个文件夹相同的文件(不签出文件夹)。GIT checkout除了一个文件夹

我希望该文件夹将显示在git status中,所以我现在可以将此文件夹添加到索引。

例如,我有一个文件夹node_modules。我希望文件夹在我的所有提交中(我知道大多数人喜欢.gitignore node_modules文件夹)。但是当我移动到其他提交或检查其他分支时,我希望git不会触及node_modules文件夹。

可能吗?

回答

14

您可以使用sparse checkout从工作树中排除node_modules目录中的已提交内容。正如文档所述:

“稀疏结帐”允许稀疏地填充工作目录。它使用skip-worktree位来告诉Git工作目录中的文件是否值得关注。

以下是您的使用方法。首先,您启用sparseCheckout选项:

git config core.sparseCheckout true 

然后,在.git/info/sparse-checkout文件中添加node_modules路径作为否定

echo -e "/*\n!node_modules" >> .git/info/sparse-checkout 

这将创建一个名为sparse-checkout包含:

/* 
!node_modules 

其中有效的意思是忽略node_modules目录当读取提交的树进入工作目录

如果以后想再次包括node_modules目录(即删除其文件的skip-worktree bit),你必须修改sparse-checkout文件只包含/* - 那就是“包括所有路径” - 和更新使用git read-tree工作目录:

echo "/*" > .git/info/sparse-checkout 
git read-tree -mu HEAD 

然后可以完全通过设置它的配置变量false禁用稀疏结帐:

git config core.sparseCheckout false 

请注意sparse checkout最初是在Git 1.7.0中引入的。

+0

谢谢!只是为了确认。如果有一天,我会从'sparse-checkout'文件中删除'node_modules',我通常可以回到过去,看看它过去包含了什么? (我读了你发送的链接,但我不明白这是什么意思'skip-worktree bit' ... – Aminadav

+0

是的,你可以。我更新了我的答案,包括如何重新引入'node_modules'目录和禁用稀疏结帐。 –

+0

非常有趣。我将不得不检查它(而不是git checkout),我需要测试它:) – Aminadav

相关问题