4

我经常发现自己在打字:

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

我更喜欢一个别名,我可以在其中输入:

git pushall branch1 branch2 tag1 tag2 tag3 ..

注意:我知道我可以使用多个 url 创建一个新的远程“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 ..

为什么不使用具有多个推送 url 的新远程“全部”?

如前所述,让我们关注别名,以便读者找到他们正在寻找的东西。

无论如何,这就是我不创建远程“全部”的原因:

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

讨论这个问题的正确地方是这里,从多个远程位置拉/推

也可以看看

以下是相关的,但它们不涉及可变参数:

以下内容可能会有所帮助,但它针对的是纯 shell 脚本,而不是专门的 git 别名:

4

4 回答 4

2

您链接到的其他问题确实回答了这一点,但为了清楚起见:

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

或从命令行设置:

git config --global alias.pushall '!git push github "$@"; git push drupal "$@"; :'
于 2016-12-29T07:36:14.480 回答
2

将任意脚本打包成 git 别名的习惯用法是将其放入 shell 函数中:

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

我想指出的是,正确的用法$@是把它放在双引号内:"$@".

于 2016-12-29T08:30:57.460 回答
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以查找所有遥控器,并在继续之前使用命令替换替换命令$(...)的输出。git remote

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

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

如果您有一些不想推送到所有远程的存储库,您可以将其定义为本地别名,并在存储库中使用 thi 命令自定义每个存储库中的远程列表:

$ git config --local alias.pusha '! for repo in github drupal; do git push $repo $@; done #'
于 2016-12-29T07:53:49.120 回答
0

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

[alias]
pushall = "!git push github $1 $2 $3 $4 $5; git push drupal $1 $2 $3 $4 $5; :"

是的,这并不是真正的可变参数,因为它仅限于 5 个参数(或您在创建别名时选择的任何数字)。它也不能传递像--key=value. 但正如所说,它可能对你来说已经足够好了。

在我的特定用例中,大多数时候我只推送一个分支和一个发布标签,所以两个参数 ( $1 $2) 就足够了。

请注意,:最后似乎与#. 我在stackoverflow的其他地方学到了这一点。

我不会“接受”这个答案,因为我想给别人留下更好的机会。

于 2016-12-29T04:00:01.487 回答