前言

git clean用于清除没有加入到git版本库的文件和目录,如果加入到git版本库里的话,我们就无法使用git clean 清除,必须还原到未跟踪(Untracked)状态才可以进行git clean清除,在我们进行git管理项目代码的时候,经常会遇到以下场景。

  1. 在项目中添加了许多测试资源,测试完成后想把它们删了。
  2. 代码回滚时,有些文件或目录回滚到了未跟踪(Untracked)状态,并需要把它们移除掉。
  3. 项目开发过程中,临时创建了很多临时文件夹和目录,在项目核心代码加入到暂存区前,需要移除无用文件。

这个时候,通过使用git clean命令来处理,就会非常容易。

命令介绍

首先,我们打开终端,简单了解一下git clean的用法

➜  ~ git clean -h
usage: git clean [-d] [-f] [-i] [-n] [-q] [-e <pattern>] [-x | -X] [--] <paths>...
    -q, --quiet           do not print names of files removed
    -n, --dry-run         dry run
    -f, --force           force
    -i, --interactive     interactive cleaning
    -d                    remove whole directories
    -e, --exclude <pattern>
                          add <pattern> to ignore rules
    -x                    remove ignored files, too
    -X                    remove only ignored files

初始化git仓库

# 创建一个测试项目
mkdir myGitTest
# 创建本地仓库
cd  myGitTest && git init
ls -a
touch log1.txt
git add .
git commit -m 'log1'
touch log2.txt
git add .
git commit -m 'log2'
mkdir log3
touch log3/log3.txt
git add .
git commit -m 'log3'
mkdir log4
touch log4/log4.txt
git add .
git commit -m 'log4'

查看删除列表

首先,我们在初始化的仓库基础上,进行如下操作

git checkout -b master
# 创建多个文件和目录
touch 1.txt
touch 2.txt
mkdir clean1
touch clean1/c1.txt

使用git status命令,查看当前分支的情况

➜  myGitTest git:(master) ✗ git status
On branch master
Untracked files:
  (use "git add <file>..." to include in what will be committed)
	.gitignore
	1.txt
	2.txt
	clean1/
nothing added to commit but untracked files present (use "git add" to track)

文件列表

执行git clean -n 查看哪些未跟踪文件将会被删除。

➜  myGitTest git:(master) ✗ git clean -n
Would remove 1.txt
Would remove 2.txt

继续操作,创建.gitignore文件,并写入如下内容

touch .gitignore
echo 'log3/' >>  .gitignore
echo 'log2.txt' >>  .gitignore
echo '1.txt' >>  .gitignore
➜  myGitTest git:(master) ✗ git clean -n 
Would remove .gitignore
Would remove 2.txt
➜  myGitTest git:(master) ✗ git clean -nx
Would remove .gitignore
Would remove 1.txt
Would remove 2.txt
➜  myGitTest git:(master) ✗ git clean -nX
Would remove 1.txt

通过以上分析,我们可以知道:

git clean -n 可以查看哪些未跟踪文件将会被删除,同时这些文件没有在.gitignore文件里进行标记。

git clean -nx查看将会被删除的所有未跟踪文件

git clean -nX只展示那些在.gitignore里标记的文件中,哪些是将要被删除的未跟踪文件

文件和目录列表

继续操作,执行如下步骤:

➜  myGitTest git:(master) ✗ git clean -nd
Would remove .gitignore
Would remove 2.txt
Would remove clean1/
➜  myGitTest git:(master) ✗ git clean -ndx
Would remove .gitignore
Would remove 1.txt
Would remove 2.txt
Would remove clean1/
➜  myGitTest git:(master) ✗ git clean -ndX
Would remove 1.txt

继续操作,在.gitignore文件,写入如下内容,并执行后续操作

echo 'clean1/' >>  .gitignore
➜  myGitTest git:(master) ✗ git clean -nd 
Would remove .gitignore
Would remove 2.txt
➜  myGitTest git:(master) ✗ git clean -ndx
Would remove .gitignore
Would remove 1.txt
Would remove 2.txt
Would remove clean1/
➜  myGitTest git:(master) ✗ git clean -ndX
Would remove 1.txt
Would remove clean1/

继续操作,修改.gitignore文件clean1/clean1/*,并执行后续操作

➜  myGitTest git:(master) ✗ git clean -nd
Would remove .gitignore
Would remove 2.txt
➜  myGitTest git:(master) ✗ git clean -ndx
Would remove .gitignore
Would remove 1.txt
Would remove 2.txt
Would remove clean1/
➜  myGitTest git:(master) ✗ git clean -ndX
Would remove 1.txt
Would remove clean1/c1.txt

git clean -nd ,可以查看哪些文件和目录将会被删除,同时这些文件和目录没有在.gitignore文件里进行标记。

git clean -nx 查看将会被删除的所有未跟踪的文件和目录

git clean -nX只展示那些在.gitignore里标记的文件和目录中,哪些是将要被删除的未跟踪文件和目录

其中,.gitignore中,如果忽略的文件目录结构是dir/*时,git clean -ndX,只删除忽略目录下的所有文件;如果忽略的文件目录结构是dir/时,git clean -ndX,删除忽略的目录。

删除文件列表

继续操作,执行如下步骤:


➜  myGitTest git:(master) ✗ git clean -nX
Would remove 1.txt
➜  myGitTest git:(master) ✗ git clean -fX
Removing 1.txt
➜  myGitTest git:(master) ✗ git clean -nX
➜  myGitTest git:(master) ✗ git clean -ndX
Would remove clean1/c1.txt
➜  myGitTest git:(master) ✗ git clean -fdX
Removing clean1/c1.txt
➜  myGitTest git:(master) ✗ git clean -ndX
➜  myGitTest git:(master) ✗ git clean -nx
Would remove .gitignore
Would remove 2.txt
➜  myGitTest git:(master) ✗ git clean -n 
Would remove .gitignore
Would remove 2.txt
➜  myGitTest git:(master) ✗ git clean -fx 
Removing .gitignore
Removing 2.txt
➜  myGitTest git:(master) git clean -n 
➜  myGitTest git:(master) git clean -nx
  • git clean -f删除.gitignore里未标记的文件

  • git clean -fx删除所有未跟踪的文件

  • git clean -fX只删除.gitignore里标记的文件

  • git clean -fd删除.gitignore里未标记文件和目录

  • git clean -fdX删除所有未跟踪的的文件和目录

  • git clean -fdX删除.gitignore里标记的文件和目录

注意事项

当执行git clean后,文件就删除了,并且找不回,所以一定要慎用

小结

git clean在开发中应该充分应用。因此请牢记以下几个组合参数:

-n,显示哪些文件会被删除,如果文件是.gitignore里标记的文件,则忽略。

-d,查找目录。

-f,删除文件。

-x,查找未跟踪(Untracked)所有文件

-X,仅查找.gitignore里标记的未跟踪(Untracked)文件

  • 查看删除列表 git clean -n组合
  • 删除列表git clean -f组合

读后有收获可以支付宝请作者喝咖啡

Git 系列教程---清除没有add的文件和目录

创作不易,未经授权禁止转载和授课!