协慌网

登录 贡献 社区

Make .gitignore 会忽略除少数文件之外的所有内容

我知道. gitignore 文件隐藏了 Git 版本控制中指定的文件。我有一个项目(LaTeX),它在运行时会生成许多额外的文件(.auth,.dvi,.pdf,日志等),但我不希望这些文件被跟踪。

我知道我可以(也许应该)这样做所有这些文件放在项目中的一个单独的子文件夹中,因为我可以忽略该文件夹。

但是,有没有可行的方法将输出文件保存在项目树的根目录中,并使用. gitignore 忽略除了我用 Git 跟踪的文件之外的所有内容?就像是

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

答案

一个可选的前缀!否定了这种模式; 之前模式排除的任何匹配文件将再次包含在内。如果否定模式匹配,则将覆盖较低优先级模式源。

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

如果要忽略除了其中一个文件的目录的整个内容,可以为文件路径中的每个目录编写一对规则。例如. gitignore 忽略 pippo 文件夹,除了 pippo / pluto / paperino.xml

的. gitignore

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

在大多数情况下,您希望使用/*而不是**/

使用*是有效的,但它以递归方式工作。从那时起它不会查看目录。人们建议再次使用!*/将目录列入白名单,但实际上最好用/*将最高级别文件夹列入黑名单

# Blacklist files/folders in same directory as the .gitignore file
/*

# Whitelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Whitelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

上面的代码将忽略除.gitignoreREADME.mdfolder/a/file.txtfolder/a/b1/folder/a/b2/以及最后两个文件夹中包含的所有内容之外的所有文件。 (并且.DS_Store*.log文件将在这些文件夹中被忽略。)

显然我也可以做!/folder!/.gitignore

更多信息: http//git-scm.com/docs/gitignore