我正在prepare-commit-msg
钩子中使用此衬纸在提交消息之前添加自定义字符串:
echo "text " | cat - $COMMIT_MSG_FILE > /tmp/out && mv /tmp/out $COMMIT_MSG_FILE
[不幸的是,每个提交消息在下一行都延续“文本”,后跟CRLF和其余的提交消息。例如,如果提交消息为:"Commit 123"
,则新的提交消息为
"text
Commit 123"
而不是我想要的"textCommit 123"
。
知道我缺少什么吗?
不要将您的echo语句发送给cat。而是在回显字符串中使用cat语句的命令替换:
echo "text $(cat $COMMIT_MSG_FILE)" > /tmp/out && mv /tmp/out $COMMIT_MSG_FILE
echo
打印换行符。使用不使用的命令:根据您的echo -n
年份,可能为echo
,或者如果您有printf
,则为:
echo -n "text " | cat - $COMMIT_MSG_FILE > /tmp/out && mv /tmp/out $COMMIT_MSG_FILE
dGot14U's method using command substitution也可以。还考虑使用就地sed
:
sed -i '' '1s/^/text /' $COMMIT_MSG_FILE
[当-i
是否需要单独的空字符串参数''
时,如此处所示,取决于OS:MacOS sed
要求一个,Linux sed
禁止一个。我已经在脚本中使用过这个:
if sed --version >/dev/null 2>&1; then
# apparently this is gnu sed, so -i requires the extension attached
sedinplace="-i"
else
# apparently this is BSD/MacOS sed, so -i requires a separate argument
sedinplace="-i ''"
fi
# ...
sed $sedinplace -e cmd1 -e cmd2 $file
$sedinplace
然后扩展为正确的内容。