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

2024-02-07

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

我们目前计划使用git-fat https://github.com/jedbrown/git-fat存储二进制文件,但我正在编写一个脚本来自动转换文件。我的第一步是尝试识别存储库中的所有二进制文件(包括已删除的文件)。有什么简单的方法可以实现这一点吗?感谢您的帮助

Edit

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

git log --numstat <first commit hash> HEAD

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

这个策略有什么缺陷吗?


tldr;

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

解释:

The git-log option --numstat

以十进制表示法和不带缩写的路径名显示添加和删除的行数,以使其更加机器友好。对于二进制文件,输出两个 - 而不是说 0 0.

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

这会产生如下所示的输出条目:

commit 0123456789012345678901234567890123456789
Author: Joe Example <[email protected] /cdn-cgi/l/email-protection>
Date:   Thu Mar 9 15:33:29 2017 +0000

    edit Dockerfile, add assets/foobar.jpg

1   1   Dockerfile
-   -   assets/foobar.jpg

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

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

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

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

to this:

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

最后,sort -u会进行累积、排序和uniquify https://en.wiktionary.org/wiki/uniquify路径列表。

编辑:这个答案假设存在sed支持扩展正则表达式和捕获组;例如。,https://www.gnu.org/software/sed/ https://www.gnu.org/software/sed/ .

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 哪种 git commit 实践更好?

    我坚信 对一个问题做出一次承诺是一种很好的做法 我确信我在 最佳实践 之类的文章中读过它 因此 我的工作流程如下 对于新问题 我创建了一个新的本地分支git checkout b new issue 将所有更改提交到其中 有时这涉及到lot
  • Intellij Idea可以自动阶段更改吗

    经过几天的任务处理后 我决定看看已经完成了哪些工作git status来自 Git Bash 有些文件在Changes to be committed list 有些在Changes not staged for commit 有趣的是 我
  • Git 克隆已经是克隆的存储库

    做这个手术有什么副作用吗 git clone已经是另一个远程存储库的克隆的存储库 没有副作用 但您应该准确了解克隆存储库时会发生什么 一些理论 问题 是 当您 以正常方式 克隆存储库时 即在调用时没有调整任何时髦的旋钮git clone y
  • 如何比较本地 Git 分支与其远程分支

    我怎样才能看到diff本地分支和远程分支之间 git diff
  • 从私有 GitHub 存储库迁移到公共和私有

    我使用 GitHub 上的私人存储库开发了一个客户项目 我们现在要做的就是开放其中的某一部分 并产生该项目的开源版本 我们的想法是 客户的版本将在此基础上构建 对开源版本所做的任何更改也应适用于私有版本 现在的问题是我不能将当前的 GitH
  • 改进 IntelliJ 注释(git Blame)

    我想改进 注释选项 右键单击代码行号冒号 gt 注释 它类似于 gitblame 但集成到 IntelliJ 1 这可能吗 通过插件或 IntelliJ 文件的原始修改 还有其他什么吗 2 我使用的是 Android Studio 基于 I
  • 从 master 分支部署特定功能

    假设我们使用两个分支进行开发 staging and master 在迭代期间 所有团队成员所做的所有更改都会定期合并到staging分支并出现在我们的暂存环境中 客户能够查看更改并提供反馈 在迭代结束时我们合并staging分支到mast
  • Git merge --squash 可以保留提交注释吗?

    有没有一种方法可以自动添加压缩后的所有提交注释mybranch执行时提交 git merge squash mybranch 这样单个提交包含所有提交注释的串联mybranch 我认为这就是 git merge squash 自动执行的操作
  • 仅当除 master 之外的所有分支都有推送的 TAG 时,Gitlab 才会触发 Pipeline

    我的 YAML 文件必须如何配置 以便仅在推送标签时触发一种情况 作业 构建 的管道 该标签可能位于除 master 之外的所有分支中 对于主案例 我有一个单独的工作 build master yaml 文件 问题 如果主分支获得标签 管道
  • 在“git rm -rf”之后恢复暂存但未提交的文件

    在我的本地计算机上 我从文件夹中删除了文件 git init git add all 然后我写了 不要问我为什么 git rm rf 我还没有承诺 现在我的项目中有空文件夹 在 git文件夹有objects包含 53 Mb 的文件 我怎样才
  • 为什么 iTerm2 中不显示 git 颜色

    所以我有我的 gitconfig 设置来处理颜色 在终端中它工作得很好 看起来也不错 然而 在 iTerm2 中 除非我为 git 设置反向属性 否则我的 gitconfig 根本不会显示颜色 然后它们就出现了 但是谁喜欢相反的颜色呢 为什
  • 如何恢复已删除的文件[重复]

    这个问题在这里已经有答案了 可能的重复 在 Git 存储库中恢复已删除的文件 https stackoverflow com questions 953481 restore a deleted file in a git repo 如何恢
  • 将环境变量从 fastlane 传递到 Xcode 构建阶段脚本

    是否可以 如果可以 如何 将环境变量从运行 fastlane 的脚本传递到 Xcode 运行脚本阶段 我的最终目标是在运行脚本阶段读取当前的 git 分支名称 我们的 CI 由 Team Foundation Server 运行 它执行以下
  • git checkout 裸露,并在接收后包含子模块

    如何在包含子模块的接收后挂钩中检出服务器上的裸存储库 我目前将其作为接收后挂钩 bin bash http blog ekynoxe com 2011 10 22 git post receive for multiple remote b
  • github 网络图查看器的替代品? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 当我单击 github 上的 forks 按钮时 我想获得一个摘要 这就是我使用网络图查看器获得的结果 但它并不完全理想 我会做什么ide
  • 空提交的 Git 补丁

    我创建一个空提交 git commit allow empty m something important 有时它很有用 例如协调 2 个 或更多 不同的 git 树 然而 当我 git format patch 空提交被省略 因为它们不与
  • Git:从远程获取特定对象

    在工作中我们必须应对一个非常庞大的 git 存储库 90Go 在尝试调整本地副本上的一些内容后 我的包文件出现错误 尝试解压它 我可能删除了一些目标文件 例如 gt git GC 错误 无法读取 af9ed8 snip 致命 坏树对象 af
  • 如何在cygwin下更改git中文件的大小写?

    我们在区分大小写 不敏感的混合环境 cywgin linux 中工作 今天有人通过重命名文件 将 S 更改为 s 对我们的工作流程造成了小破坏 这导致了各种有趣的跨分支合并问题 而且说实话 没有人完全确定发生了什么 在 cygwin 的 g
  • 如何在 git merge 提交中列出冲突的文件(父级都有更改的文件)?

    qgit 有一个很好的选择 可以在合并提交中查看 有趣 的文件 其中有趣的文件被定义为在两个父文件中都有更改的文件 查看此类文件的相应命令行是什么 git show name status SHA1 of merge 将向您显示提交消息和在
  • 运行 npm install - 如何配置不使用 SSH(端口被防火墙阻止)

    当我跑步时npm install大多数模块配置正确 然而 至少有人想击中ssh 拉取模块的地址 不幸的是 我的公司有一项政策 不允许内部网络之外的 SSH 连接 我收到的具体错误是 Error while executing npm ERR

随机推荐