显示git';提交前压缩的提交大小

显示git';提交前压缩的提交大小,git,Git,动机:我花了相当多的时间跳转,以保持我的git存储库干净小巧。这意味着避免使用二进制文件和图像,更喜欢下载/生成脚本而不是原始数据,等等。在应用提交之前,有一个工具可以帮助我了解提交的实际影响,这对我来说非常有用 我的问题有两个部分:规模和整合 大小:在提交git之前,如何确定git提交的影响?我已经找到了一些解决“尺寸”问题的方法,但这些方法并没有真正回答我的问题 -最重要的答案不是提供实际的命令或脚本,而是关注网络带宽。第二个解决方案不起作用 -已接受答案中链接的脚本只查看新文件。如果我修改

动机:我花了相当多的时间跳转,以保持我的git存储库干净小巧。这意味着避免使用二进制文件和图像,更喜欢下载/生成脚本而不是原始数据,等等。在应用提交之前,有一个工具可以帮助我了解提交的实际影响,这对我来说非常有用

我的问题有两个部分:规模和整合

  • 大小:在提交git之前,如何确定git提交的影响?我已经找到了一些解决“尺寸”问题的方法,但这些方法并没有真正回答我的问题

  • -最重要的答案不是提供实际的命令或脚本,而是关注网络带宽。第二个解决方案不起作用
  • -已接受答案中链接的脚本只查看新文件。如果我修改了现有的文件怎么办
  • -脚本不起作用。例如,使用此脚本,我最近的提交是0字节。这不可能是真的,因为我修改了一个文件,所以在我的git历史记录中有一些大小不为零的记录确切地说明了文件是如何被修改的
  • 我真正想要的是一个脚本,它告诉我:如果在我添加、提交和推送之前,我在git服务器上的存储库大小是
    S1
    ,在我添加、提交和推送之后,我如何在添加、提交和推送之前计算出
    X=S2-S1

  • 集成:如何最好地将此大小计算集成到我的标准git流中?理想情况下,我希望无论何时运行
    git status
    ,都能向我显示这个提交大小
    X
    。例如(见“影响”):
  • 我可以看出,如果不编辑二进制文件,这是不可能的——如果是这样的话,那么只需要手动运行一个脚本就可以了。

    编写一个脚本。(批处理、shell、python等)

  • git隐藏

  • 计算本地repo的总大小(递归检查所有目录中的所有文件,使用操作系统的API获取文件大小),并将其分配给变量。 记住跳过.git文件夹

  • git隐藏流行音乐--索引

  • 用前面的变量减去新的文件大小,然后打印差值

  • git状态
    。如果使用编程语言,则可以将
    git status
    (在Java中,
    ProcessBuilder.getInputStream()
    )的输出转换为字符串,然后使用步骤4中的数据将字符串格式化为所需的格式

  • 然后,您只需在推之前运行该程序/脚本

    编辑
    要获得压缩大小,看起来更简单、更可靠的方法是只检查服务器大小,
    git push
    ,再次检查服务器大小,然后
    git reset--soft HEAD~
    。如果您使用的是Github,那么可以通过API获得大小。例如,根据我对Git工作原理的了解,我不相信这个问题是可以解决的。“实际影响”取决于太多的因素。Git的压缩并不能仅从相邻的历史记录中找到重复项。请查看
    Git重新打包--help
    。大小的最终结果取决于传递给它的选项,以及存储库本身中的对象。在提交时,无法预测命令将如何在远程设备上运行以及远程设备有哪些对象可用于增量压缩。如果你想要的只是一个粗略的估计,我想你可以在做出承诺后重新打包。这是一个聪明的主意。谢谢这有点不太理想,因为它会改变暂存文件以及递归读取造成的时间复杂性。不过,如果没有更直接的可用文件,我可能会继续这样做。
    git stash pop--index
    将重新暂存以前暂存的文件。编辑并在步骤5中添加,以完全实现您想要的。递归并不意味着它很慢,它只是简单地搜索嵌套很深的文件夹。您也可以使用循环——尽管在算法方面稍微复杂一些。您也应该忽略.git文件夹。计算总文件大小需要不到1ms的时间。这与Git存储的压缩大小有什么关系?@Andrew C如果你读到这个问题,他实际上不是在谈论.Git中的内容,他只想知道一个新的提交将向他的远程设备添加多少字节。您推送到远程设备的唯一内容是在.git目录中。您所说的是工作目录的未压缩大小,他在问题中没有提到。 $ git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: Impact: 1234 bytes (use "git reset HEAD ..." to unstage)

    new file:   new_file_1.png
    new file:   new_file_2.sh
    new file:   new_file_3.cpp