当前位置: 首页 > news >正文

图片上传git时压缩

你想实现在上传图片到 Git 仓库时自动进行压缩,这可以通过 Git Hooks 来实现。

下面我将为你详细介绍如何配置一个 Git 钩子(pre-commit hook),在你每次执行 git commit 时,自动压缩 staged(已暂存)的图片文件(如 .png.jpg.jpeg),然后用压缩后的文件替换原文件并重新暂存。

核心思路

  1. 创建钩子脚本:在项目的 .git/hooks 目录下创建一个 pre-commit 脚本。
  2. 脚本功能
    • 检查当前暂存区(staged)是否有图片文件被修改或新增。
    • 如果有,使用一个图片压缩工具(如 sips - macOS 自带,或 pngquantjpegoptim 等更高效的命令行工具)对这些图片进行压缩。
    • 将压缩后的文件重新添加到暂存区(git add),这样它们就会被包含在即将进行的 commit 中。
  3. 安装依赖:确保你选择的压缩工具已经安装在你的开发环境中。

方案一:使用 macOS 自带的 sips 工具 (最简单,无需额外安装)

sips 是 macOS 自带的命令行图片处理工具,可以用来调整图片大小和质量。虽然它的压缩效率可能不如专业工具,但胜在方便快捷。

步骤:
  1. 创建 pre-commit 钩子文件

    打开终端,进入你的项目根目录,然后执行以下命令:

    bash

    cd /path/to/your/project
    touch .git/hooks/pre-commit
    chmod +x .git/hooks/pre-commit
    open .git/hooks/pre-commit
    
  2. 粘贴以下脚本内容

    这会在每次 commit 前,自动压缩所有新增或修改的 .png.jpg.jpeg 文件。

    bash

    #!/bin/sh# 获取所有暂存区中被修改或新增的图片文件
    IMAGE_FILES=$(git diff --cached --name-only --diff-filter=ACMR | grep -E '\.(png|jpg|jpeg)$' | tr '\n' ' ')if [ -z "$IMAGE_FILES" ]; thenexit 0
    fiecho "pre-commit hook: 开始压缩图片..."# 遍历文件并压缩
    for file in $IMAGE_FILES; doif [ -f "$file" ]; thenecho "  正在压缩: $file"# 使用 sips 进行压缩,降低质量到 80%# 注意:sips 会直接覆盖原文件sips -s formatOptions 80 "$file" --out "$file"# 将压缩后的文件重新添加到暂存区git add "$file"fi
    doneecho "pre-commit hook: 图片压缩完成。"
    exit 0
    

    说明

    • git diff --cached --name-only --diff-filter=ACMR:这个命令非常关键。
      • --cached:查看暂存区的文件。
      • --name-only:只显示文件名。
      • --diff-filter=ACMR:只筛选出 (A) dded, (C) opied, (M) odified, (R) enamed 的文件。
    • grep -E '\.(png|jpg|jpeg)$':使用正则表达式筛选出图片文件。
    • sips -s formatOptions 80 "$file" --out "$file":这是压缩命令。formatOptions 80 表示将质量设置为 80%。你可以调整这个值(0-100)来平衡质量和大小。--out "$file" 表示输出到原文件,即覆盖。

方案二:使用更高效的压缩工具 (pngquant 和 jpegoptim)

对于更极致的压缩,推荐使用 pngquant (针对 PNG) 和 jpegoptim (针对 JPG)。它们通常能在保持较好视觉质量的同时,提供比 sips 更高的压缩比。

步骤:
  1. 安装压缩工具

    使用 Homebrew 安装(如果没有安装 Homebrew,请先访问 brew.sh 进行安装)。

    bash

    brew install pngquant jpegoptim
    
  2. 创建 / 修改 pre-commit 钩子文件

    同样,在 .git/hooks/pre-commit 文件中,粘贴以下内容:

    bash

    #!/bin/sh# 获取所有暂存区中被修改或新增的图片文件
    FILES=$(git diff --cached --name-only --diff-filter=ACMR)if [ -z "$FILES" ]; thenexit 0
    fiecho "pre-commit hook: 开始压缩图片..."# 遍历文件
    while IFS= read -r file; doif [[ "$file" =~ \.(png)$ ]]; thenif [ -f "$file" ]; thenecho "  正在压缩 PNG: $file"# pngquant 会生成一个新文件,例如 image.png -> image-fs8.png# --ext .png 表示输出文件使用 .png 后缀# --force 表示强制覆盖pngquant --quality=65-80 --ext .png --force "$file"git add "$file"fielif [[ "$file" =~ \.(jpg|jpeg)$ ]]; thenif [ -f "$file" ]; thenecho "  正在压缩 JPG: $file"# jpegoptim 会直接优化并覆盖原文件# --max=80 表示将质量控制在最大 80%# --strip-all 移除所有元数据jpegoptim --max=80 --strip-all "$file"git add "$file"fifi
    done <<< "$FILES"echo "pre-commit hook: 图片压缩完成。"
    exit 0
    

    说明

    • pngquant --quality=65-80 ...:为 PNG 文件设置一个质量范围,pngquant 会尝试找到最佳的压缩点。
    • jpegoptim --max=80 --strip-all ...:为 JPG 文件设置最大质量,并移除 EXIF 等元数据以减小体积。

如何使用

  1. 保存脚本:将上述任一方案的代码粘贴到 .git/hooks/pre-commit 文件后保存。
  2. 确保脚本可执行chmod +x .git/hooks/pre-commit 这个命令已经做了这件事。
  3. 正常工作:现在,当你修改或新增一个图片文件,并执行 git add . 和 git commit -m "your message" 时,钩子脚本就会自动运行,压缩图片并将压缩后的版本提交。

重要注意事项

  1. git add 再次:脚本中必须包含 git add "$file"。因为压缩工具修改了文件,使其变成了 "modified but not staged" 状态。如果不重新 git add,那么 commit 的将是压缩前的版本,而工作区会留下压缩后的版本,导致不一致。
  2. 二进制文件差异:Git 默认对二进制文件(如图片)的处理效率不高。每次图片被压缩后,即使变化很小,Git 也会存储一个全新的版本。这会导致仓库体积随着时间推移而增长。
    • 解决方案:可以考虑使用 Git LFS (Large File Storage) 来管理大图片和其他二进制资产。Git LFS 会将大文件存储在外部服务器上,而 Git 仓库中只保留一个指针。这是一个更长期、更可持续的解决方案,特别是对于团队协作项目。
  3. 团队协作.git/hooks 目录下的文件默认不会被 Git 版本控制。如果你希望团队中的其他成员也能使用这个钩子,你需要:
    • 在项目中创建一个 hooks 目录(例如 ./githooks),将 pre-commit 脚本放在这里。
    • 在 README.md 中说明,让团队成员在克隆仓库后,执行 cp ./githooks/* .git/hooks/ 来安装钩子。
    • 或者使用像 husky (一个流行的 Git Hooks 管理工具) 这样的库来更方便地共享和管理钩子。不过 husky 主要在 Node.js 项目中使用,但也可以用于其他类型的项目。
  4. 测试:在正式使用前,务必进行测试。修改一张图片,git add 它,然后尝试 git commit。观察终端输出,并检查提交后的图片是否是压缩后的版本。

总结

使用 Git Hooks 是在提交前自动压缩图片的绝佳方式,能有效控制 Git 仓库的大小。

  • 方案一 (sips):适合个人项目或快速设置,无需额外依赖。
  • 方案二 (pngquant/jpegoptim):压缩效果更好,推荐用于对体积敏感的项目。
  • 长远之计:结合 Git LFS 来管理所有大文件,这是处理二进制资产的最佳实践。
http://www.dtcms.com/a/605586.html

相关文章:

  • Flutter 聊天界面使用ListView的reverse:true,导致条目太少的时候会从下往上显示,导致顶部大片空白
  • 湛江市政工程建设公司网站仿别人的网站违法嘛
  • 石景山企业网站建设公司网站开发策划
  • RDMA拥塞控制之CNP
  • 终端Kitty,主要是看有人聊到opencode需要的终端
  • 基于Python的新能源汽车销量数据分析与预测系统设计与实现
  • android recyclerview缓存_缓存问题解决办法
  • GEN-0深度剖析:物理交互数据如何重塑机器人学习的“扩展定律”
  • 各大网站的名字大全百度招聘
  • 泰州网站关键词优化软件咨询在线crm系统是啥
  • ZC序列的原理及在LTE中的应用
  • 山东网站seo推广优化价格对单位网站的要求吗
  • Ubuntu25.10安装Samba
  • Ubuntu 虚拟机文件传输到 Windows的一种好玩的办法
  • 找别人做网站都需要注意啥wordpress访问私密帖子
  • 网站备案需要关闭台州华燕网业有限公司
  • 3D装配动画结合MES系统,助力制造业无纸化办公
  • Tetracycline-Biotin,四环素-生物素,化学性质
  • 李飞飞World Labs发布Marble:用一句话生成可编辑的3D世界
  • Zookeeper 笔记
  • WebSocket 通俗讲解
  • 面向大数据与物联网的下一代时序数据库选型指南:Apache IoTDB 解析与应用
  • 网站建设与管理是什么工作网站开发网络
  • 科普:VB(Visual Basic)和VBS(VBScript)
  • 如何做电商网站首页开发一个电商平台
  • Hadess入门到精通 - 如何管理Helm制品
  • springboot的依赖管理机制和构建插件
  • 学Java第四十四天——Map实现类的源码解析
  • 4.网络原理及编程
  • BDS 执行平台相关动作