You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Git提交日志图形中添加自定义可执行程序的动态信息?

可行!用Git结合自定义脚本实现带动态信息的提交图

完全可以实现你要的效果,Git的--pretty=format参数支持通过外部命令调用插入动态内容,刚好能满足你添加CI状态、部署标签的需求。下面是具体实现步骤:

1. 核心原理:Git的动态格式化占位符

Git的格式化语法中,%(command:脚本路径 参数)可以执行指定的可执行脚本,并将脚本的输出直接插入到日志行中。我们只需要编写一个能根据提交哈希返回对应状态的脚本,再把它嵌入到git log的格式化规则里即可。

2. 编写自定义状态查询脚本

先写一个脚本(比如命名为commit-status.sh),让它接收提交哈希作为参数,返回你需要的状态文本(比如[DEPLOYED-DEV1]、[TESTS OK])。以下是示例脚本,你可以根据实际场景修改逻辑:

#!/bin/bash
COMMIT_HASH="$1"

# 验证提交哈希合法性
if ! git rev-parse --verify "$COMMIT_HASH" >/dev/null 2>&1; then
    echo ""
    exit 0
fi

# ---------- 替换成你的实际逻辑 ----------
# 示例1:检查提交是否在生产部署分支
if git branch --contains "$COMMIT_HASH" | grep -q "prod"; then
    echo -e "\033[32m[DEPLOYED-PROD]\033[0m" # 绿色标记生产部署
# 示例2:模拟查询CI测试结果(实际可换成调用CI API)
elif git log --grep="CI_FAILED" --oneline "$COMMIT_HASH" | grep -q "."; then
    echo -e "\033[31m[FAILED 12]\033[0m" # 红色标记测试失败
else
    echo -e "\033[33m[TESTS OK]\033[0m" # 黄色标记测试通过
fi

给脚本添加执行权限:

chmod +x commit-status.sh

3. 构造最终的git log命令

把脚本嵌入到git log的格式化规则中,结合你需要的--graph、--oneline等参数:

git log --graph --all --decorate --pretty=format:"%C(auto)* %h %%(command:./commit-status.sh %h) %s" | sed 's/  / /g'

参数解释:

  • %C(auto):保留Git默认的颜色渲染(分支、提交的颜色区分)
  • %h:显示短提交哈希
  • %%(command:./commit-status.sh %h):执行自定义脚本,传入当前提交的短哈希(注意shell环境下需要用两个%转义,直接在Git配置里用一个%即可)
  • %s:显示提交标题
  • sed 's/ / /g':处理脚本返回空的情况,避免出现连续空格

4. 做成Git别名(可选,方便日常使用)

把命令添加到Git别名里,以后直接用git log-with-status调用:

打开~/.gitconfig文件,添加以下内容:

[alias]
    log-with-status = !git log --graph --all --decorate --pretty=format:\"%C(auto)* %h %(command:./commit-status.sh %h) %s\" | sed 's/  / /g'

注意事项

  • 执行效率:如果仓库提交量很大,每个提交都执行一次脚本会变慢,建议给脚本加缓存逻辑(比如把查询过的提交状态存在本地文件,下次直接读取)。
  • 脚本路径:确保脚本放在Git仓库根目录,或者用绝对路径指定脚本位置,避免Git找不到。
  • 颜色自定义:脚本里的ANSI颜色码可以根据需求调整,比如用\033[34m表示蓝色,\033[0m恢复默认颜色。

内容的提问来源于stack exchange,提问作者Ondra Žižka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 22:47:02