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

git自动压缩提交的脚本

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

  • git add
  • git commit
  • git squash

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

相关文章:

git自动压缩提交的脚本

可以将当前未提交的代码自动执行 git addgit commitgit squash Git 命令安装指南 1. 创建脚本目录 如果目录不存在,创建它: mkdir -p ~/.local/bin2. 创建脚本文件 vim ~/.local/bin/git-squash将完整的脚本代码复制到此文件中。 3. 设置脚本权限…...

Kinova在开源家庭服务机器人TidyBot++研究里大展身手

在科技日新月异的今天,机器人技术在家庭场景中的应用逐渐成为现实,改变着我们的生活方式。今天,我们将深入探讨一篇关于家用机器人研究的论文,剖析其中的创新成果, 论文引用链接:http://tidybot2.github.i…...

使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径

使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径 一、前言二、文件上传的基本概念三、环境准备1. 引入依赖2. 配置文件设置application.yml 配置示例:application.properties 配置示例: 四、编写文件上传功能代码1. 控制器类2. …...

《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS技术理念

1.2 技术理念 在万物智联时代重要机遇期,HarmonyOS结合移动生态发展的趋势,提出了三大技术理念(如下图3-1所示):一次开发,多端部署;可分可合,自由流转;统一生态&#xf…...

将多个 k8s yaml 配置文件合并为一个文件

如下bash脚本实现功能 “将多个k8s的yaml 配置文件” 合并为一个 yaml,使用 --- 分割文件配置。 创建文件 merge_yaml.sh ,内容如下: #!/bin/bash# 默认参数 input_patterns() # 匹配的文件模式数组 output_file"combined.yaml"…...

Linux 文件的特殊权限—Sticky Bit(SBIT)权限

本文为Ubuntu Linux操作系统- 第十九期~~ 其他特殊权限: 【SUID 权限】和【SGID 权限】 更多Linux 相关内容请点击👉【Linux专栏】~ 主页:【练小杰的CSDN】 文章目录 Sticky(SBIT)权限基本概念Sticky Bit 的表示方式举例 设置和取…...

MIPI D-PHY/C-PHY/M-PHY 高速串行接口标准

MIPI D-PHY、C-PHY和M-PHY都是MIPI联盟制定的高速串行接口标准。它们都具有低功耗、高速传输速率等特点,但各有侧重: ➢MIPI D-PHY:适用于手机与其他设备之间的数据传输。 ➢MIPI C-PHY:专为手机摄像头而设计。 ➢MIPI M-PHY&am…...

USB免驱IC读写器QT小程序开发

USB免驱全协议IC卡读写器QT小程序开发,读取15693卡。 QT小程序UI开发界面: QT程序代码mainWindow.cpp代码如下: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this); }MainWind…...

OSCP靶场训练冒险之kioprix4:shell逃逸以及利用数据库提权

声明! 学习资源来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...

NIPS2014 | GAN: 生成对抗网络

Generative Adversarial Nets 摘要-Abstract引言-Introduction相关工作-Related Work对抗网络-Adversarial Nets理论结果-Theoretical Results实验-Experiments优势和不足-Advantages and disadvantages缺点优点 结论及未来工作-Conclusions and future work研究总结未来研究方…...

Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档

目录 一、接口测试基础概念 1、什么是接口 2、接口的类型 3、什么是接口测试 4、为什么要做接口测试 5、接口测试的实现方式 6、什么是自动化接口测试? 二、接口返回的数据格式 1、三种格式 2、Json 三、接口协议 1、webservice协议 2、dubbo协议 3、…...

Linux系统编程——详解页表

目录 一、前言 二、深入理解页表 三、页表的实际组成 四、总结: 一、前言 页表是我们之前在讲到程序地址空间的时候说到的,它是物理内存到进程程序地址空间的一个桥梁,通过它物理内存的数据和代码才能映射到进程的程序地址空间中&#xff…...

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中,由于默认ID是通过UUID创建的,缺乏足够的安全性,决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下: HttpSe…...

循环对称复高斯分布(Circularly Symmetric Complex Gaussian Distribution)

一、引言 循环对称复高斯分布(Circularly Symmetric Complex Gaussian Distribution,简称CSCG)在无线通信、信号处理等领域具有广泛的应用。作为一种特殊的复高斯分布,CSCG具有独特的性质,如循环对称性、高斯性等&…...

xinput1_3.dll放在哪里?当xinput1_3.dll丢失时的应对策略:详细解决方法汇总

在计算机系统的运行过程中,我们偶尔会遇到一些令人困扰的问题,其中xinput1_3.dll文件丢失就是较为常见的一种情况。这个看似不起眼的动态链接库文件,实则在许多软件和游戏的正常运行中发挥着至关重要的作用。一旦它丢失,可能会导致…...

基于STM32的智能家居环境监控系统设计

目录 引言系统设计 硬件设计软件设计系统功能模块 环境监控模块控制模块显示模块系统实现 硬件实现软件实现系统调试与优化结论与展望 1. 引言 随着智能家居技术的发展,环境监控系统已经成为家居管理的重要组成部分。智能家居环境监控系统通过实时监测室内温度、湿…...

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后,开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量:确保系统能够找到所需的工具。 export PATH$PATH:/p…...

大表:适用于结构化数据的分布式存储系统

大家觉得有意义和帮助记得及时关注和点赞!!! 译者序摘要1 引言2 数据模型 2.1 行(Row)2.2 Column Families(列族) 2.2.1 设计2.2.2 column key 的格式:family:qualifier2.2.3 访问控制和磁盘/内存记账(acco…...

深入解析MVCC中Undo Log版本底层存储读取逻辑

一、引言 多版本并发控制(MVCC,Multi-Version Concurrency Control)是一种广泛应用于关系数据库管理系统中的并发控制技术。它通过保存数据的历史版本,使得在事务并发执行时,每个事务都能看到数据的一致性视图。在MVC…...

游戏引擎学习第64天

代码改的我看的比较懵 原视频可以去这个网站去看 https://guide.handmadehero.org/ 回顾我们在模拟区域方面的进展 在目前的情况下,如果有很多任务需要完成,可以进行分解。在昨天收到的改变中,决定将任务分解成模拟区域。模拟区域是可以随时…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...