一个可以自动化 git commit 消息内容的 bash 脚本

voi*_*ter 0 scripting git

通常,当我在 Git 中提交对子模块的更改时(如果这是唯一的更改),我会将结果提供git diff <submodule-name>给提交消息的正文(在我的 git 配置中diff.submodule设置为log)。所以消息看起来像:

Updated Core Submodule

Submodule Core eaedd3f..0721763:
  < Fixed ZA-123: Crash in rendering module
  < Merge 'develop' into 'master'
Run Code Online (Sandbox Code Playgroud)

我一直在尝试编写一个脚本来自动执行此操作,我可以将其绑定到我的 git 配置中的别名。要生成上面的文本,理想情况下我想运行一个命令,例如:

$ git submodule-commit Core
Run Code Online (Sandbox Code Playgroud)

这将执行以下操作(大致):

  1. 暂存对指定子模块的任何更改(Core在本例中)
  2. 区分对子模块的更改并存储稍后生成的消息的输出文本
  3. 运行git commit并提供主题行(Updated $1 Submodule,或者类似的东西,在这个例子中$1是哪里Core)。
  4. 将之前存储的差异结果也添加到提交消息中

我没有运气为此编写一个简单的脚本。我对 bash / shell 脚本不是很有经验。任何人都可以帮助提供实现此目的的实现吗?

War*_*ung 5

您在这里缺少的关键语法是:

git commit -m "$(printf "Updated $submodule Submodule\n\n" ; git diff $submodule)"
Run Code Online (Sandbox Code Playgroud)

$()在双引号内使用命令替换的形式将git diff...to的输出发送git commit为带有完整换行符的提交消息。

printf在这里使用而不是echo在主题行前面加上,因为对于任何稍微复杂的事情——比如处理嵌入式转义——echo基本上都是不可移植的,因为历史原因。

脚本的其余部分留给学生作为练习。:)