假设你从一段历史开始
$ git lola --name-status
* e709131 (HEAD, master) 酒吧
| 一间酒吧
* 61493ac ABC/文件 - 3.ext
| ABC/文件 - 3.ext
* 34cce9e ABC/文件 - 2.ext
| ABC/文件 - 2.ext
* 115e6d5 ABC/文件 - 1.ext
| ABC/文件 - 1.ext
* 5ea5b42 富
一个富
注意:git lola是一个非标准但非常有用的别名。
git rm
支持删除子树的选项。
-r
给定前导目录名称时允许递归删除。
运行后
$ git filter-branch --index-filter 'git rm --cached -r --ignore-unmatch ABC' \
--prune-empty --tag-name-filter cat -- --all
你会看到类似的输出
重写 115e6d5cd06565ca08f1e5c98c4b91246cf59fa1 (2/5)rm 'ABC/file - 1.ext'
重写 34cce9e90f832460137e620ebacc8a73a99e64ce (3/5)rm 'ABC/file - 1.ext'
rm 'ABC/文件 - 2.ext'
重写 61493ac3211808f34f616dbc33d51d193b3f45a3 (4/5)rm 'ABC/file - 1.ext'
rm 'ABC/文件 - 2.ext'
rm 'ABC/文件 - 3.ext'
重写 e709131f1fe6103adf37616c9fa500994aeb30d0 (5/5)rm 'ABC/file - 1.ext'
rm 'ABC/文件 - 2.ext'
rm 'ABC/文件 - 3.ext'
Ref 'refs/heads/master' 被重写
如果您对结果感到满意,请删除旧的主人
$ git update-ref -d refs/original/refs/heads/master
现在你有一段历史
$ git lola --name-status
* 19680d4 (HEAD, master) 酒吧
| 一间酒吧
* 5ea5b42 富
一个富
要回答您的第二个问题,请说您只想删除ABC/file - 2.ext
。请记住,您将需要两层引用:一层用于整个命令,另一层用于转义该命令的参数中的空格,即要删除的文件的名称。
一种方法是
$ git filter-branch --index-filter \
'git rm --cached --ignore-unmatch "ABC/file - 2.ext"' --prune-empty \
--tag-name-filter cat -- --all
注意单引号内的双引号。
如果您改为运行此命令,您的历史记录将变为
$ 混帐萝拉
* a8d1b0d (HEAD, master) 酒吧
* cff0c4e ABC/文件 - 3.ext
* 115e6d5 ABC/文件 - 1.ext
* 5ea5b42 富