1

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

$ 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 查看对象的所有文件路径,这样我就不必像这样在历史记录中迭代路径/名称更改?

4

1 回答 1

0

一个不太令人满意的方法是git ls-tree -r在你的 repo 中运行所有提交,并 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 } }'

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

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


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

于 2020-12-03T23:51:40.943 回答