Почему я не могу нажать на этот голый репозиторий?

283

Можете ли вы объяснить, что не так с этим рабочим процессом?

$ 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всегда подталкивать к хранилищу, из которого я клонировал?

ripper234
источник
Разве вы не должны указывать ветку, чтобы нажать
Рекин
3
не после клона !!! после того, как проблема устранена, она работает отлично и не нужно указывать ветку ... только при первой проверке пустого репозитория это происходит, что ОЧЕНЬ ОЧЕНЬ раздражает ... они должны решить эту проблему.
Дин Хиллер
Надеюсь, что этот пост будет кому-то полезен при попытке сделать это выше - samranga.blogspot.com/2015/07/… Ошибка в вопросе может появиться даже при попытке создать репозиторий git BitBucket из уже существующего локального проекта
Samitha Чатуранга

Ответы:

483

Да, проблема в том, что в «голых» коммитах нет. Это проблема только с первым коммитом, если вы создаете репо в порядке (bare, alice). Попробуйте сделать:

git push --set-upstream origin master

Это будет необходимо только в первый раз. После этого должно работать нормально.

Как отметил Крис Джонсен, у вас не будет этой проблемы, если ваш push.default был настроен. Мне нравится upstream / tracking.

Сет Робертсон
источник
1
Я делаю sudo apt-get upgrade git-coreи sudo apt-get upgrade gitдумаю, что обновление не требуется. git --versionвозвращает 1.7.3.1. Есть идеи, чего не хватает? Я признаю, что в настоящее время apt-get updateне работает для меня, но это не так давно.
ripper234
1
@ ripper234: Текущая версия git - 1.7.5.3. Вы можете жить с неудобствами, использовать другой рабочий процесс или установить последнюю версию git вручную без упаковки Debian / Ubuntu.
Сет Робертсон
Ах да, я забыл, что программному обеспечению требуется некоторое время, прежде чем оно будет упаковано. Я noob из Linux, пришедший из Windows и привыкший кликать здесь, чтобы установить самую новую версию.
ripper234
9
Относительно «В последней версии такой проблемы нет»: даже в последних версиях значение по умолчанию для толчков не изменилось matching; может быть, вы push.defaultустановили upstream/ tracking(или current) в вашем ~/.gitconfig?
Крис Джонсен
4
Попробуйте git push origin master:masterсделать это явным. Если это не сработает, проверьте, в какой ветке вы находитесь: git branchвозможно, вы не сделали первый коммит или вы сделали этот коммит на ветке, отличной от master.
Сет Робертсон
43

Если ты:

 git push origin master

это подтолкнет к голому репо.

Похоже, ваше репо Алиса не отслеживает правильно.

cat .git/config

Это покажет пульт по умолчанию и филиал.

если ты

 git push -u origin master

Вы должны начать отслеживать этот пульт и филиал. Я не уверен, что этот вариант всегда был в Git.

Сербы
источник
30

Ответ на этот связанный вопрос дал мне решение ... это была просто глупая ошибка:

Не забудьте совершить сначала!

https://stackoverflow.com/a/7572252

Если вы еще не завершили локальное репо, вам нечего нажимать, но сообщение об ошибке Git, которое вы получаете, не слишком вам помогает.

phpguru
источник
17
git push --all

это канонический способ подтолкнуть все к новому голому хранилищу.

Другой способ сделать то же самое - создать новый, не обнаженный репозиторий, а затем создать голый клон с

git clone --bare

затем используйте

git remote add origin <new-remote-repo>

в оригинальном (не голом) хранилище.

ebneter
источник
... так ты понизил ответ? Это является стандартным способом , чтобы подтолкнуть все на новый, голый репозиторий. Если это не сработало для вас, есть другая проблема.
Ebneter
Вы правы, я, вероятно, не должен был, я знаю, что вы просто пытались помочь. Если вы отредактируете его, я откажусь от своего понижения.
ripper234
Спасибо, отредактировал это другим способом, чтобы выполнить ту же задачу.
ebneter
Ваш ответ помог мне, спасибо;) Но в конце команды путь должен присутствовать примерно так: git push --all ../test_repoURL
репозитория
@ Metafaniel Это зависит от того, как вы его настроили. Если в вашем локальном репо уже правильно настроен пульт, «git push --all» должен работать как есть.
ebneter
7

Попробуйте это в своем aliceхранилище (перед нажатием):

git config push.default tracking

Или настройте его как значение по умолчанию для вашего пользователя с git config --global ….


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

push.defaultПеременной конфигурации (см ГИТ-конфигурации (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«s основной ветви. Когда оно равно current, толкающий бы к origin«s QuickFix филиал.

matchingУстановка обновит bare«s мастер в вашем сценарии , когда он был создан. Чтобы установить это, вы можете использовать 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).

Крис Джонсен
источник
1

Я использую git-клиент SourceTree и вижу, что их начальная команда commit / push:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
IgorGanapolsky
источник