带有可选参数的git别名
在推送之前,我希望确保我的最新提交具有当前日期。由于我总是在合并+推送之前将基础重设为master,因此我使用了以下别名:带有可选参数的git别名,git,parameters,alias,Git,Parameters,Alias,在推送之前,我希望确保我的最新提交具有当前日期。由于我总是在合并+推送之前将基础重设为master,因此我使用了以下别名: [alias] sync = !git commit --amend --date=today && git rebase master 问题是,它不断启动我的文本编辑器,要求提交新消息。是否有一个可选参数,以便我可以选择使用: git sync 'my commit message' 或 后者将简单地使用现有的提交消息,不管它是什么?当您的别名
[alias]
sync = !git commit --amend --date=today && git rebase master
问题是,它不断启动我的文本编辑器,要求提交新消息。是否有一个可选参数,以便我可以选择使用:
git sync 'my commit message'
或
后者将简单地使用现有的提交消息,不管它是什么?当您的别名开始变得更复杂时,为它们创建一个单独的脚本可能是最简单的。如果将文件“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
-那可能行得通。不过,它是在我的头顶上键入的,所以请注意选择器。要将额外参数应用于除别名“命令行”结尾以外的任何内容,您需要将shell命令放入脚本中。您可以使用外部脚本(如)完成,也可以使用“内联”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”“
。如果不提供额外的参数,它们将扩展为一个单词:“--reuse message=HEAD”
尾随破折号也很重要;它可以是任何shell单词,关键是必须存在某些内容,因为shell将使用它初始化其$0
参数(该参数通常有一个默认值,因此它对条件扩展本身没有用处)
如果我误解了,并且您确实希望在不提供额外参数的情况下看到编辑器,那么请使用单个扩展
${1+-m“$1”}
,而不是一对扩展。这个想法是正确的,但此脚本不执行条件执行(&&
)就像OP的原始代码一样。--reuse message=HEAD正是我想要的,但是脚本并没有按照我的预期工作。无论我是否提供参数,commit命令似乎都会使用现有消息,而rebase命令总是返回一个错误:当没有提供参数时,我得到“致命:需要一个单一修订无效上游主控”当提供参数时,我得到“用法:git rebase…”@ceramica它对我有效(既提供新消息,又重复使用旧消息,以及随后的重新基址),但我必须使用--date=today
,因为这是无效的。我使用了--date=“$(date“+%s%z”)”
,这正是我用来创建别名(对我有效)的命令isgit-config--global alias.sync'!sh-c'\'git commit--amend--date=“$(date”+%s%z”)“${1+-m}”${1--reuse message=HEAD}”和&git-rebase master'\'\''''''''''-
。我终于让它工作了,但我不得不手动将.git-config中的别名更改为:“!sh-c'git commit--amend--date date date today${1+-reuse message HEAD\“git rebase master”-”
我不知道为什么它需要额外的引号,但是需要;
来分隔命令表明第一个命令失败了。但是,它似乎工作正常。可能是
${1+-m} "${1---reuse-message=HEAD}"