19

Git Repo,有一个包含三个文件的文件夹,名称中ABC都有空格, 和. 我想删除文件夹和文件。我只知道如何通过此命令删除文件file - 1.extfile - 2.extfile - 3.ext

git filter-branch \
  --index-filter 'git rm --cached --ignore-unmatch FILE' \
  --prune-empty --tag-name-filter cat -- --all

那么你git push origin master --force

(1) 但是如何ABC从所有以前的提交中删除文件夹及其文件?

此外,这些文件的名称中有空格,并且以下内容未在 repo 提交中检测到它们:

git filter-branch \
  --index-filter 'git rm --cached --ignore-unmatch file\ -\ 1.ext' \
  --prune-empty --tag-name-filter cat -- --all

(2) 删除名称中带有空格的文件的语法应该是什么?笔记

  • 操作系统
  • github
4

2 回答 2

28

假设你从一段历史开始

$ 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 富
于 2012-12-21T14:49:26.053 回答
14

而不是使用--index-filter,尝试使用--tree-filter

--tree-filter <command>
    This is the filter for rewriting the tree and its contents. The argument is
    evaluated in shell with the working directory set to the root of the
    checked out tree. The new tree is then used as-is
    (new files are auto-added, disappeared files are auto-removed -
    neither .gitignore files nor any other ignore rules HAVE ANY EFFECT!).

命令行:

git filter-branch --tree-filter 'rm -rf path/to/ABC' \
  --prune-empty --tag-name-filter cat -- --all
于 2012-12-21T12:54:42.290 回答