%%
# 纲要
> 主干纲要、Hint/线索/路标
# Q&A
#### 已明确
#### 待明确
> 当下仍存有的疑惑
**❓<font color="#c0504d"> 有什么问题?</font>**
# Buffer
## 闪念
> sudden idea
## 候选资料
> Read it later
%%
# .gitignore 忽略提交
作用:`.gitignore` 文件中声明忽略的文件/文件夹不会被**提交到远程仓库**。
### `.gitignore` 文件说明
- `.gitignore` 中声明的匹配模式**仅从该 `.gitignore` 所在目录开始生效**
- **项目根目录**(与`.git`文件夹同一路径)下的`.gitignore`中声明的模式会**匹配整个项目文件**
- `.gitignore` 文件中,**每行指定一个匹配模式**,从上到下依次进行。
- 因此,如果**前面的规则匹配的范围更大,先匹配上了,则后面的规则将不会生效。**
# 规则优先级
`.gitignore` 中匹配规则的优先级
Git **检查忽略规则**的时候有多个来源,其优先级如下(由高到低):
- (1)从**命令行**中读取可用的忽略规则 (`git push` 命令的附带参数)
- (2)**当前目录定义的规则** (除了在`.git`所在的整个项目下创建`.gitignore`, 还可以在项目中的任何一个子目录中创建`.gitignore`文件);
- (3)父级目录定义的规则,依次递推;
- (4)`$GIT_DIR/info/exclude` 文件中定义的规则
- (5)`core.excludesfile` 中定义的全局规则
# 规则说明
> 参见 [^1]
- **`/` 开头的模式,或者`/`出现在路径中间的模式,均表示只匹配`.gitignore` 文件所在路径下的模式**。
- a leading slash is not relevant if there is already a middle slash in the pattern.
- **`/` 结尾的模式表示只匹配文件夹,以及该文件夹路径下的所有内容,不匹配同名文件。**
- `**` 表示匹配任意中间目录
- `!` 表示不忽略指定文件。通常用在已指定某个匹配模式后(必须在此之后声明),**排除某个匹配模式下的部分特殊文件**。
- Any matching files excluded by a previous pattern will become included again.
> [!caution] **如果 ! 所指定的文件或目录的父级目录已被排除,则 ! 的声明不会生效。**
**规则示例**
| 示例 | 说明 |
| ------------------------- | ------------------------------------------------------------ |
| *. a | 忽略所有以 .a 为后缀的文件 |
| !lib. a | lib. a 文件除外, 不忽略 lib. a 文件 |
| hello.* | 忽略所有 `hello.*` 文件 |
| /hello.* | 仅忽略`.gitignore`所在目录下的`hello.*`文件, 但不包括子目录下的`hello.*`文件,即不包括`a/hello.java` |
| doc/frotz<br />/doc/frotz | 仅忽略`.gitignore` 所在目录下的路径为`doc/frotz` 的文件,而不包括`a/doc/frotz` |
| doc/frotz/ | 仅忽略`.gitignore` 所在目录下的整个 front 文件夹 |
| build/ | 忽略所有 build 文件夹, 例如当前路径下的`build` 和子目录`bc/build`文件夹。 **注: 不会忽略同名的 build 文件.** |
| /build/ | 仅忽略`.gitignore` 所在目录下的整个 build 文件夹。注:不忽略同名的 build 文件 |
| doc/*. txt | 仅忽略`.gitignore`所在目录下的`doc/*.txt`文件, 不包括 doc 子目录下的文件, 即不忽略`doc/subdir/cc.txt`,`a/doc/cc.txt` |
| a/**/b | 忽略 a/b, a/x/b, a/x/y/b,a/···/b 等文件 |
| *.[oc] | 忽略所有`.O`, `.c` 后缀的文件。 |
###### 示例
```gitignore
# 忽略项目根目录下的target文件夹 (.gitignore位于根目录)
# 三句都有效, 但第一句还会忽略同名的target文件(如果存在), 二三句完全等效,仅忽略根目录下的target文件夹, 不包含子目录下的target文件夹.
/target
/target/
target/*
# 忽略所有文件夹
*/
# 文件夹some_folder除外
!some_folder/
```
<br><br>
# .gitignore 变更无效的解决办法
现象描述:某些原先已经被 track 的文件,现希望加入到 `.gitignore` 中,今后不再对其进行跟踪,但**发现无效**。
解决方案:
![[_attachment/05-工具/git 使用/gitignore 说明.assets/IMG-gitignore 说明-CBA75D247CFDD62E1769B6D3BA9D7DBA.png|643]]
![[05-工具/git 使用/git 工作区&暂存区管理#^eo9uqt]]
<br><br>
# 参考资料
# Footnotes
[^1]: [Git忽略提交规则 - .gitignore配置运维总结 - 散尽浮华 - 博客园](https://www.cnblogs.com/kevingrace/p/5690241.html)