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 ..

Почему не новый удаленный "все" с несколькими push-адресами?

Как говорится, позвольте сосредоточиться на псевдонимах, чтобы читатели находили то, что искали.

В любом случае, вот почему я не создаю удаленное "все" :

  • Мне нужно было бы сделать это один раз в проекте и не могли бы сделать это глобально. В моем случае hardcoding удаленные имена в глобальном псевдониме на самом деле прекрасны!
  • Afaik, я бы оспаривал свою историю с помощью refs как "all/branch1" вместо или в дополнение к "remote1/branch1" и "remote2/branch1".

Правильное место для обсуждения здесь будет pull/push из нескольких удаленных мест

См. также

Ниже приводятся следующие значения, но они не учитывают вариационные параметры:

Возможно, это будет полезно, но он обращается к чистой оболочке script, а не к Git псевдонимам:

Ответ 1

На это действительно отвечают другие вопросы, с которыми вы связались, но для ясности:

[alias]
    pushall = "!git push github \"[email protected]\"; git push drupal \"[email protected]\"; :"

Или установка из командной строки:

git config --global alias.pushall '!git push github "[email protected]"; git push drupal "[email protected]"; :'

Ответ 2

Путем расширения вашей первоначальной попытки:

[alias]
pushall = "!git push github [email protected]; 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 [email protected] --------+                                        |
#                                                                   |
#                  these are the arguments of the original command -+

[email protected] расширяется до всех аргументов командной строки.
В конце строки нет необходимости #; фрагмент git pushall заменяется значением псевдонима, остальная часть аргумента

Если у вас есть больший список удаленных репозиториев, вы можете записать его так:

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

В этот раз требуется знак #. Он превращает исходные аргументы в комментарий; в противном случае команда имеет синтаксические ошибки и не запускается.

Если вы хотите нажать на все пульты репозитория, вы можете написать более умный псевдоним:

pushall = "! for repo in $(git remote); do git push $repo [email protected]; done #"

Он запускает git remote для поиска всех пультов и использует замену команд, чтобы заменить $(...) на вывод git remote перед продолжением.

Вы можете определить его как глобальный псевдоним, используя:

$ git config alias.pusha '! for repo in $(git remote); do git push $repo [email protected]; done #'

Если у вас есть несколько репозиций, в которые вы не хотите нажимать на все пульты, вы можете определить его как локальный псевдоним и настроить список пультов в каждом репо с помощью команды thi, когда вы находитесь в репозитории:

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

Ответ 3

Идиома для упаковки произвольного script в псевдоним git заключается в том, чтобы поместить его в оболочку:

pushall = "! f() { git push github \"[email protected]\"; git push drupal \"[email protected]\"; }; f"

Я хочу указать, что правильное использование [email protected] заключается в том, чтобы поместить его в двойные кавычки: "[email protected]".

Ответ 4

Только для записи работает следующий "чит". Это не полный ответ, но он может быть достаточно хорошим для многих.

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

Да, это не очень вариативно, потому что он ограничен 5 параметрами (или любым номером, который вы выбираете при создании псевдонима). Также он не может передавать такие параметры, как --key=value. Но, как сказано, это может быть просто достаточно для вас.

В моем конкретном случае использования, большую часть времени я просто нажимаю один ветки и один тег релиза, поэтому достаточно двух параметров ($1 $2).

Обратите внимание, что : в конце похоже имеет тот же эффект, что и #. Я узнал об этом где-то еще в stackoverflow.

Я не буду "принимать" этот ответ, потому что я хочу оставить возможность кому-то придумать что-то лучшее.