Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在推送到git remote之前检查提交大小_Git_Github_Githooks - Fatal编程技术网

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

在推送到git remote之前检查提交大小,git,github,githooks,Git,Github,Githooks,我的编辑器中有一个bug(很可怕),有时会将大文件写入工作目录。然后,我在不手动检查这些大的新文件的情况下执行了一个git push,git-remote会过载并最终出错 是否有一些检查(可能是git钩子),我可以用来检查我的回购协议是否超过某个大小(以MB为单位)?如果您知道大文件名或模式,例如后缀,您可以将其添加到中,直到您解决编辑器的问题 您可以检查哪个描述了服务器端更新挂钩。因为这是一个持续的问题,所以在执行git commit之前,您应该养成运行git status的习惯。您可以查看将

我的编辑器中有一个bug(很可怕),有时会将大文件写入工作目录。然后,我在不手动检查这些大的新文件的情况下执行了一个
git push
,git-remote会过载并最终出错


是否有一些检查(可能是git钩子),我可以用来检查我的回购协议是否超过某个大小(以MB为单位)?

如果您知道大文件名或模式,例如后缀,您可以将其添加到中,直到您解决编辑器的问题


您可以检查哪个描述了服务器端更新挂钩。

因为这是一个持续的问题,所以在执行
git commit
之前,您应该养成运行
git status
的习惯。您可以查看将提交的文件列表以查找不属于的文件。

Git在运行
Git push
时不会以任何方式使用工作树。具体来说,
git push
push是提交,以及任何对象(主要是在提交时内容冻结到提交中的文件)都是完成这些提交所必需的。1

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

因此,在Git钩子中检测此问题的最佳选择是预提交钩子,如中所述:

预提交

    此钩子由调用,可以通过
    --无验证
    选项。它不接受任何参数,并且在之前被调用 获取建议的提交日志消息并进行提交。退出 如果此脚本的状态为非零,则会导致执行
    git commit
    命令 在创建提交之前中止。
(文档还有更多内容;请按照链接查看。)

编写Git钩子有点棘手(尤其是服务器端钩子),但这一点也不太糟糕:

#! /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
#/垃圾箱/垃圾箱
#预提交钩子:检查大文件
TMP=$(mktemp)
陷阱“rm-f$TMP”01 2 3 15
最大文件大小=1048576#1 MB
状态=0
git ls文件--阶段>$TMP
而读取模式哈希阶段路径;做
objsize=$(git cat文件-s$hash)
如果[$objsize-gt$MAX_FILE_SIZE];然后
echo“文件太大:'$path'暂存超过$MAX\u file\u SIZE字节”1>&2
状态=1
fi
完成<$TMP
退出$status
(未经测试)。你可以选择一个预推钩,但这是迟于适当的



1这些Git对象也被压缩。只要有可能,通过使用服务器上已有的以前的对象,它们都会被压缩。所以,如果你有一个10G的文本文件,但是你对它做了一个小的修改,然后提交,即使它里面有10G的文件,但是它只占用很少的空间,因为Git发送的所谓的瘦包最后说:嘿,还记得你已经有10G的对象吗?使用该方法,从中间删除几个字节,然后用这些其他字节替换它们。

另一种方法,如果您想要多个提交的大小:

使用Git2.29(2020年第4季度),“()”学习了
%(内容:大小)

参见(2020年7月16日)和(2020年7月10日)作者。
(于2020年7月30日合并)

:添加对
%的支持(内容:大小)
签字人:Christian Couder

能够直接获取内容的大小,而不必通过管道
wc-c
,这是非常有用和高效的

还包括以下结果:

()

作为每个参考的
[
git
](https://github.com/git/git/blob/b6839fda6809b1de8d528837dfc99d0837f77c9d/Documentation/git-for-each-ref.txt)([男](https://git-scm.com/docs/git-for-each-ref))
在内容后追加一个换行符,可以通过将其输出与()的输出进行比较来查看

%(contents)
一样,如果ref指向的不是commit或标记,则
%(contents:size)
将被静默忽略:

$ git update-ref refs/mytrees/first HEAD^{tree}
$ git for-each-ref --format='%(contents)' refs/mytrees/first

$ git for-each-ref --format='%(contents:size)' refs/mytrees/first
git for each ref
现在包括在其

内容:大小
提交或标记消息的大小(以字节为单位)


这是一个好主意,你应该为此投赞成票,但是如果你能找到一种通用的方法来解决任何未知的大文件的问题,那就太好了best@OlegzandrDenman使用指向的链接更新答案。@OlegzandrDenman很明显,您可以根据名称忽略某些内容。但是有一个问题,git add-a(git status-s)不能告诉您大小,git commit-m“sfds”不能告诉您大小。当你推它的时候,你只会发现有一个巨大的东西。在处理框架或框架内使用的框架时可能会发生这种情况。大文件是否总是保存在某个文件夹中?文件名是否具有一致的模式,例如不规则的扩展名?
git push
从不对未提交的文件执行任何操作。你一定是在本地提交了。您是否盲目地使用git add.或类似工具?这是一个糟糕的反模式。是的,我正在提交它们,并通过提交所有不是。gitignore'd@OlegzandrDenman你有答案了吗?这与最大大小为1GB的Bitbucket回购相关。项目中可能存在负载。尤其是在处理框架时,您没有编写或导入每个单独的文件。和git状态,它不会告诉你大小