使用 GitHub 时防止将大文本文件添加到提交

2024-05-06

我们想要防止:

  • 非常大的文本文件(每个文件> 50MB)被提交到git代替git-lfs,因为它们夸大了 git 历史。
  • 问题是,其中 99%
  • 大小差异的原因:这些是 YAML 文件,它们支持通过 Base64 编码进行二进制序列化。
  • 我们无法可靠地阻止二进制序列化的原因:这是一个Unity项目,由于各种原因需要二进制序列化。

Given:

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

问题:

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

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


好的,在 CodeWizard 的帮助下这个答案 https://stackoverflow.com/questions/42963854/list-files-not-tracked-by-git-lfs,我自己设法创建了一个很好的指南:

首先,设置您的存储库core.hooksPath with:

git config core.hooksPath .githooks

其次,创建这个pre-commit里面的文件.githooks文件夹,以便可以跟踪(要点链接 https://gist.github.com/bitinn/834756d57f3d47df97937aab68162ae6),然后记得授予它执行权限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 and git-lfs设置正确,当您尝试执行此操作时,此预提交挂钩将运行git commit并确保 git-lfs 不跟踪所有暂存文件(如您的.gitattributes),将满足指定的文件大小限制。

您的存储库的任何新用户都需要进行设置core.hooksPath他们自己,但除此之外,事情应该正常进行.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 GitHub 时防止将大文本文件添加到提交 的相关文章

  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • Gitlab 备份错误:包对象因信号 9 死亡

    我有一个存储库 有 2 个分支 大小为 3 5GB 每个分支大约 1 5GB git 本身就有 700MB 这是错误 备份失败 失败的 失败 opt gitlab embedded bin git git dir mountdata git
  • Git:文件“已更改但未更新”

    已更改但未更新 是什么意思 这些文件位于 git 中 它们已被修改 但是当我运行 git status 时 这些更改显示在 已更改但未更新 而不是 要提交的更改 下 On branch master Changes to be commit
  • Git Hook - 在我推送到 github 后让服务器拉取

    我有一个本地存储库 并且我在实时服务器上设置了另一个存储库 www site com projects ProjectA 我想要实现的目标非常简单 在我推送到 GitHub 后 我想要存储库位于www site com projects P
  • “警告:'github.com' 的 ECDSA 主机密钥与 IP 地址的密钥不同”问题

    我不知道发生了什么 但有一天 当我起床时git push我的改变是 Warning the ECDSA host key for github com differs from the key for the IP address 140
  • 如何应用 .diff 文件

    我有一个 diff 类型文件 看起来像爆炸了 diff git a res User lua b res User lua index db8c2cc 4d2af0f 100644 a res User lua b res User lua
  • 使用 ssh-keygen 创建 SSH 密钥不会创建 .ssh 文件夹

    我正在尝试使用 msysgit 创建我的公共 私有 rsa 密钥对 我运行这个命令 ssh keygen C email protected cdn cgi l email protection t rsa 一切看起来都很好 我收到消息了
  • 如何从现有存储库中的分支创建新的 GitHub 存储库?

    I have master and 新项目分支机构 现在我想创建一个全新的存储库及其基于新项目分支的主存储库 背景 我有一个存储库 其中包含三个独立的应用程序 事情并不是这样开始的 仓库中最初只有一个应用程序 然而 随着时间的推移 业务需求
  • 为什么 git 默认执行快进合并?

    来自 Mercurial 我使用分支来组织功能 当然 我也希望在我的历史中看到这个工作流程 我使用 git 开始了我的新项目并完成了我的第一个功能 当合并该功能时 我意识到 git 使用快进 即如果可能的话 它会将我的更改直接应用到主分支
  • IBM AIX:核心-外壳:显示文件修改日期

    我想用 bash 做这样的事情 查看文件上次修改的时间 ls lha ls full time 但我必须在 AIX 上使用 core shell 怎样才能达到这样的效果呢 您可以使用 istat istat test ksh Inode 8
  • 设置 Git osxkeychain 错误

    我正在设置 Git 并且正在关注http lifehacker com 5983680 how the heck do i use github http lifehacker com 5983680 how the heck do i u
  • 如何使用 bash 测试文件系统的目录限制

    我需要测试可以在文件系统 网络安装驱动器和本地 USB 驱动器 上创建多少目录和文件 我现在使用这个 bash 行 for i in 0 999999 do mkdir p i pushd i done 我知道可能可以做得更好 并且我想知道
  • GIT 或 SVN 或...适用于前端开发人员

    我最近开始将一些项目导入到工作中的 Subversion 存储库中 在接下来的几周内 我希望团队中的每个人都能负责自己的源代码控制管理 我选择 SVN 而不是 GIT 的原因是我想要everyone团队中的人员 包括设计师 前端人员 集成商
  • 我可以通过 GH API 获取两次提交之间一个文件的差异数据吗?

    我知道如何通过 API 以及 SHA 和所有这些好东西来获取文件的提交 但是 假设我只想要 1 次提交中的文件差异或两次提交中同一文件的差异 例如 在这次提交 https github com rails rails commit ea75
  • 在我的 gemfile 中指定来自 Github 的 gem 的分叉版本时出现“无法找到 gem”错误

    我正在尝试使用这个分叉版本 http github com railsdog searchlogicsearchlogic gem 的 在我的 gemfile 中 我有 gem searchlogic git gt http github
  • 测量大型源树中的“接近度”

    作为我之前提出的问题的一部分找到两个来源之间的最佳匹配 https stackoverflow com questions 13898659 finding what git commit some code spawned from 其中
  • Unity3D如何连接NavMesh和NavMeshAgent

    我在编辑器中收到此错误 SetDestination can only be called on an active agent that has been placed on a NavMesh 这些是我在解决问题时尝试的步骤 将 Nav
  • 直接向pbs脚本传递参数

    有没有办法在提交作业之前直接将参数传递给 pbs 脚本 我需要循环遍历由不同数字表示的文件列表 并应用脚本来分析每个文件 我能想到的最好的办法如下 bin sh for i 1 i lt 10 i do export FILENUM i q
  • 如何分叉一个已经分叉了上游的仓库?

    我想分叉 namecoin namecoin 但我已经分叉了比特币 比特币 后者是前者的上游父级 叉链是 比特币 比特币 gt vinced namecoin gt namecoin namecoin 当我分叉 namecoin namec
  • 如何使用 vim 作为“git log”编辑器?

    当我跑步时git log 编辑器到底是什么git log正在使用 Also 无论如何我可以使用吗vim作为我的默认编辑器git log 如果我想搜索 git 日志 最好的方法是什么 现在我正在做类似的事情 git log grep bla

随机推荐

  • 标记内嵌套块级元素...对还是错?

    嵌套在语法和语义上是否正确 div 或任何其他块级元素内 p 标签 我说的是 HTML4 过渡 DTD 如果没有那么可以使用 span style display block 反而 从语法上来说 一个div里面一个p在所有 HTML 标准中
  • 第 100 次避免循环导入

    Summary 我继续有一个ImportError在一个复杂的项目中 我已经将其蒸馏到仍然会出现错误的最低限度 Example 巫师有装有绿色和棕色药水的容器 这些可以添加在一起 产生同样是绿色或棕色的新药水 我们有一个PotionABC
  • 源单元“_BuildScript_”中“语义分析”阶段出现异常

    评估根项目 android 时出现问题 配置项目 app 时出现问题 无法打开构建文件 C Users InFED Laptop Documents GitHub sustain and save android app build gra
  • C++ 按值而不是按引用将数组发送到函数

    我的 C 有问题 我有一个对数组进行排序的函数 但我不想处理原始数组 我想通过值而不是通过引用将数组发送到函数 请帮我 int bogoSort int tab int n int iloscOperacjiDominujacych 0 c
  • OpenGL 中连续暂停

    void keyPress unsigned char key int x int y int i switch key case f i 3 while i x pos 3 sleep 100 glutPostRedisplay 上面是在
  • 使用事件处理程序与覆盖事件触发方法

    我正在创建 Button 的子类 并希望向其某些事件 例如 OnClick 添加自定义功能 哪种方式更理想 我是否重写 OnClick protected override void OnClick EventArgs e base OnC
  • 优雅的折线“左移”测试

    Given X Y 坐标 即车辆的位置 X Y 数组 它们是折线中的顶点 请注意 折线仅由直线段组成 没有圆弧 我想要的是 计算车辆是在折线的左侧还是右侧 当然还是在顶部 我的做法 迭代所有线段 并计算到每个线段的距离 然后 对于最近的段
  • 如何使用 Lint Option StopShip 使 Grade 发布构建失败?

    我读过很多关于StopShipAndroid Lint Check 和 Gradle 支持 http tools android com tips lint checks http tools android com tips lint c
  • 尝试初始化 AudioRecord 时出现“无法获取记录源 1 的音频输入”

    当尝试初始化 AudioRecord 对象并尝试使用 Eclipse 使用模拟器录制声音时 我不断收到此错误 我尝试过各种位采样率 8000 是唯一有效的 但错误仍然出现 我尝试过各种版本的sdk 1 5 1 6 2 2 2和2 3 1 以
  • Matlab 编辑器不使用 emacs 快捷方式

    Is there some way I can make the matlab integrated editor not use emacs shortcut but use more normal shortcuts such that
  • java.lang.String 无法转换为 org.json.simple.JSONObject simple-json

    我在尝试使用 google 的 simple json 解析简单的 json 时遇到奇怪的问题 这是我的代码 它不起作用 String s args 0 toString JSONObject json JSONObject new JSO
  • 随机数生成器每次仅返回一个数字

    Python 是否有一个随机数生成器 每次只返回一个随机整数next 函数被调用 数字不应该重复并且生成器应返回区间内的随机整数 1 1 000 000 这是独一无二的 我需要生成超过一百万个不同的数字 这听起来好像非常消耗内存 以防所有数
  • Cookie 不会重置

    好吧 我被难住了 我已经盯着这个看了好几个小时了 我使用以下代码在 access login php 设置 cookie setcookie username username time 604800 当我尝试注销 位于 access lo
  • 使用firebase实时数据库创建搜索功能

    我想使用 firebase 实时数据库为我的应用程序创建一个搜索功能 类似于 facebook 搜索 我做了一些研究并承认 Firebase 实时无法使用 文本包含 进行搜索 但我相信必须有一些方法来实现它 例如组合 startAt 或 e
  • 在函数内部使用时,c 数组大小会发生变化

    我有这段代码 include
  • 捕获 CommandOnCooldown 错误

    我正在制作一个有冷却时间的不和谐机器人 并且我正在尝试制作一个事件 当CommandOnCooldown发生错误时 机器人会通过私信告诉他们需要等待多长时间 这是我的代码 看起来一切正常 但它不知道 retry after 意味着什么 bo
  • 在 matplotlib 中添加新的导航模式

    我正在编写一个 wx matplotlib 应用程序 并且在向 matplotlib 导航工具栏添加新工具时遇到相当大的困难 基本上我想添加选择工具 选取框 套索等 以切换受控子图的鼠标模式 到目前为止 我还没有找到任何功能可以让我轻松地做
  • 在 python 中将数组作为参数传递

    我是Python新手 现在我需要声明大小为 20 的数组并将该数组传递给函数 需要数组的函数如下 function args The args是一个输入function 谁能帮我 如何在 python 中传递数组 当你说 数组 时 我假设你
  • 如何在不更改设置的情况下不区分大小写排序

    我的索引名称是 data new 下面是插入索引的代码 test id 1 name A professor Bill Cage accounting id 2 name AB professor Gregg Payne engineeri
  • 使用 GitHub 时防止将大文本文件添加到提交

    我们想要防止 非常大的文本文件 每个文件 gt 50MB 被提交到git代替git lfs 因为它们夸大了 git 历史 问题是 其中 99 大小差异的原因 这些是 YAML 文件 它们支持通过 Base64 编码进行二进制序列化 我们无法