繁体   English   中英

Git忽略除特定文件之外的所有文件

[英]Git ignore all files except particular ones

我在目录中有很多文件,我不希望它们被git跟踪。 所以我想忽略除.bashrc.gitignore.config/terminator/config之外的所有文件。

我正试图在.gitignore中做这样的事情:

*
!.gitignore
!.bashrc
!.config/terminator/config

.bashrc.gitignore文件现在没有签名但仍无法获得.config/terminator/config unignored。 我怎么能用git做到这一点?

我有一个可能的解决方案但更优雅的一个没有指定子目录?

*
!.gitignore
!.bashrc
!.gitconfig

!.config/
!.config/terminator/
!.config/terminator/config

答案的短版是一旦混帐忽略了一些目录 ,它前进不费心去找这个目录 ,除非别的东西已经迫使它这样做。 1要停止这一点,你必须明确列出目录,或者你不想忽视,使用目录! 项:

*
!/.bashrc
!/.config
!.config/terminator
!.config/terminator/config
!/.gitignore

那是:

*

告诉Git: 除非被覆盖,否则忽略一切 然后最终:

!.bashrc

覆盖.bashrc的忽略规则,依此类推。 但Git所做的是它从阅读开始. 找到所有条目。 假设它按字母顺序找到它们: .bashrc.config.editorthing.gitignore.history等等; 并假设我们有你原来的.gitignore文件:

  1. 嗯,我看.bashrc ,让我们检查一下......啊,第1行说忽略但是3说没有,所以不要忽视。 结果:不予理睬。
  2. 现在我看到.config ,让我们检查一下。 第1行表示忽略,第2行表示.gitignore ,第3行表示.bashrc ,第4行表示保留.config/terminator/config 这不是任何一个,所以第1行适用! 结果:忽略了!
  3. 重复上述步骤。

可以说,步骤2中的操作是愚蠢的:如果忽略较短的.config则显然不可能应用长规则,因此.config/<something>的存在应该是未被忽略的,应该触发Git取消忽略.config 事实上,最新版本的Git试图对此更加聪明,但是旧版本没有:你必须明确地忽略.config (或/.config ,这里更好,因为我不会进入,但这就是为什么我在上面那样写的2 )。

还有一个更优雅的伎俩,但它造成的Git要慢得多,所以你可能不希望使用它。 诀窍是显式取消忽略所有目录:

*
!*/
!/.bashrc

等等。 但是现在,如果你有一个目录, a数以百万计子目录和文件的a ,Git会扫描所有a和所有的子目录,而在此之前,它会跳过它。


1 索引中包含.config中的文件会强制Git扫描.config 但是,您将遇到与.config/terminator相同的问题,除非索引包含.config/terminator中的文件。

2好的,我会稍微介绍一下。 它不适用于这种特殊情况,但假设你是在忽略.bashrc ,如果Git由于某种原因扫描a/ ,并且a/包含一个名为.bashrc的文件,Git就不会忽略a/.bashrc 但是,我们不需要.config/terminator上的前导斜杠,因为它包含一个嵌入的斜杠(一个不在末尾)。 这使得该名称上的匹配成为根,而.bashrc上的匹配是非root的,因此匹配a/.bashrc

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM