带有可选参数的git别名

时间:2011-07-08 08:28:25

标签: git parameters alias

我想在推送之前确保我的最新提交具有当前日期。因为我总是在合并+推送之前重新掌握,所以我做了这个别名:

[alias]
    sync = !git commit --amend --date=today && git rebase master

问题是,它一直在启动我的文本编辑器,要求提交新的提交消息。有没有办法有一个可选参数,以便我可以选择使用:

git sync 'my commit message'

git sync

后者只是使用现有的提交消息,无论它发生什么?

2 个答案:

答案 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

- 这可能会奏效。尽管如此,它还是打破了我的头脑,所以请注意。