文章目录
本节所在位置:
- 活用 git stash(一)
- 保存并应用 stash(一)
- 用 git bisect 进行调试(二)
- 使用 git blame 命令(二)
- 设置彩色命令行界面(三)
- 自动补全(三)
- 让 Bash 自带状态信息(三)
- 更多别名设置(四)
- 交互式新增提交(四)
- 忽略文件(五) ✔️
- 展示与清理忽略文件(五) ✔️
11.11 忽略文件
所谓忽略文件,通常是指源码产生的编译文件、项目构建产生的内容、文件备份、本地配置等无需纳入版本管理的内容。为了避免这些文件也出现在
git status
的结果里干扰其他源码文件,可将它们添加到
.gitignore
文件。这样,工作区内凡是写入该文件的文件或路径,就都不会出现在
git status
的结果里了。
本节演示忽略文件
.gitignore
的相关操作:
# repo init
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_tips_and_tricks.git ignoredemo
$ cd ignoredemo
$ git checkout ignore
# prepare changes
$ echo"Testing"> test.txt
$ echo"Testing"> test.txt.bak
$ mkdir bin
$ touch bin/foobar
$ touch bin/frotz
接下来实测:
# check status
$ git status -s
?? test.txt
# Why only test.txt displayed? Check ignore file
$ cat .\.gitignore
*.config
*.bak
# Java files
*.class
bin/
# try adding a file ignored
$ gitadd .\bin\frotz
The following paths are ignored by one of your .gitignore files:
bin
hint: Use -fif you really want to add them.
hint: Turn this message off by running
hint: "git config advice.addIgnoredFile false"# force to add the file ignored
$ gitadd-f .\bin\frotz
$ git status -s
A bin/frotz
?? test.txt
对于已经纳入版本管理的文件,是否可以放到
.gitignore
中呢?
$ echo"foo">> .gitignore
$ echo"more testing">> foo
$ git st -s
M .gitignore
A bin/frotz
M foo
?? test.txt
可以看到,文件
foo
即使添加到忽略文件
.gitignore
中,仍旧会出现在
git status
的结果中。莫非是没有提交
.gitignore
的变更导致的吗?来验证一下:
$ gitadd foo .gitignore
$ git commit -m'Add bin/frotz with force, foo & .gitignore'[ignore ed9ff4c] Add bin/frotz with force, foo & .gitignore
3 files changed, 2 insertions(+)
create mode 100644 bin/frotz
$ git st -s
?? test.txt
# change foo to test again
$ echo"abc">> foo
$ git st -s
M foo
?? test.txt
显然,
foo
还是没被忽略。由此得出结论:已参与版本管理的文件,不可以被忽略,即便加到
.gitignore
文件也是徒劳的。
DIY 拓展:取消某个文件的 Git 版本控制
刚才的实测结果可以看到,要想取消 Git 对某个文件的版本管理,只修改.gitignore
文件是不够的。正确的做法应该是配合
git rm
命令。假如需要撤销 Git 对文件 example.txt 的版本管理,可以这样操作:
gitrm--cached example.txt git commit -m"移除 example.txt 的版本控制"
这里的
--cache
表示保留当前工作区中的 example.txt 文件,仅从 Git 仓库取消版本控制。这样本地文件就不会被误删。如果不需要保留该文件,直接使用
git rm --cached example.txt
即可。
另外,若要防止将来该文件再被加入 Git 版本控制,可以将该文件名添加到.gitignore
文件。
除了常规的
.gitignore
文件外,
git
还提供了两种方式忽略无关内容:
- 通过全局忽略文件(如
~/.gitignore_global
)忽略; - 通过
git
钩子.git/info/exclude
忽略;
若全局忽略文件不在默认位置,则需要在配置项指定具体路径:
$ git config --global core.exludesfile ~/.gitignore_global
以
git
钩子为例进行演示:
$ echo"*.test"> .git/info/exclude
$ touch test.test
$ git st -s
M foo
?? test.txt
$ ls
bin
.gitignore
bar
foo
test.test
test.txt
test.txt.bak
可见,
test.test
虽然存在工作区,但并未显示到
git status
,即忽略操作成功。
值得注意的是,后两种方法存在明显不足:因为没在
git
版本控制范围内,项目需要忽略的所有文件信息都不方便利用
git
共享。因此若想一劳永逸地忽略一个文件并让后面来的人保持一致,还是首选
.gitignore
文件。
小知识
GitHub
提供了不同语言开发项目时常见的忽略文件的内容,在创建
Git
仓库时可以方便地进行初始化设置,详见 https://github.com/github/gitignore。
11.12 展示与清理忽略文件
Git
提供的
.gitignore
文件确实方便,但如果想查看具体有哪些文件或文件夹被忽略了,应该如何操作呢?
可以使用
git clean
命令:
# repo init
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_tips_and_tricks.git ignoredemo
$ cd ignoredemo
$ git checkout ignore
# prepare changes
$ echo"Testing"> test.txt
$ echo"Testing"> test.txt.bak
$ mkdir bin
$ touch bin/foobar
$ touch bin/frotz
# list files ignored
$ git clean -Xnd
Would remove bin/
Would remove test.test
Would remove test.txt.bak
正常情况下,
git clean
会从工作区删除未被管理的文件或文件夹。但加上参数
-n
后则只会显示相关文件,不会实际删除。上例中的:
-X
表示仅删除被Git
设置忽略的文件;-d
表示除了删除未被管理的文件外,还要删除未被管理的文件夹。
此外,
git ls-files
也能查看被忽略文件列表:
$ git ls-files -o-i --exclude-standard
bin/foobar
bin/frotz
test.test
test.txt.bak
其中:
-o
或--others
表示列出未被管理的内容;-i
或--ignored
表示列出被设置为忽略的内容;--exclude-standard
表示包括.git/info/exclude
、.gitignore
、以及全局忽略文件中设置的忽略规则。
发散
如果确实想删除被忽略的文件,则使用如下命令:
$ git clean -Xfd
Removing bin/
Removing test.test
Removing test.txt.bak
其中的
-f
表示强制执行(
forced
);
如果想同时删除被忽略文件(
ignored files
)及未追踪文件(
untracked files
),则使用:
git clean -xfd
Removing bin/
Removing test.txt
Removing test.txt.bak
这里的
-x
是小写,表示
Git
的忽略规则不生效,即删除所有未被
git
托管的项目内容(被忽略文件及未追踪文件)。
专栏收尾
至此,本专栏《Git Version Control Cookbook》第 2 版的自学笔记就全部分享完毕了。虽然原书还有第 12 章的内容,但更多是对 GitHub 的网页操作,涉及 Git 命令的知识点并不多,况且介绍的方法都是六年前的网站功能了,因此相关内容及实测情况不收录进本专栏。
Git 的学习并没有结束,需要平时多思多练,在实践中不断完善自己的知识体系。祝大家学有所成,早日拿下 Git 命令这块看似很难的硬骨头!
版权归原作者 安冬的码畜日常 所有, 如有侵权,请联系我们删除。