"git push all" (несколько репозиториев) не работает

Этот ответ объясняет, как одновременно нажать несколько репозиториев.

  • My .git/config содержит:

    [remote "all"]
        url = [email protected]:commerce-sciences/scale-master.git
        url = [email protected]:scale-master.git
    
  • git push all успешно развертывается в heroku.

  • Похоже, что по какой-то причине изменения не были перенесены на github.

> git push all
Everything up-to-date
Everything up-to-date

> git status
# On branch master
# Your branch is ahead of 'origin/master' by 22 commits.
#
nothing to commit (working directory clean)

Что мне не хватает?

Ответ 1

Как вы настроили удаленный репозиторий all, он вообще не связан с существующими репозиториями в вашем локальном репозитории. Таким образом, второй репозиторий в all не совпадает с origin, хотя он имеет тот же URL.

Когда вы нажимаете на все, Git не знает, что при этом он также нажимает на origin. Поэтому он не может обновлять удаленные ветки, находящиеся в вашем локальном репозитории.

К сожалению, вы не можете изменить это поведение. git push не поддерживает группы удаленных репозиториев как git fetch делает. По крайней мере, пока. Если это так, Git будет иметь явную ссылку из удаленного репозитория (группы) all на origin и может обновлять локальные ссылки.

Итак, теперь единственная опция, которую вы имеете, - это получить отдельные удаленные объекты сразу после нажатия на all, используя git fetch origin или просто git fetch (для ветвей удаленного отслеживания) или просто нажать на них для начала с.

Ответ 2

Из того, что я понимаю о вашей потребности, вам не нужен "все" удаленный.: просто настройте второй push-адрес на удаленном пульте "origin", и у вас не будет этой проблемы.

[remote "origin"]
    url = [email protected]:commerce-sciences/scale-master.git
    url = [email protected]:scale-master.git

вывод git remote -v:

origin [email protected]:commerce-sciences/scale-master.git (fetch)
origin [email protected]:commerce-sciences/scale-master.git (push)
origin [email protected]:scale-master.git (push)

Это означает, что: - git push origin теперь подталкивает оба URL. - git fetch origin (по-прежнему) выбирает только первый URL

Ответ 3

Но если вам действительно нужны раздельные пульты "все" и "источник", вы все равно можете делать правильно, что хотите.

Ключ (еще один раз) в довольно прохладной конфигурации git.

Посмотрите, что произойдет, когда вы git push all:

  • git нажимает на первый URL-адрес (хорошо)

  • git нажимает на второй url (okay)

  • Затем он извлекает первый url для обновления удаленных ветвей вашего репозитория, refs/remote/all.

Почему git жалуется на то, что он "совершил заранее"? Потому что он сравнивает вашу текущую ветку (ведущую) с ветвью вверх по течению, которая является источником/мастером.

Дело в том, что мы можем изменить (один будет достаточным):

  • обновленная ветка, поэтому мы получаем все в refs/remotes/origin, а не в refs/remote/all. В блоке конфигурации [remote "all"] строка

    fetch = +refs/heads/*:refs/remotes/all/*

означает "обновление refs/remotes/all". Поэтому вам нужно просто добавить/изменить его на:

`fetch = +refs/heads/*:refs/remotes/origin/*`

И это сделало: git fetch origin и git fetch all теперь будут иметь тот же эффект (обновите ветвь origin/master)

Предупреждение: слишком много воспроизведения с конфигурацией выборки может привести к созданию репозитория, где вы не знаете, что действительно сделано. Поэтому держите его простым и логичным.

  1. удаленная ветвь, которая git сравнивает ваш текущий

Если вы git push --set-upstream all, то ваша главная ветка будет следовать за всем /master, а не с оригиналом/мастером. Поэтому он не будет жаловаться на то, что вы совершаете. Обратите внимание, что вы должны это сделать только один раз, так как ветка восходящего потока постоянно сохраняется.

Короче:

Способ 1: изменить конфигурацию выборки для удаленных "всех"

[remote "all"]
   url = (url1)
   url = (url2)
   -fetch = +refs/heads/*:refs/remotes/all/*
   +fetch = +refs/heads/*:refs/remotes/origin/*

Способ 2: заставьте свою ветку следовать за всеми /master, а не с оригиналом/мастером.

[branch "master"]
    -remote = origin
    +remote = all
    merge = refs/heads/master