关于 Git 忽略文件

这两天把毕设拉到 Mac 上想解决一下闪退的问题,修改完提交的时候发现出现了一个 .DS_Store 文件,这个 .DS_Store 是 Mac OS 保存文件夹的自定义属性的隐藏文件,如文件的图标位置或背景色,相当于 Windows 的 desktop.ini,而我并不想把这个多余的东西提交上去,上网看了下,附上两条命令便于查阅:

  1. 禁止 .DS_store 生成:打开“终端” ,复制黏贴下面的命令,回车执行,重启 Mac 即可生效
    1
    defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool TRUE
  2. 恢复 .DS_store 生成:
    1
    defaults delete com.apple.desktopservices DSDontWriteNetworkStores

但是我只是不想把它传上去而已,不至于禁止它生成,所以按往常一样写一个 .gitignore 文件就好,操作如下:

  1. 创建 .gitignore 文件:
    1
    touch .gitignore
  2. 编辑 .gitignore 文件:
    1
    vim .gitignore
  3. 补充 .gitignore 的内容,按规则填写想要忽略的文件:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    bin
    .idea/
    *.iml
    *.classes
    *.jar
    *.war
    *.ear
    target
    .settings
    .classpath
    .project
    .metadata/
    classes/
    logs/
    *.log
    rebel.xml
  4. 保存 .gitignore 并退出编辑: 按 ESC 键,并输入以下命令,完成操作
    1
    :wq
    要忽略的文件少的时候,还可以自己来填写 .gitignore 的内容,但是当项目复杂了大了的时候,总不能每次都自己去想要忽略些什么,于是 github 官方整理了一些 .gitignore 对应不同开发场景的范例,可以点击这里跳转查看,找到想要的,直接 copy 下来改个名字扔进工作空间里就可以了

点开一个 Android 的来看看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Built application files
*.apk
*.ap_
*.aab

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
bin/
gen/
out/

# Gradle files
.gradle/
build/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
.navigation/

# Android Studio captures folder
captures/

# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches

# Keystore files
# Uncomment the following lines if you do not want to check your keystore files in.
#*.jks
#*.keystore

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild

# Google Services (e.g. APIs or Firebase)
google-services.json

# Freeline
freeline.py
freeline/
freeline_project_description.json

# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md

可以看到,按照官方的建议,忽略了一些编译生成的文件,一些本地的配置,还有日志等等,那么如果真的要我们自己编写 .gitignore,我们应该遵循什么样的规则呢,想把忽略掉的文件强行add又要怎么做呢,更加详尽的说明如下,原文地址

Git Ignore

1.WHY?

当你使用 git add . 的时候有没有遇到把你不想提交的文件也添加到了缓存中去?比如项目的本地配置信息,如果你上传到 Git 中去其他人 pull 下来的时候就会和他本地的配置有冲突,所以这样的个性化配置文件我们一般不把它推送到 git 服务器中,但是又为了偷懒每次添加缓存的时候都想用 git add . 而不是手动一个一个文件添加,该怎么办呢?很简单,git 为我们提供了一个 .gitignore 文件只要在这个文件中申明那些文件你不希望添加到 git 中去,这样当你使用 git add . 的时候这些文件就会被自动忽略掉。

2.忽略文件的原则

  • 忽略操作系统自动生成的文件,比如缩略图等;
  • 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动生成的,那自动生成的文件就没必要放进版本库,比如 Java 编译产生的 .class 文件;
  • 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。

3.使用方法

首先,在你的工作区新建一个名称为 .gitignore 的文件。
然后,把要忽略的文件名填进去,Git 就会自动忽略这些文件。
不需要从头写 .gitignore 文件,GitHub 已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览,上面已经附上链接直接跳转

4.栗子

比如你的项目是 java 项目,.java 文件编译后会生成 .class 文件,这些文件多数情况下是不想被传到仓库中的文件。这时候你可以直接使用 github 的 Java .gitignore 文件模板将这些忽略文件信息复制到你的 .gitignore 文件中去:

1
2
3
4
5
6
7
8
9
10
11
12
*.class

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.ear

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

可以看到 github 为我们提供了最流行的 .gitignore 文件配置,保存 .ignore 文件后我们查看下 git status,检查下是否还有我们不需要的文件会被添加到 git 中去:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ git status
On branch master

Initial commit

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: .gitignore
new file: HelloWorld.java

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

Config.ini

比如我的项目目录下有一个 Config.ini 文件,这个是个本地配置文件我不希望上传到 git 中去,我们可以在 gitignore 文件中添加这样的配置:

1
Config.ini

或者你想忽略所有的 .ini 文件你可以这样写:

1
*.ini

如果有些文件已经被你忽略了,当你使用 git add 时是无法添加的,比如我忽略了 *.class,现在我想把 HelloWorld.class 添加到 git 中去:

1
2
3
4
$ git add HelloWorld.class
The following paths are ignored by one of your .gitignore files:
HelloWorld.class
Use -f if you really want to add them.

git 会提示我们这个文件已经被我们忽略了,需要加上 -f 参数才能强制添加到 git 中去:

1
2
3
4
5
6
7
8
9
10
11
$ git status
On branch master

Initial commit

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: .gitignore
new file: HelloWorld.class
new file: HelloWorld.java

这样就能强制添加到缓存中去了。
如果我们意外的将想要忽略的文件添加到缓存中去了,我们可以使用 rm 命令将其从中移除:

1
2
$ git rm HelloWorld.class --cached
rm 'HelloWorld.class'

如果你已经把不想上传的文件上传到了 git 仓库,那么你必须先从远程仓库删了它,我们可以从远程仓库直接删除然后 pull 代码到本地仓库这些文件就会被删除,或者从本地删除这些文件并且在 .gitignore 文件中添加这些你想忽略的文件,然后再 push 到远程仓库。

5.查看 gitignore 规则

如果你发现 .gitignore 写得有问题,需要找出来到底哪个规则写错了,可以用 git check-ignore 命令检查:

1
2
$ git check-ignore -v HelloWorld.class
.gitignore:1:*.class HelloWorld.class

可以看到 HelloWorld.class 匹配到了我们的第一条 *.class 的忽略规则所以文件被忽略了

6.忽略规则文件语法

a.忽略指定文件/目录

1
2
3
4
5
6
# 忽略指定文件
HelloWrold.class

# 忽略指定文件夹
bin/
bin/gen/

b.通配符忽略规则

通配符规则如下:

1
2
3
4
5
6
7
8
# 忽略.class的所有文件
*.class

# 忽略名称中末尾为ignore的文件夹
*ignore/

# 忽略名称中间包含ignore的文件夹
*ignore*/

7.不生效问题

先把本地缓存删除(改变成未track状态),然后再提交

1
2
3
git rm -r --cached .
git add .
# 然后再提交

关于 Git 忽略文件
https://enderhoshi.github.io/2018/11/28/关于 Git 忽略文件/
作者
HoshIlIlI
发布于
2018年11月28日
许可协议