Git:如何忽略/指定* checkout的文件*

时间:2011-03-31 02:03:19

标签: git

如果我不想跟踪.html文件,我可以将模式添加到.gitignore,它们将被忽略。我想知道如何进行反向 - 在结账时,我怎么能让git只检查某些类型的文件或不检查某些类型的文件?

例如,如果我不想要html文件,我可以写:

git checkout HEAD . --no .html

如果存在的话:)是否有内置的方式,或者我只需要在结账后运行其他东西?

非常感谢任何帮助。

5 个答案:

答案 0 :(得分:16)

如果要打包文件以进行部署,您可能不需要 - 或者想要 - repo本身。这正是git archive的用途。联机帮助页中的几个示例(链接):

  

git archive --format=tar --prefix=junk/ HEAD | (cd /var/tmp/ && tar xf -)

     

创建一个tar存档,其中包含当前分支上最新提交的内容,并将其解压缩到/ var / tmp / junk目录中。

     

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip > git-1.4.0.tar.gz

     

为v1.4.0版本创建压缩的tarball。

export-ignore属性的帮助下,您应该能够完全按照自己的意愿行事:

  

export-ignore

     

具有export-ignore属性的文件和目录不会添加到存档文件中。有关详细信息,请参阅gitattributes(5)

例如,要排除目录private以及文件mine.txtsecret.c,您可以放入文件.gitattributes

private/     export-ignore
secret.c     export-ignore

就像gitignore文件一样,您可以将它们放在存储库中的任何位置,并且它们将在该目录中运行,但从顶层开始是一个不错的选择。

答案 1 :(得分:8)

Git的Sparse-Checkout

如果您只想检查存储库的一部分,可以使用git的sparse-checkout选项,该选项具有强大的包含/排除规则。

以下StackOverflow问题有一些有用的说明:
GIT checkout except one folder

但作为总结:

  1. 启用sparseCheckout选项:

    git config core.sparseCheckout true
    
  2. 创建名为.git/info/sparse-checkout的文件,其中包含:

    /*
    !node_modules
    

    实际上意味着在将存储库签出到工作目录时包括除node_modules目录之外的所有内容。

答案 2 :(得分:2)

如果您只想进行一次更改(或不一致),或者只是不想将文件放入.gitignore,请执行以下操作:

  1. 隐藏要从checkout中排除的特定文件
git stash push -m "files_to_ignore" my/path/of/the/file/file.txt
  1. 按照您之前的预期进行结帐:
git checkout .
  1. 提取隐藏的内容:
git stash apply stash^{/files_to_ignore}

使用git别名的完整解决方案如下所示:

alias reset-non-dev='git stash push -m "ignore_files" MyRepo/file1.txt MyRepo/dir/file2.js MyRepo/dir/dir2/file3.cs PSOne/Startup/PSOne/Views/Login.xaml.cs ; git checkout . ; git stash apply stash^{/ignore_files} ;'

稍后,您只需将其名称放在git bash中并按Enter键即可使用该别名。

我观察到的一个好处是,通过这种方法,您可以更改文件或在真正需要时跳过它们,而不必将此类文件标记为始终被忽略。

答案 3 :(得分:1)

所以我想将没有测试文件的代码发送到生产服务器。

对我来说最简单的方法就是在解压缩档案后,用rsync --exclude 'tests'删除所有测试文件。

答案 4 :(得分:-2)

您无法在Git中检索单个提交的一部分。你要么提交,要么不做 - 没有中途步骤。

这意味着如果有一个提交添加了一堆文件,那么你可以获取所有这些文件(通过将该提交提取到本地存储库中)或者不提取任何文件(通过不提取该提交)。

可以选择你想要的git cherry-pick提交,但我怀疑在这种情况下它不会对你有所帮助。

通常一个文件应该在版本控制之下 - 我想不出有时你只想在Git中使用文件的原因。如果你的.gitignore中有东西,那么它可能是完全从存储库中删除的一个很好的候选者。 .gitignore基本上意味着“不要看这个文件,它不受版本控制”。

(如果你不介意重写你的存储库历史记录,你可以选择添加提交,然后做一个git reset --mixed HEAD^1并创建新的提交,遗漏你不想要的文件......但是不要除非你真的知道你在做什么,否则不要这样做。最好删除文件并推送一个记录删除的新提交。)

编辑:刚刚看到您关于想要部署的特定部分的评论。在这种情况下,我建议您创建一个删除无关文件的部署分支。你可以随时在主线上重新定义这个分支,每次都应该为你神奇地删除文件。