git - 在推送到 git remote 之前检查提交大小

标签 git github githooks

我的编辑器中有一个错误(这很可怕),有时大文件会写入工作目录。然后我做一个 git push如果不手动检查这些大的新文件,git 远程就会重载并最终出错。

是否有一些检查(可能是 git 钩子(Hook))可以用来检查我的 repo 是否超过特定大小(以 MB 为单位)?

最佳答案

当你运行 git push 时,Git 不会以任何方式使用工作树。 .具体来说,git push推送是提交,以及完成这些提交所需的任何对象(主要是其内容在提交时被卡住到提交中的文件)。 1

请注意 git commit它本身也不使用工作树:它提交索引中的任何内容(也称为暂存区域,有时也称为缓存)。这就是为什么你必须 git add提交之前的文件。 git commit 有几个选项使其自动将工作树文件复制到索引/暂存区域中这些文件的版本之上;但原则仍然存在:git commit提交索引中的内容,而不是工作树中的内容。

因此,在检测此问题的 Git 钩子(Hook)上最好的选择是预提交钩子(Hook),如 the githooks documentation 中所述。 :

pre-commit

    This hook is invoked by git commit(1), and can be bypassed with the --no-verify option. It takes no parameters, and is invoked before obtaining the proposed commit log message and making a commit. Exiting with a non-zero status from this script causes the git commit command to abort before creating a commit.


(文档还有更多内容;请点击链接查看。)

编写 Git 钩子(Hook)有点棘手(尤其是服务器端钩子(Hook)),但这个还不错:
#! /bin/sh
# pre-commit hook: check for large files
TMP=$(mktemp)
trap "rm -f $TMP" 0 1 2 3 15
MAX_FILE_SIZE=1048576 # 1 MB
status=0
git ls-files --stage > $TMP
while read mode hash stage path; do
    objsize=$(git cat-file -s $hash)
    if [ $objsize -gt $MAX_FILE_SIZE ]; then
        echo "file too big: '$path' as staged exceeds $MAX_FILE_SIZE bytes" 1>&2
        status=1
    fi
done < $TMP
exit $status

(未经测试)。您可以改为选择 pre-push 钩子(Hook),但这比适当的要晚。

1这些 Git 对象也被压缩。只要有可能,它们就会通过使用服务器上已经存在的现有先前对象进行高度压缩。因此,如果您有一个 10 GB 的文本文件,但您对其进行了一些小的更改并提交,那么推送该提交(即使它里面有一个 10 GB 的文件)占用的空间非常小,因为 Git 发送的所谓的瘦包最后说:嘿,还记得你已经拥有的 10 GB 对象吗?拿那个,从中间删除几个字节,然后用这些其他字节替换它们。

关于git - 在推送到 git remote 之前检查提交大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51315327/

相关文章:

GIT:不显示我已推送到存储库的文件

git - 连接两个 Git 存储库的历史记录?

git - 尝试推送大文件但失败,现在我什至无法推送自述文件

ruby-on-rails - Github 警告有关 Omniauth gem 的安全问题

git - 如何使用 Git 进行预 checkout

ruby - 拒绝任何包含某些文件之外的更改的原始推送

git log --numstat 有奇怪的数据

git - 在 VLC 上播放 MPEG-DASH

ios - 为什么授予权限后图库中的照片不会出现?

Git 钩子(Hook) : applying `git config core.hooksPath`