除一个文件夹外的GIT结帐

时间:2015-11-26 08:25:58

标签: git git-checkout

我想要结帐到其他分支或之前的提交,但我想保留一个文件夹相同的文件(不检查文件夹)。

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

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

有可能吗?

2 个答案:

答案 0 :(得分:23)

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

  

“Sparse checkout”允许稀疏地填充工作目录。它使用skip-worktree位告诉Git工作目录中的文件是否值得查看。

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

git config core.sparseCheckout true

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

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

答案 1 :(得分:0)

我从要检出的分支中检出了全部代码

# assume we want the node_modules folder on my-branch to follow us

# first checkout your code to (my-new-branch) for ex.
git checkout -b my-new-branch

# now i'm on my-new-branch (but it doesn't have the node_modules from my-branch :| )

#delete ./node_modules
rm -rf ./node_modules 

# replace it with the one on my-branch :)
git checkout my-branch -- ./node_modules 

祝你好运...