如何自动生成提交消息

时间:2016-01-26 09:50:08

标签: git commit

在某些(非常)罕见的情况下,我在我的存储库中进行了一些更改,这些更改是如此不言自明,以至于描述我的意图的提交消息有些无用。在这些情况下,我希望提交消息基本上只列出我添加/删除/编辑的文件。例如:

  

添加了' dog.h',' cat.h'

手动提交消息看起来像

  

添加了头文件

在这种情况下,不必实际编写提交消息,而是自动生成提交消息会很好。

我知道这是非常糟糕的做法,但我只会将此用于私人项目的非专业存储库。我知道它很懒,但我很好奇它是如何做到的。 Unix shell脚本是首选,但欢迎使用任何解决方案。

问:有没有办法自动生成git提交消息,列出哪些文件已被更改?

7 个答案:

答案 0 :(得分:9)

如果你真的很懒,你可以使用以下内容。简而言之,它会git status提取new filesdeletedrenamedmodified的行,并将其传递给git commit

# LANG=C.UTF-8 or any UTF-8 English locale supported by your OS may be used
LANG=C git -c color.status=false status \
| sed -n -r -e '1,/Changes to be committed:/ d' \
            -e '1,1 d' \
            -e '/^Untracked files:/,$ d' \
            -e 's/^\s*//' \
            -e '/./p' \
| git commit -F -

调整sed部分,根据git status的结果自定义您希望如何生成消息

将其替换为简短的内容,或将其另存为脚本(例如git-qcommit),以便您可以将其用作git qcommit

来自git log

的示例邮件
adrianshum:~/workspace/foo-git (master) $ git log
commit 78dfe945e8ad6421b4be74cbb8a00deb21477437
Author: adrianshum <foo@bar.com>
Date:   Wed Jan 27 01:53:45 2016 +0000

renamed:    bar.txt -> bar2.txt
modified:   foo.txt

编辑: 将原始grep更改为sed以通过在Changes to be committedUntracked files之间包含行来使提交消息生成逻辑更通用,并生成稍微好看的提交消息)

答案 1 :(得分:2)

如果您没有提供消息(使用-m标志),系统会打开一条自动生成的消息,并要求您对其进行修改(如果您有)。它看起来像:

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch <branch>
# Changes to be committed:
#       deleted:    <deleted files>
#       modified:   <modified files>
#
# Untracked files:
#       <untracked files>

现在您只需从要插入的行中删除#(例如修改后的行)。

我真的不鼓励你这样做,提交信息非常重要。

Related question采用不同(可能更好)的方法。

答案 2 :(得分:1)

您可以使用commit -m命令将任何消息作为提交消息传递。

另一种解决方案是使用模板配置选项来定义默认模板。

commit.template

commit.template 配置变量。

  

commit.template

     

指定要用作新提交消息模板的文件   “〜/”扩展为$ HOME和“~user /”的值到指定用户的主目录。

答案 3 :(得分:0)

有时候我只想提交一条自动生成的消息。该脚本获取git status --porcelain的输出并将其用作提交消息。

#!/usr/bin/env node
var childProcess = require('child_process');
var spawn = childProcess.spawn;

function getStatusMessage() {
  var bash = spawn('bash');
  bash.stdin.end('git status --porcelain');

  return new Promise(function (resolve) {
    bash.stdout.on('data',function (data) {
      resolve(data.toString());
    });
  });
}

getStatusMessage().then(function (statusMessage) {
  var bash = spawn('bash');
  bash.stdin.end('git commit -m "'+statusMessage+'"');
  bash.stdout.on('data',function (data) {
    console.log(data.toString());
  });
  bash.stderr.on('data',function (data) {
    console.log(data.toString());
  });
});

这里是a gist

答案 4 :(得分:0)

在这种罕见的情况下,我喜欢使用标准的单词消息,例如“琐碎的”。但是其他人可能是“无趣的”或“ addfiles”。重要的部分可能是一致且可识别的。

但是我最近开始使用git leaders之类的“添加”和“文档”。因此,这些消息更具意义。例如“添加:文件”。

如果您正在寻找一种有趣的方式,并且您的团队知道荒谬的消息意味着这是微不足道的提交,请使用http://whatthecommit.com/自动生成幽默消息。

答案 5 :(得分:0)

希望这会有所帮助,您可以在.bashrc中的ls部分的别名下配置别名,如下所示

alias gitit="git commit -pm '`git status -s` Edit# `git log | grep commit | wc -l`'; git push"

这是什么

  1. 向您显示所做的更改,并用y / n提示您在提交(-p)中暂存这些更改
  2. 提交一条消息(-m),该消息包含使用git status -s进行的更改以及自分支开始git log | grep commit | wc -l'以来的更改数量
  3. 推动更改

示例在下面运行

tr@tr-work:~/Gits/devops-ansible-roles$ gitit

diff --git a/README.md b/README.md
index 0ba82f15..dd8be086 100755
--- a/README.md
+++ b/README.md
@@ -3,4 +3,7 @@
 ==============================================================

 This repository is a collection of Ansible Roles and associated artifacts for executing those roles such as scripts, templates and variable files.
-These roles are called by Jenkins Pipelines defined in the devops-jenkins-pipelines repo.
\ No newline at end of file
+These roles are called by Jenkins Pipelines defined in the devops-jenkins-pipelines repo.
+
+
+//
(1/1) Stage this hunk [y,n,q,a,d,e,?]? y

[feature/DO-389_manage_dbs c6dfacf8]  M README.md Edit# 184
 1 file changed, 4 insertions(+), 1 deletion(-)
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 314 bytes | 314.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: 
remote: Create pull request for feature/DO-389_manage_dbs:
remote:   https://bitbucket.org/retracted/devops-ansible-roles/pull-requests/new?source=feature/DO-389_manage_dbs&t=1
remote: 
To bitbucket.org:retracted/devops-ansible-roles
   4e14490e..c6dfacf8  feature/DO-389_manage_dbs -> feature/DO-389_manage_dbs
tr@tr-work:~/Gits/devops-ansible-roles$ git log
commit c6dfacf825e6c325bb579de29305d82a7b6bd07d (HEAD -> feature/DO-389_manage_dbs, origin/feature/DO-389_manage_dbs)
Author: Tanveer Roowala <tanveer.roowala@retracted.com>
Date:   Sat May 16 13:58:31 2020 +1000

     M README.md Edit# 184

答案 6 :(得分:0)

我所做的是在保持编辑器窗口打开的同时保存文件,然后并行使用 sed 脚本进行编辑。例如,您可以使用 sed -n '/new/ s/#//gp' commit_file 并且当您满意时切换到 sed -i 以字符串上的 //g 结尾。然后重新读取文件,如果您使用的是 nano,请按 CTRL+R commit_file,如果您想进行一些手动编辑并退出