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