git别名:多个命令,可变参数

时间:2016-12-29 03:55:34

标签: git git-alias

我经常发现自己打字:

git push remote1 branch1 branch2 tag1 tag2 tag3..
git push remote2 branch1 branch2 tag1 tag2 tag3..

我更喜欢别名,我可以输入它:

git pushall branch1 branch2 tag1 tag2 tag3 ..

注意:我知道我可以使用多个网址创建一个新的远程“all”。我们不在这里讨论,而是专注于别名!

我可以对远程名称进行硬编码,因为我有许多具有相同多个远程名称的项目(通常是“drupal”和“github”)。

到目前为止的进展

我已经找到了一个非变量版本:

[alias]
pushall = "!git push github $1; git push drupal $1; #"

这里有两个技巧

  • 使用双引号来防止';'来自.ini个文件
  • 中的特殊含义
  • #忽略其余部分。

但这只会一次推送一个分支(或标记)。所以我必须输入这个:

git pushall branch1
git pushall branch2
git pushall tag1
git pushall tag2
git pushall tag3
...

我更喜欢别名,我可以输入:

git pushall branch1 branch2 tag1 tag2 tag3 ..

为什么不使用具有多个推送网址的新远程“all”?

如上所述,让我们专注于别名,以便读者找到他们想要的东西。

无论如何,这就是为什么我没有创建一个遥远的“全部”:

  • 每个项目我都必须这样做一次,并且无法在全球范围内完成。就我而言,在全局别名中对远程名称进行硬编码实际上很好!
  • Afaik,我会使用像“all / branch1”这样的ref来污染我的历史,而不是“remote1 / branch1”和“remote2 / branch1”。

讨论此问题的正确位置是pull/push from multiple remote locations

另见

以下是相关的,但它们没有解决可变参数:

以下内容可能会有所帮助,但它会解决纯shell脚本问题,而不是git别名:

4 个答案:

答案 0 :(得分:1)

这可以通过您链接的其他问题得到解答,但为了清楚起见:

[alias]
    pushall = "!git push github \"$@\"; git push drupal \"$@\"; :"

或者从命令行进行设置:

git config --global alias.pushall '!git push github "$@"; git push drupal "$@"; :'

答案 1 :(得分:1)

通过扩展您的初始尝试:

[alias]
pushall = "!git push github $@; git push drupal"

这样,git pushall branch1 branch2 branch3扩展为:

git push github branch1 branch2 branch3; git push drupal branch1 branch2 branch3
#                  |               |                        |               |
#                  +-------+-------+                        +-------+-------+
# these arguments were     |                                        |
# expanded from $@ --------+                                        |
#                                                                   |
#                  these are the arguments of the original command -+

$@扩展到所有命令行参数。
在行尾不需要#;片段git pushall由别名的值替换,参数的其余部分

如果你有一个更大的远程存储库列表,你可以这样写:

[alias]
pushall = "!for repo in github drupal bitbucket; do git push $repo $@; done #"
#                         |               |
#                         +-------+-------+
# put all your repos here         |
# separated by spaces ------------+

这次需要#标志。它将原始论点转化为评论;否则该命令有语法错误,并且它不会运行。

如果你想推送到存储库的所有遥控器,那么你可以写一个更聪明的别名:

pushall = "! for repo in $(git remote); do git push $repo $@; done #"

运行git remote以查找所有遥控器并使用command substitution$(...)替换为git remote命令的输出,然后再继续。

您可以使用以下方法将其定义为全局别名:

$ git config alias.pusha '! for repo in $(git remote); do git push $repo $@; done #'

如果您有一些不希望推送到所有遥控器的回购,您可以将其定义为本地别名,并在您进入存储库时使用thi命令自定义每个仓库中的远程列表: / p>

$ git config --local alias.pusha '! for repo in github drupal; do git push $repo $@; done #'

答案 2 :(得分:1)

将任意脚本打包到git别名中的习惯用法是将它放在shell函数中:

pushall = "! f() { git push github \"$@\"; git push drupal \"$@\"; }; f"

我想指出正确使用$@是将其置于双引号内:"$@"

答案 3 :(得分:0)

仅供记录,以下“作弊”确实有效。这不是一个完整的答案,但对许多人来说可能已经足够好了。

/

是的,这不是真正的变量,因为它仅限于5个参数(或者在创建别名时选择的数字)。它也无法传递[alias] pushall = "!git push github $1 $2 $3 $4 $5; git push drupal $1 $2 $3 $4 $5; :" 等选项。但正如所说,这对你来说可能还不错。

在我的特定用例中,大多数时候我只推了一个分支和一个发布标记,所以两个参数(--key=value)就足够了。

请注意,最后$1 $2似乎与:具有相同的效果。我在stackoverflow上的其他地方学到了这个。

我不会“接受”这个答案,因为我想给别人提供更好的东西。