【问题标题】:How to delete many files of same format from git history如何从 git 历史记录中删除许多相同格式的文件
【发布时间】:2021-10-02 17:55:04
【问题描述】:

我需要从 git 历史记录中删除许多文档文件,例如 *.html 文件

这些 HTML 文件经过多年的开发,导致 git repo 变得臃肿。现在每次都检查 10 多个 GB 是很困难的。

我能够使用互联网上的脚本找出导致这种膨胀的原因是哪些文件格式,例如

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
  sed -n 's/^blob //p' |
  sort --numeric-sort --key=2 |
  cut -c 1-12,41- |
  $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest**

关于使用 grep 分离文档文件格式。我走到了死胡同。

【问题讨论】:

    标签: git git-history


    【解决方案1】:

    您可以使用第三方工具git filter-repo(需要python)和callbacks

    特别是文件名回调。

    • 返回None 表示应从所有提交中删除该文件,
    • 返回未修改的文件名标记要保留的文件,并且
    • 返回不同的名称意味着文件应该被重命名。

    一个例子:

    git-filter-repo --filename-callback '
      if b"/src/" in filename:
        # Remove all files with a directory named "src" in their path
        # (except when "src" appears at the toplevel).
        return None
      elif filename.startswith(b"tools/"):
        # Rename tools/ -> scripts/misc/
        return b"scripts/misc/" + filename[6:]
      else:
        # Keep the filename and do not rename it
        return filename
      '
    

    如果您需要查看这些文件内容(例如,gnumfmt),则需要一个 bob 回调:

    git filter-repo --blob-callback '
      if len(blob.data) > 25:
        # Mark this blob for removal from all commits
        blob.skip()
      else:
        blob.data = blob.data.replace(b"Hello", b"Goodbye")
      '
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2014-06-19
      • 2020-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-17
      相关资源
      最近更新 更多