Git 查找历史上的所有二进制文件

标签 git binaryfiles

抱歉,如果这是上一个问题的重复,但我找不到我要找的东西。我正在将一个大型 cvs 代码集(20 多个具有 15 年历史的存储库 - 10-15 GB 大小)转换为 git。大部分大小是由于过去与代码一起提交的二进制文件造成的。虽然一些二进制文件是可以完全删除的文件,但最好保留其中的许多文件及其历史记录。但是,我们不希望存储库膨胀。

我们目前正计划使用 git-fat存储二进制文件,但我正在编写一个脚本来自动转换文件。我的第一步是尝试识别存储库中的所有二进制文件(包括已删除的文件)。是否有任何简单的方法来实现这一目标?感谢您的帮助

编辑

我实际上认为我找到了一个合理的方法,我只需要运行

git log --numstat <first commit hash> HEAD

这将打印出所有文件的列表,前面有两列,第一列包含对文件的更改数(我不确定它是按字节还是按行)。但重要的部分是二进制文件它是'-'。通过选择带有这个标签的行,并“唯一化”它们,我相信我得到了二进制文件的完整列表。

这个策略有什么缺陷吗?

最佳答案

长话短说;

git log --all --numstat \
    | grep '^-' \
    | cut -f3 \
    | gsed -r 's|(.*)\{(.*) => (.*)\}(.*)|\1\2\4\n\1\3\4|g' \
    | sort -u

解释:

git-log 选项 --numstat

shows number of added and deleted lines in decimal notation and pathname without abbreviation, to make it more machine friendly. For binary files, outputs two - instead of saying 0 0.

来源:https://git-scm.com/docs/git-log,强调我的

这会产生如下输出条目:

commit 0123456789012345678901234567890123456789
Author: Joe Example <jexample@domain.com>
Date:   Thu Mar 9 15:33:29 2017 +0000

    edit Dockerfile, add assets/foobar.jpg

1   1   Dockerfile
-   -   assets/foobar.jpg

grep '^-' 匹配带有前导连字符的行,cut -f3 打印第三个制表符分隔的字段,

sed -r 's|(.*)\{(.*) => (.*)\}(.*)|\1\2\4\n\1\3\4|g'

检测已移动/重命名的文件并打印源和目标;例如,它会改变这个:

path/to/{foo => bar}/my-document.pdf

为此:

path/to/foo/my-document.pdf
path/to/bar/my-document.pdf

最后,sort -u 将累积、排序和 uniquify 路径列表。

编辑:您需要安装 gnu-sed,因为默认的 sed 没有 -r 选项。最好通过 Brew 安装:brew install gnu-sed

关于Git 查找历史上的所有二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27931520/

相关文章:

ansible - 如何使用 Ansible 模块将 Base64 var 解码为二进制文件

c++ - 如何读/写二进制文件中的结构?

c++ - 如何将 vector 保存到二进制文件?

java - 更有效地存储(字符串,整数)元组并应用二分搜索

c++ - 如何通过给定的 bin 文件打开和读取 C++ 中的二进制文件?

git add 命令暂存意外的额外文件

swift - 在Xcode中,如何切换分支、 merge 变更、选择 merge 哪些变更?

git - 最佳实践 Laravel gitignore

git - 如何将 --color-words 与 git add --patch 一起使用?

git - 如何在 Visual Studio 2015 中创建新分支?