带有可选参数的git别名

cer*_*ica 7 git parameters alias

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

[alias]
    sync = !git commit --amend --date=today && git rebase master
Run Code Online (Sandbox Code Playgroud)

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

git sync 'my commit message'
Run Code Online (Sandbox Code Playgroud)

要么

git sync
Run Code Online (Sandbox Code Playgroud)

后者将简单地使用现有的提交消息,无论它发生什么?

Chr*_*sen 12

要将额外参数应用于除别名"命令行"结尾之外的任何内容,您需要将shell命令放在脚本中.你可以使用外部脚本(如jdelStrother的答案)来完成它,或者你可以使用"内联"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'\'' -'
Run Code Online (Sandbox Code Playgroud)

这个小脚本的核心是一对条件参数扩展:

${1+-m} "${1---reuse-message=HEAD}"
Run Code Online (Sandbox Code Playgroud)

当您使用额外参数(即替换日志消息)调用它时,这些扩展为两个shell单词:-m "<your new log message>".当您不提供额外参数时,它们只会扩展为一个单词:"--reuse-message=HEAD".

尾随破折号也很重要; 它可以是任何shell单词,关键是必须存在某些东西,因为shell将使用它来初始化它的$0参数(通常有一个默认值,所以它对条件扩展本身没用).


如果我误解了你实际上想要在没有提供额外参数时看到编辑器,那么使用单个扩展${1+-m "$1"}而不是扩展对.


Jon*_*her 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
Run Code Online (Sandbox Code Playgroud)

- 那可能会奏效.它虽然是在我的头顶打字,所以告诫lector.