git自动压缩提交的脚本

server/2025/1/1 17:14:20/

可以将当前未提交的代码自动执行

Git 命令安装指南

1. 创建脚本目录

如果目录不存在,创建它:

mkdir -p ~/.local/bin

2. 创建脚本文件

vim ~/.local/bin/git-squash

将完整的脚本代码复制到此文件中。

3. 设置脚本权限

chmod +x ~/.local/bin/git-squash

4. 配置 PATH

编辑 shell 配置文件(根据你使用的 shell 选择):

# 对于 bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc# 或对于 zsh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

重新加载配置:

source ~/.bashrc  # 或 source ~/.zshrc

5. 创建 Git 别名

git config --global alias.allen-squash '!git-squash'

6. 验证安装

检查脚本是否可执行:

ls -l ~/.local/bin/git-squash

检查脚本是否在 PATH 中:

which git-squash

检查 git 别名是否设置成功:

git config --get-regexp alias.*squash

7. 使用方法

可以通过以下两种方式使用:

# 直接使用脚本
git-squash# 或使用 git 别名
git allen-squash

8. 常见问题排查

命令未找到

  1. 检查 PATH:
echo $PATH | grep -o ~/.local/bin
  1. 检查脚本权限:
ls -l ~/.local/bin/git-squash
  1. 检查 git 别名:
git config --list | grep allen-squash

管理别名

# 删除别名
git config --global --unset alias.allen-squash# 修改别名
git config --global alias.allen-squash '!git-squash'

编辑脚本

vim ~/.local/bin/git-squash

9. 备份建议

建议进行以下备份:

# 备份脚本
cp ~/.local/bin/git-squash ~/.local/bin/git-squash.backup# 备份 git 配置
cp ~/.gitconfig ~/.gitconfig.backup

10. 更新脚本

如需更新脚本:

# 编辑脚本
vim ~/.local/bin/git-squash# 确保权限正确
chmod +x ~/.local/bin/git-squash

注意事项

  1. 确保 ~/.local/bin 目录存在并在 PATH 中
  2. 确保脚本具有可执行权限
  3. 重启终端或重新加载配置文件后更改才会生效
  4. 建议在使用前先进行配置备份
  5. 如果遇到权限问题,检查用户权限和文件权限

故障排除

如果命令不能正常工作,请按以下步骤检查:

  1. 确认脚本位置:

    • 检查 ~/.local/bin/git-squash 是否存在
    • 确认文件权限是否正确
  2. 检查 PATH 设置:

    • 确认 ~/.local/bin 在 PATH 中
    • 检查 shell 配置文件是否正确加载
  3. 验证 git 别名:

    • 检查别名是否正确设置
    • 确认 git 配置文件是否正确

脚本内容

#!/bin/bash# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color# 全局变量
COMMITS_TO_SQUASH=0# 错误处理函数
handle_error() {echo -e "${RED}Error: $1${NC}"exit 1
}# 获取与main分支的距离和可压缩提交数量
get_commit_info() {# 获取当前分支名current_branch=$(git branch --show-current)# 获取当前分支的总提交数total_commits=$(git rev-list HEAD --count)# 尝试获取与main分支的距离if git rev-parse --verify main >/dev/null 2>&1; thencommits_from_main=$(git rev-list --count main..HEAD)echo -e "\n${YELLOW}Commit information:${NC}"echo -e "Current branch: ${GREEN}$current_branch${NC}"echo -e "Total commits in current branch: ${GREEN}$total_commits${NC}"echo -e "Commits ahead of main: ${GREEN}$commits_from_main${NC}"echo -e "Maximum commits that can be squashed: ${GREEN}$commits_from_main${NC}"elseecho -e "\n${YELLOW}Commit information:${NC}"echo -e "Current branch: ${GREEN}$current_branch${NC}"echo -e "Total commits in current branch: ${GREEN}$total_commits${NC}"echo -e "Main branch not found - cannot calculate distance from main"echo -e "Maximum commits that can be squashed: ${GREEN}$total_commits${NC}"fi
}# 显示最近的提交历史并获取压缩数量
show_recent_commits() {echo -e "\n${YELLOW}Recent commits:${NC}"git --no-pager log --oneline -n 5# 计算与main分支的距离commits_ahead=$(git rev-list --count main..HEAD)echo -e "\n${YELLOW}Valid squash range:${NC}"echo -e "Minimum commits: ${GREEN}2${NC}"echo -e "Maximum commits: ${GREEN}$commits_ahead${NC} (number of commits ahead of main)"while true; doecho -e "\n${YELLOW}How many commits do you want to squash? (${GREEN}2${NC} to ${GREEN}$commits_ahead${NC})${NC}"read -r commits_count# 验证输入是否在有效范围内if [[ "$commits_count" =~ ^[0-9]+$ ]] && [ "$commits_count" -ge 2 ] && [ "$commits_count" -le "$commits_ahead" ]; thenCOMMITS_TO_SQUASH=$commits_countbreakelseecho -e "${RED}Please provide a number between 2 and $commits_ahead${NC}"fidone
}# 创建备份分支
create_backup() {current_branch=$(git branch --show-current)backup_branch="${current_branch}_backup_$(date +%Y%m%d_%H%M%S)"git branch $backup_branch || handle_error "Failed to create backup branch"echo -e "${GREEN}Created backup branch: $backup_branch${NC}"
}# 执行squash操作
do_squash() {local commits_count=$1echo -e "\n${YELLOW}Will squash last $commits_count commits:${NC}"git --no-pager log --oneline -n "$commits_count"echo -e "\n${YELLOW}Do you want to continue? (y/n)${NC}"read -r responseif [[ ! "$response" =~ ^[Yy]$ ]]; thenecho "Operation cancelled"exit 0fi# 创建备份create_backup# 执行交互式rebaseecho -e "\n${YELLOW}Starting interactive rebase...${NC}"echo -e "${YELLOW}In the editor:${NC}"echo -e "1. Leave the first 'pick' as is"echo -e "2. Change 'pick' to 's' or 'squash' for all other commits"echo -e "3. Save and close the editor"echo -e "4. In the next editor, write your combined commit message"if ! git rebase -i HEAD~"$commits_count"; thenecho -e "${RED}Rebase failed. Restoring from backup...${NC}"git rebase --aborthandle_error "Rebase failed"fi
}# 推送更改
push_changes() {echo -e "\n${YELLOW}Do you want to push changes to remote? (y/n)${NC}"read -r responseif [[ "$response" =~ ^[Yy]$ ]]; thencurrent_branch=$(git branch --show-current)echo -e "${YELLOW}Using force push with lease for safety...${NC}"if git push origin "$current_branch" --force-with-lease; thenecho -e "${GREEN}Successfully pushed changes${NC}"elsehandle_error "Push failed"fifi
}# 主函数
main() {# 检查是否在git仓库中git rev-parse --git-dir > /dev/null 2>&1 || handle_error "Not in a git repository"# 检查是否有改动需要提交if git diff-index --quiet HEAD -- && [ -z "$(git ls-files --others --exclude-standard)" ]; thenecho -e "\n${YELLOW}No changes to stage or commit, skipping...${NC}"else# 添加新的暂存和提交步骤echo -e "\n${YELLOW}Staging all changes...${NC}"git add . || handle_error "Failed to stage changes"echo -e "${GREEN}Successfully staged all changes${NC}"echo -e "\n${YELLOW}Creating stage commit...${NC}"git commit -m "stage commit" || handle_error "Failed to create commit"echo -e "${GREEN}Successfully created stage commit${NC}"fi# 显示提交信息get_commit_info# 显示当前提交历史并获取要压缩的提交数show_recent_commits# 执行squash操作do_squash "$COMMITS_TO_SQUASH"# 推送更改push_changesecho -e "\n${GREEN}All operations completed successfully${NC}"
}# 执行主函数
main

http://www.ppmy.cn/server/154431.html

相关文章

stm32基础(keil创建、Proteus仿真、点亮LED灯,7段数码管)

一、keil的创建 随后点击新建(Ctrln),接着保存到所自己项目工程文件。.c .h都是这样操作 二、Proteus的简单使用 左上角框框内可以拖动 三、点亮LED灯代码 led.c #include "stm32f10x.h" // Device headervoid led_init(…

【学生管理系统】权限管理之用户管理

目录 6. 权限管理 6.1 环境搭建 6.1.1 数据库 6.1.2 后端环境 6.2 用户管理 6.2.1 查询所有用户(关联角色) 6.2.2 核心1:给用户授予角色 6. 权限管理 6.1 环境搭建 6.1.1 数据库 权限管理的5张表的关系 添加4张表 # 权限表&…

DinD docker 嵌套部署踩坑

最近要把一个 web 服务容器化部署。开发的时候没写 dockerfile,部署的时候可头疼死我了。 把相关的依赖在 dockerfile 里装好,写好环境变量用了 6h。然后更重量级的来了,DinD 的路径需要填 host 的路径,container 里调用 docker…

STM32-笔记12-实现SysTick模拟多线程流水灯

1、前言 正常STM32实现多线程,需要移植一个操作系统FreeRTOS。但是在这里不移植FreeRTOS怎么实现多线程呢?使用SysTick,那么怎么使用SysTick来模拟多线程呢?前面我们知道SysTick就是一个定时器,它不是在主函数的while循…

路由器RIP动态路由配置

路由器RIP动态路由配置 目录 实验目的 实验背景 技术原理 配置RIP动态路由的一般步骤 学习任务 实验设备 实验拓扑 实验步骤 实验目的 掌握RIP协议的配置方法:掌握查看通过动态路由协议RIP学习产生的路由;熟悉广域网线缆的链接方式;…

FFmpeg 的常用API

FFmpeg 的常用API 附录:FFmpeg库介绍 库介绍libavcodec音视频编解码核心库编码 (avcodec_send_frame, avcodec_receive_packet)。解码 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音视频流的解析和封装功能,多种多媒体封装格式&…

Flink的Watermark水位线详解

一、Flink的时间语义 Flink有如下三种时间语义: Flink的三种时间语义-CSDN博客 在实际应用中,一般会采用事件时间语义。而正如前面所说的,事件时间语义需要等窗口的数据全部到齐了,才能进行窗口计算。那么,什么时候数…

go语言的成神之路-筑基篇-gin常用功能

第一节-gin参数绑定 目录 第一节-?gin参数绑定 ShouldBind简要概述 功能: 使用场景: 可能的错误: 实例代码 效果展示 第二节-gin文件上传 选择要上传的文件 选择要上传的文件。 效果展示? 代码部分 第三节-gin请求重定向 第…