背景
在现代软件开发中,版本控制系统如Git已成为不可或缺的工具。然而,不同的团队和项目可能会使用不同的Git客户端,这有时会导致工作流程的不一致。本文将介绍一个解决SourceTree和TortoiseGit日志格式差异的自动化解决方案。
在我的日常开发中,我偏好使用SourceTree进行Git操作。然而,我司要求在解决JIRA问题时,使用TortoiseGit的"Show Log -> Full data"格式来提交日志。这就导致很多时候需要在两种Git工具之间频繁切换,工作流不够丝滑。 看到Sourcetree的自定义操作功能,想到能否开发一个脚本,先拉取到标准格式的git log,然后转换成TortoiseGit的样式,以此来消除对TortoiseGit的依赖,合并工作流。
实践成功,遂分享给大家。
解决方案
利用SourceTree的自定义操作功能,我开发了一个脚本来自动化实现这个过程。这个脚本能够实现:
- 获取标准格式的Git日志
- 将其转换为TortoiseGit所要求的格式,并自动复制到剪切板
- 无缝集成到SourceTree的工作流中
脚本内容
脚本使用批处理(.bat)格式编写,主要功能包括:
- 接收Git提交的SHA值
- 提取相关的提交信息
- 按照TortoiseGit的格式重新组织信息
- 输出格式化后的日志并复制到剪切板
@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
if "%~1"=="" (
echo 错误:请提供 Git commit SHA 作为参数。
echo 用法:%0 [commit SHA]
exit /b 1
)
set "sha=%~1"
set "tempfile=%temp%\git_log_temp.txt"
set "finalfile=%temp%\git_log_final.txt"
:: 获取提交信息
git log -1 --pretty=format:"Revision: %%H%%nAuthor: %%an <%%ae>%%nDate: %%ad%%nMessage:%%n%%B" --date=format:"%%Y/%%m/%%d %%H:%%M:%%S" %sha% > "%tempfile%"
echo ---- >> "%tempfile%"
:: 获取并处理文件变更信息
for /f "tokens=1,*" %%a in ('git show --name-status --format^="" %sha%') do (
set "status=%%a"
set "file=%%b"
if "!status!"=="M" (
echo Modified: !file! >> "%tempfile%"
) else if "!status!"=="A" (
echo Added: !file! >> "%tempfile%"
) else if "!status!"=="D" (
echo Deleted: !file! >> "%tempfile%"
) else (
echo !status! !file! >> "%tempfile%"
)
)
:: 删除所有空行并保存到最终文件
findstr /v /r "^$" "%tempfile%" > "%finalfile%"
:: 显示处理后的内容
type "%finalfile%"
:: 将处理后的内容复制到剪贴板
type "%finalfile%" | clip
:: 清理临时文件
del "%tempfile%"
del "%finalfile%"
echo.
echo log full data 已复制到剪贴板。
SourceTree集成步骤
- 打开SourceTree,进入"工具" -> "选项"菜单
- 导航至"自定义操作"页面
- 添加新的自定义操作:
- 指定脚本文件路径
- 设置$SHA参数,使脚本能在特定提交上执行
- 配置脚本在右键菜单中的显示名称
- 配置完成后,用户可以在任意提交记录上右键,选择自定义操作来执行脚本
结语
仓鼠目前工作时间一年多,在大学自学期间整理了90w字的知识库,涵盖数据结构与算法,JDK源码分析,并发编程,JVM,常用数据库,操作系统,计算机基础,计算机网络,架构设计,设计模式,场景设计,等等,相对比较全面。最近在利用业余时间,结合工作后的全新视野,对已有知识库进行深度重构,最近也会陆陆续续发一些文章,希望与各位共同探讨。