Git 为什么过滤器分支上的--cached选项会从工作目录中删除文件?
我需要从旧的repo中删除一些应该被忽略的Xcode文件。所以我运行了下面的命令Git 为什么过滤器分支上的--cached选项会从工作目录中删除文件?,git,git-filter-branch,Git,Git Filter Branch,我需要从旧的repo中删除一些应该被忽略的Xcode文件。所以我运行了下面的命令 git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD 我的理解是,添加--cached不会影响当前的工作目录,但是git也删除了那些匹配的文件。幸运的是,我有一个备份(!),但我很好奇它为什么会这样做,或者我误解了--cached的功能吗?罪魁祸首不是git rm命令。它的--ca
git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD
我的理解是,添加--cached不会影响当前的工作目录,但是git也删除了那些匹配的文件。幸运的是,我有一个备份(!),但我很好奇它为什么会这样做,或者我误解了
--cached
的功能吗?罪魁祸首不是git rm
命令。它的--cached
选项确实如您所说的那样工作。你可以很容易地在一个小的git回购中尝试
尽管手册页没有提到它,git filter branch
似乎并没有保留您的工作区域。实际上,如果您的工作区域不干净,该命令将拒绝运行,这已经是一个指示
但即使这些文件从工作区消失,它们也不会从回购协议中消失。在当前分支中,它们不再处于任何可访问的提交中。但在重写到引用名称空间refs/original/之前,筛选器分支存储是对分支的引用
使用命令gitshowref查看它
您可以签出旧版本以访问删除的文件。你可以使用命令
git cat file blob refs/original/refs/heads/master:foo
以获取文件内容而不签出(使用show ref显示的引用,foo是所需文件的名称)。有很多可能性
您可以使用
gitk--all
在重写的分支和当前分支之间导航,您将看到没有任何东西真正消失。正如您所发现的那样,git filter branch
的行为可能会令人惊讶,并且它不会保护您在运行它时免受意外后果的影响
相反,我建议使用,这是一种更简单、更快的方法,专门用于从Git历史记录中删除文件。让您的生活更轻松的一种方式是,在您最近提交的文件中添加文件
您应该遵循-但核心部分是:下载(需要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回购清理器的作者。一些无关的东西------好吧,你不能将通配符(
*
)与--索引过滤器
--至少不能不引用。由git filter branch
扩展的shell将使用工作树扩展通配符。您是否尝试在没有-f
的情况下进行扩展?