Здатний натиснути на всі git віддалені за допомогою однієї команди?


195

Замість того, щоб робити:

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

Чи є спосіб зробити це лише однією командою?

Дякую :)


1
Дивіться також: stackoverflow.com/q/5620525/223092
Марк Longair

Щоб створити allпульт дистанційного керування на всіх віддалених, дивіться: stackoverflow.com/a/18637593/802365
Édouard Lopez

Відповіді:


253

Щоб натиснути всі гілки на всі віддалені пристрої:

git remote | xargs -L1 git push --all

Або якщо ви хочете натиснути певну гілку на всі віддалені:

Замініть masterгілку, яку ви хочете натиснути.

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

(Бонус) Щоб зробити псевдонім git для команди:

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

git pushallТепер біг підштовхне всі гілки до всіх віддалених.


1
Дуже хороше і просте рішення. До речі, ви можете використовувати xargs -l замість -L 1, -l варіант такий же, як -L 1. Крім того, іноді я додаю - всі до git push. git віддалений | xargs -l git push
Тоні

2
Я потрапляю xargs: illegal option -- lна OSX. Зрозумів це, вам потрібноgit remote | xargs -L1 git push
balupton

4
Git дозволяє здійснити цей виклик у користувацькій команді. Просто помістіть його у файл, який 1) стоїть на вашому шляху; 2) ви маєте виконувати дозволи та 3) називатись "git- [користувацьке ім'я]" (наприклад, git-foo, git-push-all), і ви будете вміти просто ввести "git [користувацьке ім'я]" (наприклад, git foo, git push-all).
Ендрю Мартін

2
@Tony On Ubuntu, man xargsговорить, що параметр -lзастаріло, оскільки його немає в специфікації POISX.
wjandrea

2
@kyb У синтаксисі псевдоніма git !означає, що наступне - це не внутрішня команда git, а зовнішня командна оболонка.
слабкий

285

Створіть 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відразу після такого натиску.
madhead

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
Макабей

забув встановити URL-адреси push, інакше git pushне буде оновлено всі URL-адреси. відповідь оновлена ​​відповідно
користувач3338098

88

Якщо ви хочете завжди натискати на repo1, repo2 та repo3, але завжди тягнути лише з repo1, встановіть віддалене "origin" як

[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
Мені здається, це більш підходящий спосіб зробити це. Повинні були бути найвищі голоси.
Ахмад

Це дуже корисно. Чи можна обмежити pushurl лише для освоєння гілки?
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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.