如何自动生成提交信息
How to automatically generate commit message
在某些(非常)罕见的情况下,我在我的存储库中进行了一些不言自明的更改,以至于描述我的意图的提交消息有点无用。在这些情况下,我希望提交消息基本上只列出我拥有的文件 added/removed/edited。例如:
Added 'dog.h', 'cat.h'
手动提交消息看起来像
Added header files
在这种情况下,最好不必实际编写提交消息,而是自动生成它。
我知道这是非常糟糕的做法,但我只会将其用于用于私人项目的非专业存储库。我知道这很懒惰,但我很好奇如何做到这一点。首选 Unix shell 脚本,但欢迎任何解决方案。
问: 有没有办法自动生成 git 提交消息,列出已更改的文件?
如果您不提供消息(使用 -m
标志),将打开 auto-generated 消息并要求您修改(如果您使用)。看起来像:
# 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 采用不同(也许更好)的方法。
您可以使用 commit -m
命令将任何消息作为您的提交消息传递。
另一个解决方案是使用模板配置选项来定义默认模板。
commit.template
有commit.template
配置变量。
Specify a file to use as the template for new commit messages.
"~/" is expanded to the value of $HOME and "~user/" to the specified user’s home directory.
如果你真的那么懒,你可以使用下面的方法。简而言之,它执行 git status
,提取 new files
、deleted
、renamed
和 modified
的行,并将其传递给 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 committed
和 Untracked files
之间包含行来使提交消息生成逻辑更加通用,并生成稍微更好看的提交消息)
有时我只想提交一条自动生成的消息。此脚本获取 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。
在极少数情况下,我喜欢使用标准的单字消息,例如 "trivial"。但其他人可能是 "uninteresting" 或 "addfiles"。重要的部分可能是它的一致性和可识别性。
但我最近开始像 "Add" 和 "Doc" 一样使用 git leaders。那么这些消息就更有意义了;例如,"Add: files".
如果您正在寻找一种有趣的方式,并且您的团队知道荒谬的消息意味着这是一个微不足道的提交,请使用 http://whatthecommit.com/ 自动生成幽默的消息。
希望这对您有所帮助,您可以在 .bashrc 中配置别名,在 ls 部分的别名下,如下所示
alias gitit="git commit -pm '`git status -s` Edit# `git log | grep commit | wc -l`'; git push"
这是做什么的
- 显示您所做的更改并提示您 y/n 在提交中暂存它们 (-p)
- 提交一条消息 (-m),其中包含使用
git status -s
所做的更改以及自分支开始后的更改次数 git log | grep commit | wc -l
'
- 推动变革
下面的例子运行
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
我所做的是保存文件,同时让编辑器 window 打开,然后并行使用 sed 脚本进行编辑。例如,您可以使用 sed -n '/new/ s/#//gp' commit_file 并且当您满意时切换到 sed -i 在字符串上仅以 //g 结尾。然后重新读取文件,如果您使用的是 nano,请按 CTRL+R commit_file 并且如果您想进行一些手动编辑并退出
这是 @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”表示文件已重命名和修改。
在某些(非常)罕见的情况下,我在我的存储库中进行了一些不言自明的更改,以至于描述我的意图的提交消息有点无用。在这些情况下,我希望提交消息基本上只列出我拥有的文件 added/removed/edited。例如:
Added 'dog.h', 'cat.h'
手动提交消息看起来像
Added header files
在这种情况下,最好不必实际编写提交消息,而是自动生成它。
我知道这是非常糟糕的做法,但我只会将其用于用于私人项目的非专业存储库。我知道这很懒惰,但我很好奇如何做到这一点。首选 Unix shell 脚本,但欢迎任何解决方案。
问: 有没有办法自动生成 git 提交消息,列出已更改的文件?
如果您不提供消息(使用 -m
标志),将打开 auto-generated 消息并要求您修改(如果您使用)。看起来像:
# 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 采用不同(也许更好)的方法。
您可以使用 commit -m
命令将任何消息作为您的提交消息传递。
另一个解决方案是使用模板配置选项来定义默认模板。
commit.template
有commit.template
配置变量。
Specify a file to use as the template for new commit messages.
"~/" is expanded to the value of $HOME and "~user/" to the specified user’s home directory.
如果你真的那么懒,你可以使用下面的方法。简而言之,它执行 git status
,提取 new files
、deleted
、renamed
和 modified
的行,并将其传递给 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 committed
和 Untracked files
之间包含行来使提交消息生成逻辑更加通用,并生成稍微更好看的提交消息)
有时我只想提交一条自动生成的消息。此脚本获取 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。
在极少数情况下,我喜欢使用标准的单字消息,例如 "trivial"。但其他人可能是 "uninteresting" 或 "addfiles"。重要的部分可能是它的一致性和可识别性。
但我最近开始像 "Add" 和 "Doc" 一样使用 git leaders。那么这些消息就更有意义了;例如,"Add: files".
如果您正在寻找一种有趣的方式,并且您的团队知道荒谬的消息意味着这是一个微不足道的提交,请使用 http://whatthecommit.com/ 自动生成幽默的消息。
希望这对您有所帮助,您可以在 .bashrc 中配置别名,在 ls 部分的别名下,如下所示
alias gitit="git commit -pm '`git status -s` Edit# `git log | grep commit | wc -l`'; git push"
这是做什么的
- 显示您所做的更改并提示您 y/n 在提交中暂存它们 (-p)
- 提交一条消息 (-m),其中包含使用
git status -s
所做的更改以及自分支开始后的更改次数git log | grep commit | wc -l
' - 推动变革
下面的例子运行
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
我所做的是保存文件,同时让编辑器 window 打开,然后并行使用 sed 脚本进行编辑。例如,您可以使用 sed -n '/new/ s/#//gp' commit_file 并且当您满意时切换到 sed -i 在字符串上仅以 //g 结尾。然后重新读取文件,如果您使用的是 nano,请按 CTRL+R commit_file 并且如果您想进行一些手动编辑并退出
这是 @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”表示文件已重命名和修改。