【Git 学习笔记_25】Git 实用冷门操作技巧(五)—— Git 忽略文件的设置

本节所在位置:

  • 活用 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
$ git add .\bin\frotz
The following paths are ignored by one of your .gitignore files:
bin
hint: Use -f if 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
$ git add -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 的变更导致的吗?来验证一下:

$ git add 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 的版本管理,可以这样操作:

git rm --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 命令这块看似很难的硬骨头!

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安冬的码畜日常

您的鼓励是我持续优质内容的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值