解决方案
好吧,您可以自己轻松实现这样的功能。
基本上我将提交命令嵌入到了一个 shell 脚本中。此脚本将首先替换所需的宏,然后提交更改。该项目由两个文件组成:
内容?
keysub
,一个 bash shell 脚本和keysub.awk
一个 awk 脚本来替换特定文件中的关键字。第三个文件是一个配置文件,其中包含应该替换的值(除了提交计数和时间戳等变量内容)。
你如何使用它?
您使用相同的选项调用keysub
而不是提交。-m
or选项应该在-a
任何其他提交选项之前。一个新选项(应该始终放在第一位)是-f
将配置文件作为值。例子:
$ git add 'someJavaFile.java'
$ keysub -m 'fixed concurrent thread issue'
$ git push
或者
$ git -f .myfile.cnf -m 'enhanced javadoc entries'
键子
#!/bin/bash
# 0 -- functions/methods
#########################
# <Function description>
function get_timestamp () {
date # change this to get a custom timestamp
}
# 1 -- Variable declarations
#############################
# input file for mapping
file=".keysub.cnf"
timestamp=$(get_timestamp)
# 2 -- Argument parsing and flag checks
########################################
# Parsing flag-list
while getopts ":f:m:a" opt;
do
case $opt in
f) file=${OPTARG}
;;
a) echo 'Warning, keyword substitution will be incomplete when invoked'
echo 'with the -a flag. The commit message will not be substituted into'
echo 'source files. Use -m "message" for full substitutions.'
echo -e 'Would you like to continue [y/n]? \c'
read answer
[[ ${answer} =~ [Yy] ]] || exit 3
unset answer
type="commit_a"
break
;;
m) type="commit_m"
commitmsg=${OPTARG}
break
;;
\?) break
;;
esac
done
shift $(($OPTIND - 1))
# check file for typing
if [[ ! -f ${file} ]]
then
echo 'No valid config file found.'
exit 1
fi
# check if commit type was supplied
if [[ -z ${type} ]]
then
echo 'No commit parameters/flags supplied...'
exit 2
fi
# 3 -- write config file
#########################
sed "
/timestamp:/ {
s/\(timestamp:\).*/\1${timestamp}/
}
/commitmsg:/ {
s/\(commitmsg:\).*/\1${commitmsg:-default commit message}/
}
" ${file} > tmp
mv tmp ${file}
# 4 -- get remaining tags
##########################
author=$(grep 'author' ${file} | cut -f1 -d':' --complement)
# 5 -- get files ready to commit
#################################
git status -s | grep '^[MARCU]' | cut -c1-3 --complement > tmplist
# 6 -- invoke awk and perform substitution
###########################################
# beware to change path to your location of the awk script
for item in $(cat tmplist)
do
echo ${item}
awk -v "commitmsg=${commitmsg}" -v "author=${author}" \
-v "timestamp=${timestamp}" -f "${HOME}/lib/awk/keysub.awk" ${item} \
> tmpfile
mv tmpfile ${item}
done
rm tmplist
# 5 -- invoke git commit
#########################
case ${type} in
"commit_m") git commit -m "${commitmsg}" "$@"
;;
"commit_a") git commit -a "$@"
;;
esac
# exit using success code
exit 0
keysub.awk
# 0 BEGIN
##########
BEGIN {
FS=":"
OFS=": "
}
# 1 parse source files
########################
# update author
$0 ~ /.*\$Author.*\$.*/ {
$2=author " $"
}
# update timestamp
$0 ~ /.*\$LastChangedDate.*\$.*/ {
$0=$1
$2=timestamp " $"
}
# update commit message
$0 ~ /.*\$LastChangeMessage.*\$.*/ {
$2=commitmsg " $"
}
# update commit counts
$0 ~ /.*\$Rev.*\$.*/ {
++$2
$2=$2 " $"
}
# print line
{
print
}
配置文件
author:ubunut-420
timestamp:Fri Jun 21 20:42:54 CEST 2013
commitmsg:default commit message
评论
我已经尝试过足够好的文档,以便您可以轻松地实现它并根据您自己的个人需求对其进行修改。请注意,您可以为宏指定任何您想要的名称,只要您在源代码中对其进行修改即可。我还打算让扩展脚本相对容易,你应该能够相当容易地添加新的宏。如果你对扩展或修改脚本感兴趣,你可能也想看看 .git 目录,那里应该有很多信息可以帮助增强脚本,因为我没有时间调查该文件夹。