"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
)
Предупреждение: слишком много воспроизведения с конфигурацией выборки может привести к созданию репозитория, где вы не знаете, что действительно сделано. Поэтому держите его простым и логичным.
- удаленная ветвь, которая 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