【问题标题】:How to automatically generate commit message如何自动生成提交消息
【发布时间】:2016-05-02 20:17:48
【问题描述】:

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

添加了“dog.h”、“cat.h”

手动提交消息看起来像

添加头文件

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

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

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

【问题讨论】:

  • 只需执行 git status 并提取以“新文件/已删除/修改/重命名”开头的行并将其用作提交注释
  • @AndrewC 好信息。我也相信有一个用于此目的的钩子。可惜OP似乎比这更懒惰,他想要一个无需调出编辑器即可提交的命令:P
  • curl http://whatthecommit.com/index.txt

标签: git commit


【解决方案1】:

如果您真的那么懒惰,您可以使用以下内容。简而言之,它执行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 之间添加行来使提交消息生成逻辑更加通用,并生成看起来更好看的提交消息)

【讨论】:

  • 如果你使用git status --porcelain,你应该只针对git status编写脚本,否则你将来会崩溃
  • 是的,我知道。这只是旨在成为一种快速简便的单线解决方案:P
  • 可以加LANG=c保证英文
  • 我不建议在有正当理由自动执行此类操作时称某人为懒惰。我的意思是,这不就是我们来这里的目的吗?
【解决方案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 采用不同(也许更好)的方法。

【讨论】:

  • FTR 我使用 git 进行短期本地开发,然后提交到不同的存储库。所以我经常“这么懒”,并且定期编写正确的提交消息。
【解决方案3】:

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


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

commit.template

commit.template配置变量。

commit.template

指定一个文件以用作新提交消息的模板。
"~/" 扩展为 $HOME 的值,"~user/" 扩展为指定用户的主目录。

【讨论】:

    【解决方案4】:

    有时我只想提交一条自动生成的消息。该脚本抓取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

    【讨论】:

      【解决方案5】:

      这是@adrian-shum 的命令的变体,它使用git status --porcelain 更加健壮,格式为复制粘贴:下面的可 git 别名:

      此要点中维护的 Git 别名:
      https://gist.github.com/erikw/654386d35ecfdb0354cd2b71763f19ae

      这将产生一个带有消息(最后一行)的提交,例如:

      $ git status --porcelain
      A file1.py
      A file2.py
      A file3.py
      M file4.py
      M file5.py
      D README.md
      R test.txt-> test2.txt
      $ git commit-status
      $ git log --no-decorate -n 1
      bee4f8e Added: file1.py file2.py file3.py Modified: file4.py file5.py Deleted: README.md Renamed: test.txt-> test2.txt
      

      为什么这么复杂的替换?因为修饰符可以分组,例如"RM a -> b" 意味着文件被重命名和修改。

      【讨论】:

        【解决方案6】:

        在这种罕见的情况下,我喜欢使用标准的单字信息,例如“琐碎”。但其他人可能是“无趣”或“添加文件”。重要的部分可能是它的一致性和可识别性。

        但我最近开始使用git leaders,例如“Add”和“Doc”。那么这些信息就更有意义了;例如,“添加:文件”。

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

        【讨论】:

          【解决方案7】:

          希望对您有所帮助,您可以在 .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
          
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2011-05-16
              • 2013-11-13
              • 2012-03-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-09
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多