Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有可选参数的git别名_Git_Parameters_Alias - Fatal编程技术网

带有可选参数的git别名

带有可选参数的git别名,git,parameters,alias,Git,Parameters,Alias,在推送之前,我希望确保我的最新提交具有当前日期。由于我总是在合并+推送之前将基础重设为master,因此我使用了以下别名: [alias] sync = !git commit --amend --date=today && git rebase master 问题是,它不断启动我的文本编辑器,要求提交新消息。是否有一个可选参数,以便我可以选择使用: git sync 'my commit message' 或 后者将简单地使用现有的提交消息,不管它是什么?当您的别名

在推送之前,我希望确保我的最新提交具有当前日期。由于我总是在合并+推送之前将基础重设为master,因此我使用了以下别名:

[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”)”
,这正是我用来创建别名(对我有效)的命令is
git-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}"