Git找到历史记录中的所有二进制文件

时间:2015-01-13 21:07:14

标签: git binaryfiles

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

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

修改

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

git log --numstat <first commit hash> HEAD

这会打印出前面有两列的所有文件的列表,第一列包含文件的更改次数(我不确定它是以字节还是行为单位)。但重要的部分是二进制文件,它是' - '。通过选择带有此标记的行,并将它们“唯一”,我相信我会获得完整的二进制文件列表。

这种策略有什么缺陷吗?

3 个答案:

答案 0 :(得分:6)

tldr;

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

说明:

git-log选项--numstat

  

显示十进制表示法中添加和删除的行数以及没有缩写的路径名,以使其更加机器友好。 对于二进制文件,输出两个 - 而不是说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

答案 1 :(得分:2)

git-fat的贡献者之一。

如果您主要关注文件的大小,而不是特定的类型,那么git-fat有一个find命令,它允许您通过a找到git存储库中的所有文件给定大小。

我目前为cyaninc's分叉做贡献,但两个版本(Jed&#39; s和Cyan&#39; s)都有find命令。

另请查看README上的追溯导入部分。两个版本也支持这一点。

答案 2 :(得分:1)

一种解决方案是遍历所有修订版,从每个修订版中获取所有文件,获取每个文件的内容,然后获取每个文件的类型,所以......

以下是如何获取所有修订的列表:

$ git rev-list HEAD
32a9b9158d73dc80b355993a5a5f8fc49ae25334
9946574838bf5f984f5f4a19b2fc524f0a60378c
3f82a5dcecde0028da21fb266c1bbd7e9ec762ec
...

以下是如何获取修订版中所有文件的列表:

$ git ls-tree -r 32a9b9158d73dc80b355993a5a5f8fc49ae25334
100644 blob dcf290b1a99a8d2535b8aa8f85702cd1b7fac6e8    .gitignore
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    README

您可以通过使用

在每个修订版中提供每个文件的blob来获取每个文件的内容
git show:
$ git show dcf290b1a99a8d2535b8aa8f85702cd1b7fac6e8
.gitignore

*.pyc
rm_pyc.sh
aima/**/*.pyc
.idea

要测试文件是否为二进制文件,您可以使用/ bin / file:

git show dcf290b1a99a8d2535b8aa8f85702cd1b7fac6e8 > file
/bin/file file
file: ASCII text