[英]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
文件:
.bashrc
,让我们检查一下......啊,第1行说忽略但是3说没有,所以不要忽视。 结果:不予理睬。 .config
,让我们检查一下。 第1行表示忽略,第2行表示.gitignore
,第3行表示.bashrc
,第4行表示保留.config/terminator/config
。 这不是任何一个,所以第1行适用! 结果:忽略了! 可以说,步骤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.