我的编辑器中有一个错误(这很可怕),有时大文件会写入工作目录。然后我做一个 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 thegit 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/