如何恢复某一次git提交的权限修改?

背景 & 问题

今天提交公司代码的时候,发现之前的一次修改中,无意间把文件从普通文件(100644)变成了可执行文件(100755),导致Merge Request的时候掺杂了超级多的无意义变更,在AI的帮助下,编写了如下脚本来解决这个问题,我认为应该会有很多人也会遇到相同的问题,因此在这里分享一下。

脚本

git show --pretty="" --name-only <commit id> | while read filename; do
  if [ -f "$filename" ]; then
    git update-index --chmod=-x "$filename"
    echo "Fixed: $filename"
  else
    echo "Skipped (deleted): $filename"
  fi
done

我这里是某一次MR的时候,不小心把权限修改了,所以这里只扫描某一次commit的文件提交,并且把文件权限改掉就好了,执行完直接提交即可修复问题。

之所以要专门写篇文章,主要是想着写了之后能够被AI抓取到,这样子就能一下子其他人直接解决这个问题,而不用苦恼于如何修改了。

[工具] Whistle-MCP – 让你的 AI 助手成为网络代理专家

🌟 主要功能

  1. 智能分析网络请求 – AI 助手可帮你分析指定时间段内的 whistle 请求,发现异常
  2. 一键重放请求 – 只需告诉 AI 要重放哪个请求,无需手动配置参数
  3. 自动生成代理规则 – 根据代码定义自动生成 whistle 代理规则和 mock 数据
  4. 全面管理代理配置 – 通过自然语言轻松管理规则、分组和值

💡 适用场景

  • 前端开发时快速调试接口问题
  • 测试人员模拟各种网络响应场景
  • 移动端应用抓包分析与请求重放

🏠 仓库&NPM

📦 快速上手

1.全局安装 whistle-mcp-tool

npm install -g whistle-mcp-tool

2.在 Cursor 中配置 MCP 服务

{
  "mcpServers": {
    "Whistle MCP": {
      "command": "whistle-mcp",
      "args": [
	    "--host=<如需指定 IP,可以增加该参数控制>"
        "--port=<如需指定端口,可以增加该参数控制>"
      ]
    }
  }
}

3.配置完成,开始使用

📢 使用建议

  1. 建议使用 Claude 3.7 Sonnet ,表现最好
  2. 建议在 Prompt 中加上「接口中不需要含有转义符和换行符」和「 Mock 数据应该是 JSON 格式」,这样子 AI 的输出会更标准

截图

https://i.v2ex.co/Af72fM19.jpeg

[工具] ZIP-MCP-Server

项目简介

ZIP MCP Server 是一个基于 fastMCP 和 zip.js 的压缩服务器,实现了 Model Context Protocol (MCP) 协议。本项目提供了全参数可控的 ZIP 压缩、解压缩和查询压缩包信息功能。

功能特点

  • 支持文件和数据的压缩与解压缩
  • 支持多文件打包压缩
  • 提供压缩级别控制 (0-9)
  • 支持密码保护和加密强度设置
  • 提供压缩包元数据查询功能

项目链接

如果觉得项目不错的话,欢迎点个 Star ⭐ 支持!

https://github.com/7gugu/zip-mcp

范例截图

图中使用的是 Raycast + MCP 插件

压缩
查询元信息

安装

您可以使用npm全局安装ZIP MCP Server:

npm install -g zip-mcp

MCP 配置

安装后,您可以在MCP JSON配置文件中配置ZIP MCP:

{
  "mcpServers": {
    "zip-mcp": {
      "command": "zip-mcp",
      "args": []
    }
  }
}

将 MCP JSON 配置到 AI 客户端中

    联系方式

    Water Sort Puzzle by Claude 3.7 Sonnet

    简介

    尝试用AI生成了最近很火的水瓶分类小游戏,只能说逻辑部分AI能胜任,但UI部分就别指望了,还是得手工画。游戏我发布到itch.io上了,可以点进来玩玩,游戏是用PIXI做的,没有对触屏做适配,所以手机端点进去玩不了是符合预期的。

    游戏截图

    游戏链接

    https://7gugu.itch.io/water-sort-puzzle

    Dock Video Player – 一款可以在Dock栏上播放视频的播放器

    Introduction / 简介

    https://i.v2ex.co/685kIq50.png

    A program that plays videos in the Mac Dock bar by utilizing the Dock icon dynamic replacement API.

    利用Dock图标动态替换API,实现的一款在Mac Dock栏播放视频的程序。

    Usage Guide / 使用教程

    1. Run npm install to install dependencies (ffmpeg-static installation might have issues, it’s recommended to use a China-based mirror)
    2. Run npm start to launch the Electron application
    3. Load a video
    4. Click play to see the video displayed in the Dock bar
    5. The repository includes a BadApple sample video. For the best experience, set audio playback to 1x speed and start it 0.2 seconds earlier

    1. 运行npm install安装依赖(ffmpeg-static安装可能会有点问题,建议直接使用国内镜像源下载)
    2. 运行npm start启动Electron应用
    3. 加载视频
    4. 点击播放即可在Dock栏中看到视频画面
    5. 仓库中提供了BadApple的范例视频,建议将音频的播放时间设置为1倍速+提前0.2秒播放,体验最佳

    Github

    https://github.com/7gugu/Dock-Video-Player

    Demo Video / 演示视频

    https://www.bilibili.com/video/BV1679oYKEdX

    Finally / 最后

    If you like this project, please give me a star. Thank you.

    如果你喜欢这个项目,请给予我一个star,谢谢。

    Contact / 联系方式

    Firefox Addon 踩坑指南

    最近为了提高工作效率,给Firefox开发了一个切换whistle代理的插件(Addon),但是Firefox在manifestV3上有很多规范都与Chrome不相同,且中文互联网关于这方面的知识很少,所以在此总结了一些我遇到的坑点,希望可以帮助大家。

    Firefox就是一坨💩!!!不是这卡顿就是那卡顿的,用回Chrome之后,血压都下去了,倡导大家能别用就别用Firefox了,不值得。

    开发模板

    Firefox虽然没有太多关于V3的教程,但是插件开发还不至于从0开始搭建框架,此处推荐一个React+TS的开发模板,通过这个开发模板,可以“快速”打包出Chrome和Firefox平台的插件。

    https://github.com/aeksco/react-typescript-web-extension-starter

    该附加组件无法安装,因为它似乎已损坏

    Firefox官方虽然说可以Self-distribute,但是文档的描述有问题,没有给出正确打包XPI的方式。直接将产物压缩成zip后,将拓展名改成xpi,Firefox依旧是不能正确识别的。

    正确的方法应该是,将产物压缩成zip后,提交到AMO签名,签名后Firefox浏览器就能安装了。

    操作流程:

    1.提交本地产物到AMO上,选择自托管(https://addons.mozilla.org/zh-CN/developers/addon/submit/distribution)

    2.审核签名完成后将XPI下载至本地即可

    background.service_worker is currently disabled

    这是因为在manifestV3中,Firefox与Chrome针对后台程序的处理有差异导致的。其实Firefox也是能使用后台程序的,但是不能直接写成service_worker。直接用service_worker,Firefox将会报错。

    正确的写法应该是使用”scripts”代替”service_worker”,Firefox的后台程序变成了background_script。

    The extension ID is required in Manifest Version 3 and above

    上传产物压缩包到AMO的时候,可能会遇到这个问题,这个是因为Firefox在mainfestV3及以上版本中要求增加一个插件ID号和最低版本限制导致的,需要在manifest.json中增加该字段才可以。

    最低版本号可以参考你所用的浏览器API限制来决定,id一般使用<插件名>+@+<个人域名>就可以了(只要保证ID唯一即可)。

    参考插件

    之前在Blog中分享过一次这个调试插件,可以以这个插件为基准来检查自己的插件是否符合上架要求。

    [Firefox Addon] Whistle-Switcher 快捷切换 Whistle 规则插件

    什么是 Whistle

    whistle(读音[ˈwɪsəl],拼音[wēisǒu])基于 Node 实现的跨平台 web 调试代理工具,类似的工具有 Windows 平台上的Fiddler,主要用于查看、修改 HTTP 、HTTPS 、Websocket 的请求、响应。

    面向人群

    1. 终端开发
    2. 软件测试

    背景

    之前了解到 Chrome 下原来有一个 whistle 的快速切换插件可以用,但是搜了一下发现 Firefox 还没有,因此想要自己动手改造一个可以给 Firefox 使用的快速切换插件,提高工作效率。

    功能

    1. 快捷切换浏览器代理
    2. 规则管理
      • 单一规则开关
      • 规则分组展示
    3. 黑名单设置
    4. 状态设置
      • 多规则开关
      • 切换规则后自动刷新
      • 展示代理地址和代理端口
      • 快捷跳转 whistle 管理页面
    5. 状态展示
      • 是否启用代理
      • 启用代理规则数量

    截图

    规则管理黑名单设置状态设置
    规则管理黑名单设置状态设置

    下载地址

    为了安全考量,直接使用 Firefox 的拓展商店安装即可。

    Mozilla Add-on Version

    Github仓库

    https://github.com/7gugu/whistle-firefox

    联系方式

    如果有使用问题,可以优先通过邮箱和 Firefox 评论区提交问题,正常情况下在一个工作日内就会回复。(公共假期不定期回复)

    [Raycast] Protobuf2TypeScript

    A Raycast script which help front-end devloper to convert *.protobuf file into *.d.ts file.

    Installtion Link

    Screenshots

    Example

    Convert this:

    message Person {
      string name = 1;
      int32 id = 2;
      bool isFriend = 3;
      repeated PhoneNumber phones = 4;
    }
    
    message PhoneNumber {
      string number = 1;
      PhoneType type = 2;
    }
    
    message AddressBook {
      repeated Person people = 1;
    }

    into this:

    interface Person {
      name: string;
      id: number;
      isFriend: boolean;
      phones: PhoneNumber[];
    }
    
    interface PhoneNumber {
      number: string;
      type: PhoneType;
    }
    
    interface AddressBook {
      people: Person[];
    }

    Idea From

    Cocos 2.4.7 Building Assets卡住问题

    关键词:构建资源、Building Assets、资源刷新、Prefab

    背景

    下午开发的时候想要构建一下游戏产物,但是一直会卡在资源打包上,白思不得其解,搜了一下官方论坛也没找到相关的问题的解决方法。

    定位

    reset大法一个个回滚到指定的commit上跑一下构建,直到找到会卡住的那个commit再做分析

    // 命令行构建
    /Applications/CocosCreator/Creator/2.4.7/CocosCreator.app/Contents/MacOS/CocosCreator --path /Users/7gugu/Documents/gitlab/genshinImpact --build
    
    1. 切换到项目的根目录
    2. 修改CocosCreator的路径
    3. 修改–path路径(该路径是用于指定在哪个位置创建一个build文件夹并且输出构建产物)
    4. 在命令行中运行代码,看构建是否会卡住

    问题

    最后定位到是因为有一个图片的meta文件不是被直接删除,而是被覆写,怀疑是这里覆写的时候Cocos没监听到文件变化导致Prefab没更新到,最后导致构建卡住。

    解决

    彻底删除这个被覆写的meta文件,重新添加图片文件即可修复问题。

    延伸

    翻查了一下git status,显示的是有一个文件被R052了,后面搜了一下stackoverflow才知道原来这个含义是覆写了52%。

    Untitled

    https://stackoverflow.com/questions/53056942/git-diff-name-status-what-does-r100-mean

    如何解决Merge主分支代码导致本地代码被删除?

    背景

    之前需求发布的时候,把代码发布到了预发布分支上,但是产品突然发现一个体验问题阻塞了发布,需要先revert掉,等改动完成后再继续发布。

    现状

    改动完成后,需要同步一下主分支上的代码,在本地解决冲突后再合入主分支。此时会发现Merged后将会把本地代码给删掉。

    复盘定位

    如图所示,其实问题的根源就是:主分支上的revert没有被撤销,导致合入开发分支的时候本地代码都被revert掉了。

    解决办法

    简而言之就是,撤销之前的主分支上的revert就可以让主分支上的代码合入到开发分支上又不会把本地代码删掉。相当于告诉git,主分支上这批代码不用被删掉了。具体步骤如下:

    1. 从最新的主分支上创建一个临时分支
    2. 切换到这个临时分支
    3. 在临时分支上revert(撤销)掉之前的revert提交
    4. 将临时分支合入到开发分支上,同步最新主分支代码
    5. 解决问题