Почему я не могу нажать на этот голый репозиторий?
Можете ли вы объяснить, что не так с этим рабочим процессом?
$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'
не git push
всегда выдвигать к хранилищу, из которого я клонировал?
6 ответов
Да, проблема в том, что в "голых" коммитах нет. Это проблема только с первым коммитом, если вы создаете репо в порядке (bare, alice). Попробуйте сделать:
git push --set-upstream origin master
Это будет необходимо только в первый раз. После этого должно работать нормально.
Как отметил Крис Джонсен, у вас не будет этой проблемы, если ваш push.default был настроен. Мне нравится upstream/tracking.
Если ты:
git push origin master
это подтолкнет к голому репо.
Похоже, что ваше репо Алиса не отслеживает правильно.
cat .git/config
Это покажет пульт по умолчанию и филиал.
если ты
git push -u origin master
Вы должны начать отслеживать этот пульт и филиал. Я не уверен, что этот вариант всегда был в Git.
Ответ на этот связанный вопрос дал мне решение... это была просто глупая ошибка:
Не забудьте совершить сначала!
Если вы еще не завершили локальное репо, вам нечего нажимать, но сообщение об ошибке Git, которое вы получаете, не слишком вам помогает.
git push --all
это канонический способ подтолкнуть все к новому голому хранилищу.
Другой способ сделать то же самое - создать новый, не обнаженный репозиторий, а затем создать голый клон с
git clone --bare
затем используйте
git remote add origin <new-remote-repo>
в оригинальном (не голом) хранилище.
Попробуйте это в вашем alice
хранилище (до нажатия):
git config push.default tracking
Или настройте его как значение по умолчанию для вашего пользователя с git config --global …
,
git push
по умолчанию origin
репозиторий (обычно это репозиторий, из которого вы клонировали текущий репозиторий), но он по умолчанию не выдвигает текущую ветвь - по умолчанию он выдвигает только те ветки, которые существуют как в исходном, так и в целевом репозитории.
push.default
переменная конфигурации (см. git-config (1)) управляет тем, что git push
будет выдвигаться, когда ему не будет предоставлено никаких аргументов "refspec" (то есть что-то после имени репозитория). Значение по умолчанию дает поведение, описанное выше.
Вот возможные значения для push.default
:
nothing
Это заставляет вас предоставить "refspec".matching
(по умолчанию)
Это выталкивает все ветви, которые существуют как в исходном хранилище, так и в хранилище назначения.
Это полностью независимо от ветви, которая в настоящее время проверена.upstream
или жеtracking
(Оба значения означают одно и то же. Последнее не рекомендуется, чтобы избежать путаницы с ветвями "удаленного отслеживания". Первое было введено в 1.7.4.2, поэтому вам придется использовать второе, если вы используете Git 1.7.3.1.)
Они выдвигают текущую ветвь к ветке, определенной ее "восходящей" конфигурацией.current
Это подталкивает текущую ветку к ветке с тем же именем в целевом хранилище.Последние два заканчиваются тем, что они одинаковы для общих случаев (например, работа на локальном мастере, который использует origin/master в качестве его восходящего потока), но они отличаются, когда локальная ветвь имеет имя, отличное от ее "восходящей" ветки:
git checkout master # hack, commit, hack, commit # bug report comes in, we want a fix on master without the above commits git checkout -b quickfix origin/master # "upstream" is master on origin # fix, commit git push
С
push.default
равноupstream
(или жеtracking
), толчок будет идти кorigin
Хозяин филиала. Когда оно равноcurrent
толчок пошел бы кorigin
ветка быстрого исправления.
matching
настройка обновится bare
Мастер в вашем сценарии, как только он был создан. Чтобы установить это, вы можете использовать git push origin master
один раз.
Тем не менее upstream
настройка (или может быть current
) кажется, что это может лучше соответствовать тому, что вы ожидаете, поэтому вы можете попробовать это:
# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push
# configure it for only this repository
git config push.default upstream
# configure it for all repositories that do not override it themselves
git config --global push.default upstream
(Опять же, если вы все еще используете Git до 1.7.4.2, вам нужно будет использовать tracking
вместо upstream
).
Я использую git-клиент SourceTree и вижу, что их начальная команда commit/push:
git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master