我有一个 gitignore 文件,它使 git 忽略*.dll
文件,这实际上是我想要的行为。但是,如果我想要一个例外(即能够提交foo.dll
),我该如何实现呢?
11 回答
采用:
*.dll #Exclude all dlls
!foo.dll #Except for foo.dll
一个可选的前缀!这否定了模式;任何被先前模式排除的匹配文件都将再次包含在内。如果否定模式匹配,这将覆盖较低优先级的模式源。
如果你写,Git 会忽略文件夹:
/js
但如果你这样做,它不能添加例外:
!/js/jquery
或!/js/jquery/
或!/js/jquery/*
你必须写:
/js/*
只有这样你才能排除这样的子文件夹
!/js/jquery
你可以简单地git add -f path/to/foo.dll
。
.gitignore
只忽略通常跟踪的文件和类似的东西git add .
要排除目录中的所有内容,但某些子目录,请执行以下操作:
wp-content/*
!wp-content/plugins/
!wp-content/themes/
只需!
在排除规则之前添加。
模式具有以下格式:
...
- 一个可选的前缀!这否定了模式;任何被先前模式排除的匹配文件都将再次包含在内。如果否定模式匹配,这将覆盖较低优先级的模式源。
!foo.dll
在 .gitignore 中,或(每次!)git add -f foo.dll
如果您正在使用 Visual Studio 并且您的 .dll 恰好位于一个bin
文件夹中,那么您需要为特定的 bin 文件夹本身添加一个例外,然后才能为 .dll 文件添加例外。例如
!SourceCode/Solution/Project/bin
!SourceCode/Solution/Project/bin/My.dll
这是因为默认的 Visual Studio.gitignore
文件包含一个忽略模式[Bbin]/
此模式正在删除所有 bin 文件夹(以及它们的内容),这使得任何包含内容的尝试都是多余的(因为文件夹本身已被忽略)。
我能够通过运行找到为什么我的文件没有被排除在外
git check-ignore -v -- SourceCode/Solution/Project/bin/My.dll
从 Git Bash 窗口。这返回了[Bbin]/
模式。
解决方案取决于 git ignore 规则和异常规则之间的关系:
- 同一级别的文件/文件:使用@Skilldrick 解决方案。
- 文件夹/子文件夹:使用@Matiss Jurgelis 解决方案。
不同级别的文件/文件或文件/子文件夹:您可以这样做:
*.suo *.user *.userosscache *.sln.docstates # ... # Exceptions for entire subfolders !SetupFiles/elasticsearch-5.0.0/**/* !SetupFiles/filebeat-5.0.0-windows-x86_64/**/* # Exceptions for files in different levels !SetupFiles/kibana-5.0.0-windows-x86/**/*.suo !SetupFiles/logstash-5.0.0/**/*.suo
从 Git 2.7.0 开始,Git 会考虑异常。来自官方发布说明:
- 允许后面的 "!/abc/def" 覆盖出现在同一个 .gitignore 文件中的较早的 "/abc",以便更容易表达“/abc 目录中的所有内容都被忽略,除了 ...”。
https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.7.0.txt
编辑:显然这不再适用于 Git 2.8.0
我就是这样做的,每个目录中都有一个 README.md 文件:
/data/*
!/data/README.md
!/data/input/
/data/input/*
!/data/input/README.md
!/data/output/
/data/output/*
!/data/output/README.md
如果您有一个目录并且想要忽略除某些文件(例如*.py
文件)之外的所有内容,您可以执行以下操作:
sub-dir/**/*.*
!sub-dir/**/*.py