【问题标题】:removing files from git history that have changed name or path从 git 历史记录中删除名称或路径已更改的文件
【发布时间】:2021-03-15 19:49:00
【问题描述】:

我正在尝试识别我的项目历史记录中已删除的大文件。当我这样做时,我可以看到一个有序列表。

$ 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 42-

通常,我可以从历史记录中删除文件而不会出现这样的问题:

git filter-repo --force --invert-paths --path <path-to-file>

但是,如果一个文件在过去有不同的名称或路径,一旦我删除该文件,当我再次运行 rev-list 时,我会看到我刚刚删除的同一个文件,大小相同,但它过去的路径或名称不同。

有没有办法使用 rev-list 查看对象的所有文件路径,这样我就不必像这样在历史记录中迭代路径/名称更改?

【问题讨论】:

  • 如果我不在一开始就切断对象ID,我想我可以在过滤器回购中使用它,并杀死文件的所有化身。但是,我看不到在命令行上指定对象 id 的方法,只能使用 --strip-blobs-with-ids 从文件中加载它

标签: git git-rev-list git-filter-repo


【解决方案1】:

一种不太令人满意的方法是在你的 repo 中的所有提交上运行 git ls-tree -r,然后 grep 你正在寻找的 blob 的哈希:

git rev-list --all | xargs -L1 git ls-tree -r | grep "$hash"
# you can also replace 'xargs' with 'parallel'

# you can insert a command to avoid noisy repetitions of the same path :
... | awk '{ if (!seen[$4]++) { print $4 } }'

这个问题的答案可能会有所帮助:

如果您将 check_tree 函数的 0|1 结果替换为在树中找到 blob 的路径列表,则函数的记忆也应该可以正常工作。


请注意,您运行的git filter-repo 命令会从您的历史记录中删除位于&lt;path-to-file&gt; 的文件的任何版本,而不仅仅是当该文件的内容与您标识的blob 完全匹配时的版本。

【讨论】:

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