Умеет нажать на все пульты Git одной командой?

195

Вместо того, чтобы делать:

git push origin --all && git push nodester --all && git push duostack --all

Есть ли способ сделать это с помощью одной команды?

Спасибо :)

balupton
источник
1
См. Также: stackoverflow.com/q/5620525/223092
Марк Лонгэйр,
Чтобы создать allпульт, на котором можно установить все пульты, см .: stackoverflow.com/a/18637593/802365
Эдуард Лопес,

Ответы:

253

Чтобы передать все ветви на все пульты:

git remote | xargs -L1 git push --all

Или, если вы хотите отправить определенную ветку на все пульты:

Замените masterветкой, которую вы хотите нажать.

git remote | xargs -L1 -I R git push R master

(Бонус) Чтобы создать псевдоним для команды:

git config --global alias.pushall '!git remote | xargs -L1 git push --all'

Запуск git pushallтеперь выдвинет все ветви на все пульты.

weakish
источник
1
Очень хорошее и простое решение. Кстати, вы можете использовать xargs -l вместо -L 1, опция -l такая же, как -L 1. Кроме того, иногда я добавляю --all к git push. Git Remote | xargs -l git push --all
Тони
2
Я получаю xargs: illegal option -- lна OSX. git remote | xargs -L1 git push
Разобрался
4
Git позволяет вам сделать этот вызов в пользовательской команде. Просто поместите его в файл, который 1) находится на вашем пути, 2) у вас есть права на выполнение и 3) он называется «git- [custom name]» (например, git-foo, git-push-all), и вы уметь просто набирать «git [custom name]» (например, git foo, git push-all).
Эндрю Мартин
2
@Tony В Ubuntu man xargsговорит , что опция -lустарела, так как ее нет в спецификации POISX.
wjandrea
2
@kyb В синтаксисе псевдонима git !означает, что ниже приведена не внутренняя команда git, а команда внешней оболочки.
слабое
286

Создайте allпульт с несколькими URL репо на его имя:

git remote add all origin-host:path/proj.git
git remote set-url --add all nodester-host:path/proj.git
git remote set-url --add all duostack-host:path/proj.git

Тогда просто git push all --all.


Вот как это выглядит в .git/config:

  [remote "all"]
  url = origin-host:path/proj.git
  url = nodester-host:path/proj.git
  url = duostack-host:path/proj.git
Аристотель Пагальтзис
источник
5
Супер крутой трюк! Единственным недостатком является то, что он не перемещает дистанционные головки. Вам нужно бежать git fetch --allсразу после такого толчка.
безумный
8
Г-н Торвальдс (создатель Git) упоминает, что он использует этот метод, но утверждает, что он используется только для удобства и не предлагает никаких технических преимуществ. Marc.info/?l=git&m=116231242118202&w=2 "И, в конце концов, даже" git push all, «который выдвигает несколько репозиториев, на самом деле заканчивает тем, что подключается по одному разу для каждого репозитория, так что на самом деле это просто сокращение для выполнения нескольких« git push ». Никакого реального технического преимущества, просто удобство».
Мэтт
14
Одна из проблем этого подхода заключается в том, что вам нужно добавлять новые URL-адреса к allудаленному, когда они становятся доступными, тогда как git remote | xargs -L1 git push --allавтоматически будут подбираться все новые удаленные.
Раффи Хачадурян
2
Подсказка: чтобы вам не нужно было печатать allкаждый раз, когда вы отправляете коммит, просто используйте «origin» вместо «all»:git remote set-url --add origin nodester-host:path/proj.git
Macabeus
забыл установить push-адреса, иначе git pushне обновит все URL-адреса. ответ обновлен соответственно
user3338098
88

Если вы хотите всегда нажимать на repo1, repo2 и repo3, но всегда извлекаете только из repo1, установите удаленный источник в качестве

[remote "origin"]
    url = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo1
    pushurl = https://exampleuser@example.com/path/to/repo2
    pushurl = https://exampleuser@example.com/path/to/repo3
    fetch = +refs/heads/*:refs/remotes/origin/*

Настройте в командной строке:

$ git remote add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo1
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo2
$ git remote set-url --push --add origin https://exampleuser@example.com/path/to/repo3

Если вы хотите только вытащить, repo1но нажать на repo1и repo2 для конкретной ветвиspecialBranch :

[remote "origin"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[remote "specialRemote"]
    url = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo1.git
    pushurl = ssh://git@aaa.xxx.com:7999/yyy/repo2.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...
[branch "specialBranch"]
    remote = origin
    pushRemote = specialRemote
    ...

См. Https://git-scm.com/docs/git-config#git-config-branchltnamegtremote .

Мэн Лу
источник
4
Я не уверен, почему у этого нет больше голосов. Это на самом деле очень удобно, потому что позволяет просто делать git pushбез аргументов.
Хаски
1
Проголосуй за меня, пожалуйста!
Мэн Лу
1
Это кажется мне более подходящим способом сделать это. Должен был иметь самые высокие голоса.
Ахмад
Это очень полезно. Можно ли ограничить пушурл только мастер-веткой?
Fbucek
17

В качестве альтернативы CLI для редактирования файла .git / config вы можете использовать следующие команды:

# git remote add all origin-host:path/proj.git
# git remote set-url --add all nodester-host:path/proj.git
# git remote set-url --add all duostack-host:path/proj.git

То же самое git push all --allработает и здесь.

Вы сделали то же самое, что и ответ № 1. Вы только что сделали это с помощью командной строки вместо простого редактирования файла конфигурации.

Курт Вандеруотер
источник
2

Я написал короткую функцию bash для одновременного вызова множества пультов. Вы можете указать один пульт в качестве параметра, несколько пультов, разделенных пробелами, или не указывать их, чтобы они передавались на все пульты.

Это может быть добавлено в ваш .bashrc или .bash_profile.

function GitPush {
  REMOTES=$@

  # If no remotes were passed in, push to all remotes.
  if [[ -z "$REMOTES" ]]; then
    REM=`git remote`

    # Break the remotes into an array
    REMOTES=$(echo $REM | tr " " "\n")
  fi

  # Iterate through the array, pushing to each remote
  for R in $REMOTES; do
    echo "Pushing to $R..."
    git push $R
  done
}

Пример: допустим, в вашем репо 3 пульта: rem1, rem2 и rem3.

# Pushes to rem1
GitPush rem1

# Pushes to rem1 and rem2
GitPush rem1 rem2

# Pushes to rem1, rem2 and rem3
GitPush
KeyboardCowboy
источник
0

Вы можете использовать git-хуки - особенно pre-push: добавьте неоригинальные толчки к .git/hooks/pre-push.

Виталий Зданевич
источник