【问题标题】:Why did --cached option on filter-branch remove files from working directory?为什么过滤器分支上的 --cached 选项从工作目录中删除文件?
【发布时间】:2011-08-07 10:12:37
【问题描述】:

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

git filter-branch --index-filter 'git rm -f --cached --ignore-unmatch *mode1v3 *pbxuser' HEAD

我的理解是添加 --cached 不会影响当前工作目录,但是 git 也删除了那些匹配的文件。幸运的是我有一个备份(!),但我很好奇它为什么会这样,还是我误解了 --cached 的作用?

【问题讨论】:

  • 一些不相关的东西-----afaik,你不能在--index-filter 中使用通配符(*)——至少在没有引用的情况下不能。 git filter-branch 扩展的 shell 将使用工作树扩展通配符。
  • 你试过没有-f吗?

标签: git git-filter-branch


【解决方案1】:

罪魁祸首不是git rm 命令。它的--cached 选项确实如您所说。你可以在一个小的 git repo 中轻松尝试。

尽管手册页没有提及,git filter-branch 似乎并没有保留您的工作区。实际上,如果您的工作区域不干净,该命令将拒绝运行,这已经是一个迹象。

但是即使文件从工作区中消失了,它们也不会从 repo 中消失。它们只是不再存在于您当前分支中可访问的任何提交中。但是 filter-branch 存储在重写为引用命名空间 refs/original/ 之前是对您的分支的引用。

使用命令git show-ref查看。

您可以查看旧版本以访问已删除的文件。你可以使用命令 git cat-file blob refs/original/refs/heads/master:foo 无需签出即可获取文件的内容(使用 show-ref 显示的引用,foo 是所需文件的名称)。有很多可能性

您可以使用gitk --all 浏览您重写的分支和当前分支,您会发现实际上什么都没有。

【讨论】:

    【解决方案2】:

    git-filter-branch 的行为可能令人惊讶,正如您所发现的那样 - 它不会在您运行它时保护您免受意外后果。

    相反,我建议使用BFG Repo-Cleaner,这是一种更简单、更快的替代方案,专为从 Git 历史记录中删除文件而设计。它让您的生活在这里变得更轻松的一种方式是它will not delete, or change in any way,文件在您的最新提交中

    您应该遵循usage instructions - 但核心位是这样的:下载BFG's 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 的作者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-16
      • 2019-08-22
      • 1970-01-01
      • 2017-05-20
      • 1970-01-01
      • 2013-01-15
      • 2020-06-09
      相关资源
      最近更新 更多