Git 忽略不需要跟踪的文件

工作经历

公司有时候把一些项目交给一些不熟悉Git的人来管理,他们从服务器下载了代码后,不去先执行Git仓库初始化,而是先去编译代码。代码编译完成之后,会生成很多中间文件(例如日志文件,临时文件等等),然后他们把代码,并且连带这些中间文件,一起提交了。我们下载了这个Git仓库代码,每交编译完成,通过Git查看状态,会发现一大堆的已修改的中间文件,非常碍眼。

正确的方式应该是下载代码后,先初始化Git仓库,把代码纳入Git管理。再编译代码,查看生成的中间文件的,创建 .gitignore 文件来忽略这些中间文件。


.gitignore 规则

.gitignore文件有以下规则

  1. 以#开关的行是注释行,它会被Git忽略 。
  2. 它使用标准的 glob 模式进行匹配,并且会递归地应用在整个工作区中。
  3. 匹配模式以 / 开头,表示匹配的是当前目录。
  4. 匹配模式以 / 结尾,表示匹配的是目录。
  5. 如果在模式前面加上感叹号,表示规则取反。

glob 模式

这些规则,就只有一个难点,什么是 glob 模式? 规则如下

  1. 星号(*)匹配零个或者多个任意字符。
  2. 问号(?)只匹配一个字符。
  3. [] 匹配括号内的任意一个字符,例如[abc] 匹配a 或 b 或 c,[a-z] 匹配所有的小写字符,[0-9] 匹配所有数字。
  4. ** 匹配任意中间目录 ,例如 a/**/c 可以匹配 a/b/c ,也可以匹配 a/b/d/c

这里的glob模式和Vim中搜索文件路径中所使用的glob模式是一样的,但是不知道与shell中的通配符是否有关系。

例子

假如现在 Git 仓库下,经过编译后,有如下的生成文件

$ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)

	dir1/world.o
	hello.o
	out/ 
	build/out/result.txt

有两个以 .o 结尾的文件,一个在当前目录下,一个在 dir1 目录下,如果我们想同时忽略这两个文件,可以在 .gitignore 中增加如下一行

# 递归整个工作区,忽略所有以 .o 结尾的文件
`*.o`

这两个中间文件不在同一个目录,为何会同时忽略?注意规则2所说的,glob 模式会递归地应用到整个工作区。

如果我们只想忽略除了 hello.o 以下的其它中间文件,那么可以使用如下命令

# 递归整个工作区,忽略所有的以 .o 结尾的文件
*.o
# 但是排除 hello.o
!hello.o

如果我们只想忽略当前目录下的 out 目录,那么添加如下一行

# 忽略当前目录下的 out 目录 
/out/

第一个 / 表示当前目录,第二个 / 表示 out 是一个目录。

在工作区中,有两个 out 目录 ,如果我们想同时忽略它们,可以添加如下一行

# 递归整个工作区,忽略所有的 out 目录
out/

/out/out/ 的区别在于,/out/ 只忽略当前目录下的 out 目录,而 /out/ 会递归忽略所有目录下 out 目录。

如果使用 ** 来忽略 build/out/result.txt,可以写成 /build/**/*.o

如果想忽略 build 目录以及子目录下的所有的 result.txt 文件,那么可以使用 **

# 忽略build目录以其子目录下的所有result.txt文件
/build/**/result.txt
### 解决 Git 忽略文件生效的问题 在使用 `.gitignore` 文件时,可能会遇到忽略规则生效的情况。以下是一些可能的原因及解决方案: 1. **文件已经被 Git 跟踪**:如果某些文件或目录已经被 Git 跟踪,则即使在 `.gitignore` 文件中添加了忽略规则,这些规则也会生效。需要先将这些文件Git 的缓存中移除,然后再重新提交更改。可以使用以下命令清除缓存并重新应用忽略规则[^1]: ```bash git rm -r --cached . git add . git commit -m "Update .gitignore" ``` 2. **.gitignore 文件位置错误**:确保 `.gitignore` 文件位于项目的根目录下,并且文件名正确(大小写敏感)。如果文件位置对或名称错误,Git 将无法识别该文件[^4]。 3. **忽略规则语法错误**:检查 `.gitignore` 文件中的规则是否符合正确的语法格式。例如,使用 `*` 表示通配符,`/` 表示目录分隔符等。如果规则语法有误,Git忽略这些规则[^5]。 4. **缓存清除**:即使更新了 `.gitignore` 文件,如果之前已经将某些文件添加到缓存中,忽略规则可能会立即生效。此时可以通过以下命令清除缓存并重新应用规则[^2]: ```bash git rm -r --cached . git add . git commit -m "Clear cache and update .gitignore" ``` 5. **文件名或路径错误**:确保 `.gitignore` 文件中指定的文件名或路径与实际文件一致。Git 对路径和文件名是区分大小写的,因此需要特别注意[^3]。 通过以上步骤,通常可以解决 `.gitignore` 文件生效的问题。如果问题仍然存在,建议仔细检查 `.gitignore` 文件的内容以及项目结构,确保所有配置正确无误。 ```python # 示例:创建一个简单的 .gitignore 文件 # 忽略所有 .log 文件 *.log # 忽略 node_modules 目录 node_modules/ # 忽略特定文件 config/database.yml ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值