我想在推送之前确保我的最新提交具有当前日期。因为我总是在合并+推送之前重新掌握,所以我做了这个别名:
[alias]
sync = !git commit --amend --date=today && git rebase master
问题是,它一直在启动我的文本编辑器,要求提交新的提交消息。有没有办法有一个可选参数,以便我可以选择使用:
git sync 'my commit message'
或
git sync
后者只是使用现有的提交消息,无论它发生什么?
答案 0 :(得分:12)
要将额外参数应用于除别名“命令行”末尾之外的任何内容,您需要将shell命令放在脚本中。您可以使用外部脚本(如jdelStrother’s answer)执行此操作,也可以使用“内联”shell脚本执行此操作。
您可以使用-m
向新邮件提供git commit
,或使用-C HEAD
/ --reuse-message=HEAD
选项让其使用现有邮件和作者(它也会重复使用)作者时间戳,但您正在使用--date=…
重置该时间戳。使用这些选项中的任何一个都会阻止Git为您的提交消息打开编辑器。
这里是一个“内联”shell脚本:
git config --global alias.sync '!sh -c '\''git commit --amend --date=today ${1+-m} "${1---reuse-message=HEAD}" && git rebase master'\'' -'
这个小脚本的核心是一对条件参数扩展:
${1+-m} "${1---reuse-message=HEAD}"
当您使用额外参数(即替换日志消息)调用它时,这些会扩展为两个shell单词:-m "<your new log message>"
。当您不提供额外参数时,它们只会扩展为一个单词:"--reuse-message=HEAD"
。
尾随破折号也很重要;它可以是任何shell单词,重点是必须存在某些东西,因为shell将使用它来初始化它的$0
参数(通常有一个默认值,所以它对条件扩展本身没用)。 / p>
如果我误解了你实际上想要在没有提供额外参数时看到编辑器,那么使用单个扩展${1+-m "$1"}
而不是扩展对。
答案 1 :(得分:6)
当你的别名开始变得越来越复杂时,最简单的方法就是为它们创建一个单独的脚本。如果你在你的路径中添加一个'git-sync'文件,当你进行'git sync'时会自动调用它。
因此,如果您使用 -
的内容创建该文件#!/bin/sh
if [ -z "$1" ]; then
git commit --amend --date=today
else
git commit --amend --date=today -m "$1"
fi
git rebase master
- 这可能会奏效。尽管如此,它还是打破了我的头脑,所以请注意。