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

我经常发现自己打字这个:

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

我更喜欢一个别名,我可以输入它来代替:

git pushall branch1 branch2 tag1 tag2 tag3 ..

注意:我知道我可以用多个URL创建一个新的远程“全部”。 我们不要在这里讨论这个问题,而是专注于别名!

我可以硬编码远程名称,因为我有一些具有相同多个远程名称(通常是“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 ..
    

    为什么不是一个新的遥控器“全部”与多个推网址?

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

    无论如何,这就是为什么我不创建一个远程“全部”:

  • 每个项目我都要做一次,不能在全球范围内完成。 在我的情况下,硬编码全局别名中的远程名称实际上很好!
  • Afaik,我会用像“all / branch1”这样的参考文件来代替“remote1 / branch1”和“remote2 / branch1”,或者除了“remote1 / branch1”和“remote2 / branch1”之外还会污染我的历史。
  • 讨论这个问题的正确的地方就在这里,从多个远程位置上拉/推

    也可以看看

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

  • Git别名 - 多个命令和参数
  • 具有多个命令的Git别名的语法
  • 具有位置参数的Git别名
  • 以下内容可能会有所帮助,但它涉及纯shell脚本,并非专门用于git别名:

  • 如何迭代Bash脚本中的参数

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

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

    或者从命令行设置:

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

    通过扩展您的初始尝试:

    [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 #'
    

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

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

    我想指出$@的正确使用是将它放在双引号内: "$@"

    链接地址: http://www.djcxy.com/p/8767.html

    上一篇: git alias: multiple commands, variadic parameters

    下一篇: Pushing code to two remotes