【发布时间】:2014-04-23 06:05:59
【问题描述】:
我正在尝试编写一个 prepare-commit-msg git hook 脚本来检查最后 10 条提交消息的内容,并检查您尝试输入的消息是否是唯一的并阻止用户签入(没有 --no-verify 重载)如果它检测到它。当我在 Git 中运行这个命令行时,我得到以下输出。
dacke@MachineName /c/Development/Project(测试) $ git log --pretty=format:'%h|%an|%s' --max-count=10 2919dc2|Eric|测试消息 4ef580c|Eric|测试消息 1a0051b|Eric|测试消息 3e2df42|埃里克|测试提交 a08d4c1|Bob|DE6717 - 我做了什么来修复这个缺陷 aff8afc|Bob|DE6717 - 这是更多的缺陷信息 bbbfb67|Ralph|将分支“clean_up”合并到开发中 72d0968|Ralph|忘记从项目中删除已删除的类。 bfd1505|拉尔夫|清理。 d21c6dc|Bruce|将分支“图标”合并到开发中我的 prepare-commit-msg 是这样写的。
1 #!/bin/bash
2
3 printf "Prepare-Commit-Msg Hook Running...\n"
4
5 #$1 = "Commit Message File 'COMMIT_EDITMSG'"
6 #$2 = "message"
7 commitMessage=$(cat "$1")
8
9 # Prevent people putting in the same commit message multiple times by looking for an identical message in the last 10 commits
10 declare -a last10CommitMessages
11 rawMessages=$(git log --pretty=format:'%h|%an|%s«' --max-count=10)
12 printf "Raw Messages Length: %d\n" "${#rawMessages[@]}"
13 for line in ${rawMessages//«/ };
14 do
15 #printf "%s\n" $line
16 last10CommitMessages+=($line);
17 done
18 printf "Last 10 Commit Length: %d\n" "${#last10CommitMessages[@]}"
19
20 # Temp exit 1 to prevent commit during testing
21 exit 1
当我尝试运行“提交”时,我得到以下输出。
原始消息长度:1
最后 10 次提交长度:63
如果我取消注释第 15 行,我可以看到对于每个空格和换行符,我都会将一个项目添加到数组中。最重要的是,我实际上想要分割线的字符被添加到末尾,这意味着我需要另一种方法来将其从末尾删除。
我是 bash 脚本的新手,我来自 C#/Windows 背景,所以我还在学习。有人可以为我提供一个简单的解决方案吗?对我来说,比快速回答更重要的是一个可以解释这实际上是如何工作的答案。我在网上发现了很多对我不起作用的相互矛盾的信息。我计划在弄清楚这一切之后写一篇关于这个的博客文章,所以重要的是我没有得到任何“它只是工作”作为答案。谢谢。
【问题讨论】: