我需要从一个旧的仓库中删除一些本应该被忽略的Xcode文件。因此,我运行了以下命令:
git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD
我的理解是添加--cached不会影响当前工作目录,但git也删除了那些匹配的文件。幸运的是我有备份!但我很好奇为什么会这样做,或者我是否误解了--cached
的含义?
我需要从一个旧的仓库中删除一些本应该被忽略的Xcode文件。因此,我运行了以下命令:
git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD
我的理解是添加--cached不会影响当前工作目录,但git也删除了那些匹配的文件。幸运的是我有备份!但我很好奇为什么会这样做,或者我是否误解了--cached
的含义?
git-filter-branch
的行为可能会让您感到惊讶,正如您发现的那样,它在运行时不会保护您免受意外后果。
相反,我建议使用BFG Repo-Cleaner,这是一个更简单、更快速的替代方法,专门用于从Git历史记录中删除文件。其中一种使您的生活更轻松的方式是,它不会删除或以任何方式更改您最新提交的文件。
您应该遵循使用说明 - 但其核心部分只需下载BFG的jar包(需要Java 6或以上版本),然后运行此命令:
$ java -jar bfg.jar --delete-files *{mode1v3,pbxuser} my-repo.git
您的代码库历史记录中与该表达式匹配的任何文件 - 且不在您的最新提交中的文件 - 将被删除。然后,您可以使用git gc
清除无效数据:
$ git gc --prune=now --aggressive
BFG相对于git-filter-branch
来说使用起来要简单得多 - 选项是围绕这两种常见用例而设计的:
完整披露:我是BFG Repo-Cleaner的作者。
--index-filter
中使用通配符(*
) -- 至少不带引号。由git filter-branch
展开的shell会使用工作树扩展通配符。 - J-16 SDiZ-f
吗? - VonC