防止使用 GitHub 时添加大文本文件进行提交

问题描述 投票:0回答:3

我们要防止:

  • 非常大的文本文件(每个文件 > 50MB)会被提交到
    git
    而不是
    git-lfs
    ,因为它们会增加 git 历史记录。
  • 问题是,99%都是 < 1MB, and should be committed for better diffing.
  • 大小差异的原因:这些是YAML文件,它们支持通过base64编码进行二进制序列化。
  • 我们无法可靠地阻止二进制序列化的原因:这是一个Unity项目,出于各种原因需要二进制序列化。

鉴于:

  • GitHub 托管缺乏预接收挂钩支持。
  • git-lfs 缺乏文件大小属性支持。

问题:

  1. 如何可靠地防止大文件被添加到提交中?
  2. 可以通过存储库中的配置文件来完成此操作,以便所有用户都优雅地遵循此规则吗?
  3. 如果没有,可以通过 bash 命令别名来完成此操作,以便受信任的用户在意外
    git add
    一个大文件且未由
    git-lfs
    处理时可以看到警告消息吗?

(我们的环境是macOS。我看了很多解决方案,目前还没有满足我们的需求)

bash git unity-game-engine github git-lfs
3个回答
8
投票

好吧,在 CodeWizard 和 这个答案的帮助下,我自己成功创建了一个很好的指南:

首先,设置您的存储库

core.hooksPath

git config core.hooksPath .githooks

其次,在

pre-commit
文件夹中创建此
.githooks
文件,以便可以跟踪它(gist 链接),然后记得使用
chmod +x
授予其执行权限。

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".

# Redirect output to stderr.
exec 1>&2

FILE_SIZE_LIMIT_KB=1024
CURRENT_DIR="$(pwd)"
COLOR='\033[01;33m'
NOCOLOR='\033[0m'
HAS_ERROR=""
COUNTER=0

# generate file extension filter from gitattributes for git-lfs tracked files
filter=$(cat .gitattributes | grep filter=lfs | awk '{printf "-e .%s$ ", $1}')

# before git commit, check non git-lfs tracked files to limit size
files=$(git diff --cached --name-only | sort | uniq | grep -v $filter)
while read -r file; do
    if [ "$file" = "" ]; then
        continue
    fi
    file_path=$CURRENT_DIR/$file
    file_size=$(ls -l "$file_path" | awk '{print $5}')
    file_size_kb=$((file_size / 1024))
    if [ "$file_size_kb" -ge "$FILE_SIZE_LIMIT_KB" ]; then
        echo "${COLOR}${file}${NOCOLOR} has size ${file_size_kb}KB, over commit limit ${FILE_SIZE_LIMIT_KB}KB."
        HAS_ERROR="YES"
        ((COUNTER++))
    fi
done <<< "$files"

# exit with error if any non-lfs tracked files are over file size limit
if [ "$HAS_ERROR" != "" ]; then
    echo "$COUNTER files are larger than permitted, please fix them before commit" >&2
    exit 1
fi

exit 0

现在,假设您正确设置了

.gitattributes
git-lfs
,当您尝试
git commit
并确保 git-lfs 不跟踪所有暂存文件时,此预提交挂钩将运行(如您的
.gitattributes 中指定) 
),将满足指定的文件大小限制。

您的存储库的任何新用户都需要自行设置

core.hooksPath
,但除此之外,一切都应该正常工作

希望这可以帮助其他 Unity 开发人员应对不断增长的 git 存储库大小!


3
投票
  • 如何可靠地防止大文件被添加到提交?
  • 可以通过存储库中的配置文件来完成此操作,以便所有用户都优雅地遵循此规则吗? 由于 GitHub 不支持服务器端挂钩,您可以使用客户端挂钩。正如您可能知道的那样,这些钩子可以毫无问题地传递和禁用,但这仍然是一个很好的方法。

core.hooksPath

Git v2.9 添加了在远程文件夹上设置客户端挂钩的功能。在此之前,挂钩必须已放置在

.git
文件夹内。

这将允许您编写脚本并将它们放在任何地方。我假设您知道 Hooks 是什么,但如果不知道,请随时询问。


如何做?

通常,您将挂钩放在存储库(或任何其他常见文件夹)中。

# set the hooks path. for git config, the default location is --local
# so this configuration is locally per project
git config core.hooksPath .githooks

0
投票

除了客户端的解决方案 (

core.hooksPath
),您现在(2024 年第 2 季度)在 GitHub 端也有:

推送规则公测版(2024 年 4 月)

告别那些让您的存储库变得混乱的不需要的文件,例如

*.jar
*.so

并通过推送规则的公开测试版限制谁可以更新敏感文件(例如您的 Actions 工作流程)。
🎉

您现在可以启用一种新型规则集,允许您根据文件扩展名、文件路径长度、文件和文件夹路径以及文件大小来控制对存储库的推送。
推送规则不需要任何分支目标,因为它们适用于对存储库的每次推送,并且还适用于存储库的所有分支,以确保对存储库网络的所有推送都受到保护。

推送规则现在可用于 GitHub Teams 的私有和内部存储库,以及跨组织的 GitHub Enterprise Cloud。

在我们的文档中了解有关推送规则的更多信息,并加入社区讨论留下反馈。

是的,这些推送规则包括:

限制文件大小:防止推送超出指定文件大小限制的提交。

© www.soinside.com 2019 - 2024. All rights reserved.