Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 为什么过滤器分支上的--cached选项会从工作目录中删除文件?_Git_Git Filter Branch - Fatal编程技术网

Git 为什么过滤器分支上的--cached选项会从工作目录中删除文件?

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

我需要从旧的repo中删除一些应该被忽略的Xcode文件。所以我运行了下面的命令

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
的情况下进行扩展?