Git 的个人规则忽略
还可以在 .git/info/exclude 的特殊文件中为特定存储库定义个人忽略模式。
这是一个包含仅对我们有益的模式的合适位置,因为这些模式既没有版本化,也没有随存储库一起分发。
说明
在工作副本中,文件对 Git 可见,为以下之一:已跟踪、未跟踪和忽略。
忽略的文件是 Git 被告知要忽略的文件。
它们被认为是构建工件。
如果要提交这些文件,首先它们必须从存储库源中派生。
Git 忽略文件的一些示例如下所示:
- 在运行时生成的文件(例如 .log、.lock),
- 隐藏的系统文件 (.DS_Store,Thumbs.db),
- 编译后的代码(.o、.class)等等。
隐藏一个被忽略的文件
git stash 命令获取未提交的暂存和未暂存更改,将它们保存以供进一步使用,然后从工作副本中返回它们。
默认情况下,它会忽略被忽略的文件并仅隐藏 Git 跟踪的更改。
但是 --all 选项将使此命令隐藏对被忽略和未跟踪的文件的更改。
全局 Git 忽略规则
我们可以定义 Git core.excludesFile 属性,以另外为本地系统上的所有存储库指定全局 Git 忽略模式。
这个文件将由你自己创建。
我们可以将全局 .gitignore 文件放在主目录中以轻松找到它。
创建文件后,使用 git config 命令配置其位置,如下所示:
touch ~/.gitignore git config --global core.excludesFile ~/.gitignore
Git 忽略模式
Git 忽略文件位于名为 .gitignore 的文件中。
它们是手动编辑和提交的,因为 git ignore 命令不存在。
Git 忽略文件包含与文件名匹配的模式,借助这些模式,我们可以决定是否忽略每个文件。
这些模式是在几个符号的帮助下创建的:
Pattern | 解释 |
---|---|
**/logs | 双星号用于匹配存储库中任何位置的目录 |
**/logs/debug.log | 双星号用于基于其名称和父目录的名称匹配文件。 |
*.log | 星号匹配零个或者多个字符。 |
*.log !important.log | 感叹号否定模式。如果它不仅与模式匹配,则该文件不会被忽略,而且何时匹配稍后为文件定义为文件。 |
*.log !important/.log trace. | 任何先前否定的文件将通过在否定模式后定义的模式重新忽略。 |
/debug.log | 斜杠仅在存储库根中匹配文件。 |
debug.log | 默认情况下,模式匹配任何目录中的文件。 |
debug?.log | 问号匹配一个角色。 |
debug[0-9].log | 方括号用于匹配特定范围的单个字符。 |
debug[01].log | 方括号匹配单个字符,形成特定的集合。 |
debug[!01].log | 感叹号用于匹配除特定集中之外的任何字符。 |
debug[a-z].log | 范围可以是数字或者字母。 |
logs | 如果它不与斜杠一起使用,则该模式将匹配该名称的文件和目录的内容。 |
logs/ | 使用斜杠指向模式是目录。任何目录的整个目录中的内容都与其中的文件和子目录匹配的名称将被Git忽略该名称。 |
logs/**/debug.log | 双星形磁盘匹配零个或者多个目录。 |
logs/*day/debug.log | 星号也可以在目录名中使用。 |
这是具有以下模式之一的示例:
debug0.log debug1.log #but not debug10.log
调试 .gitignore 文件
对于复杂的 .gitignore 模式,或者多个 .gitignore 文件中的模式,可能很难找出特定文件被忽略的原因。
带有 -v(或者 --verbose)选项的 git check-ignore 命令确定哪个模式导致特定文件被忽略:
git check-ignore -v debug.log #.gitignore:3:*.log debug.log
这是输出:
<file containing the pattern> : <line number of the pattern> : <pattern> <file name>
忽略先前提交的文件
对于忽略先前已提交的文件,应将其从存储库中删除。
然后你应该为它添加一个 .gitignore 规则。
在 git rm 的 --cached 选项的帮助下,该文件将从 repo 中删除,但将作为忽略文件保留在工作目录中。
但是,如果我们也希望将其从工作目录中删除,只需省略 --cached 选项。
echo debug.log >> .gitignore git rm --cached debug.log #rm 'debug.log' git commit -m "Start ignoring debug.log"
存储库中共享的 .gitignore 文件
我们可以在存储库的不同目录中定义多个 .gitignore 文件。
每个模式都相对于包含该文件的目录进行测试。
但是,最简单的方法是在存储库的根目录下定义单个 .gitignore 文件。
当 .gitignore 文件被签入时,在存储库中,它会像其他文件一样进行版本控制,并在我们推送时与团队共享。
我们应该只在 .gitignore 中包含模式以使存储库的其他用户受益。
提交一个被忽略的文件
可以使用 -f(或者 --force)选项和 git add 组合将被忽略的文件提交到存储库。
但是,如果我们有通用模式(例如 *.log),但我们想提交特定文件,请选择这种方式:
cat .gitignore # *.log git add -f debug.log git commit -m "Force adding debug.log"
如果没有,最简单的方法是为一般规则设置例外:
echo !debug.log >> .gitignore cat .gitignore #*.log #!debug.log git add debug.log git commit -m "Adding debug.log"