Git杂谈——git clean

253 阅读2分钟

最近在重新把git捡起来学习一下,决定写一些文章记录一下,一来可以加深自己的印象,二来也可以和大家一起分享一下学习到的小知识。最近发现一个很好的学习git的地方不过是全英的,只能边查边看。传送门放在下面,得好好学习英语了~

Git Tutorials and Training | Atlassian Git Tutorial​www.atlassian.com/git/tutorials

git clean —— 未追踪文件清除神器

所谓未追踪文件其实就是我们在git仓库新增的还没有使用git add 添加过的文件,为了更好的说明追踪文件和未追踪文件的区别,我们看下面的代码

$ mkdir git_clean_test
$ cd git_clean_test/
$ git init .
Initialized empty Git repository in /Users/kev/code/git_clean_test/.git/
$ echo "tracked" > ./tracked_file
$ git add ./tracked_file
$ echo "untracked" > ./untracked_file
$ mkdir ./untracked_dir && touch ./untracked_dir/file
$ git status
On branch master

Initial commit

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

new file: tracked_file

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

上面的例子可以看到,我们新建了一个git_clean_test文件夹并使用git初始化了他,创建了tracked_file和untracked_file以及untracked_dir,然后使用git add 命令把tracked_file 添加进了暂存区。然后我们使用git status 查看仓库状态的时候可以看到没有被git add过的文件和文件夹都为Untracked file。

git clean 选项

--force

我们尝试使用git clean清除上面例子的未追踪文件

$ git clean fatal: clean.requireForce defaults to true and neither -i, -n, nor -f given; refusing to clean

我们发现git clean 默认的行为是拒绝清理,如果我们想要发起git clean 我们得加上--force或简写为-f,这是一个很重要的安全机制,因为git clean命令是不可逆转的,它等同于你执行 rm 命令去删除文件。所以在运行git clean之前,你最好确保你知道你在干什么。

-n

-n 选项提供"dry run"功能,当我们运行 git clean -n 时,并不会真正的执行删除,而是会先把要删除的文件先给你列出来,然后你可以先检查一下这些文件是否需要删除。在我们真正执行 git clean 之前,我们最好都执行一次"dry run"来检查我们要删除的文件,以免发生难以逆转的删除。

-f

在 --force / -f 命令后面跟上path参数可以删除指定的文件

git clean -f <path>

-d

git clean 的默认行为是不会删除目录的,如果你想把目录也删除掉你可以使用 -d 告诉 git clean 你想把文件夹也删除掉。

再回到我们最开始的例子,如果我们想把文件夹也删掉可以执行下面的代码

$ git clean -dn
Would remove untracked_dir/
$ git clean -df
Removing untracked_dir/

这里我们在执行真正的清除前,我们先使用组合选项 -dn 来运行一次"dry run",可以看到我们即将删除掉文件夹,随后我们使用 -df 选项来执行真正的清除命令。

-x

使用 -x 选项可以删除在 .gitignore 管辖范围内的文件,当我们做一些实验时,想恢复到实验前的仓库状态,这个选项就很有用了,即便是.gitignore的文件也会被清除。

交互式git clean

git clean 可以通过 -i 选项来开启interactive模式,交互模式大概长这样

$ git clean -di
Would remove the following items:
  untracked_dir/  untracked_file
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each             5: quit                 6: help
What now>

我们可以看到,交互模式会先把所有即将删除的文件先列出来,然后提供一些选项给你选择,我们可以选择 6. help 来查看每个选项具体的意义

What now> 6
clean               - start cleaning
filter by pattern   - exclude items from deletion
select by numbers   - select items to be deleted by numbers
ask each            - confirm each deletion (like "rm -i")
quit                - stop cleaning
help                - this screen
?                   - help for prompt selection

当我们选择5. quit 的时候,我们会直截了当的退出交互模式。

选择1. clean就会清除所有列出的文件

选择2. filter by pattern的话,就像下面这个例子一样,会让我们输入一个"pattern",符合这个pattern的文件不会被删除。

Would remove the following items:
  untracked_dir/  untracked_file
*** Commands ***
    1: clean                2: filter by pattern    3: select by numbers    4: ask each             5: quit                 6: help
What now> 2
  untracked_dir/  untracked_file
Input ignore patterns>> *_file
  untracked_dir/

选择3. select by numbers 可以通过输入文件序号来选择要删除的文件

选择4. ask each 的话,git clean会遍历每个要被清除的文件,你可以通过输入 y/N 来选择是否要清除对应的文件

以上就是git clean相关的知识点啦~