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

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

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

Ответ 1

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

git push --set-upstream origin master

Это потребуется только в первый раз. Впоследствии он должен работать нормально.

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

Ответ 2

Если вы:

 git push origin master

он будет двигаться к голой репо.

Похоже, что ваш репозиторий alice не отслеживает правильно.

cat .git/config

Показывает удаленный доступ и ветвь по умолчанию.

Если вы

 git push -u origin master

Вы должны начать отслеживать этот удаленный и ветки. Я не уверен, что этот параметр всегда находился в git.

Ответ 3

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

Не забудьте сделать первый!

fooobar.com/questions/793/...

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

Ответ 4

git push --all

- это канонический способ перебросить все в новый открытый репозиторий.

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

git clone --bare

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

git remote add origin <new-remote-repo>

в исходном (не голом) репозитории.

Ответ 5

Попробуйте сделать это в репозитории 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
    Это подталкивает текущую ветку к ветки с тем же именем в репозитории-получателе.

    Эти последние два заканчиваются одинаковыми для обычных случаев (например, работа над локальным мастером, который использует источник/ведущий как его восходящий поток), но они различаются, когда локальная ветка имеет другое имя из своей ветки "вверх по течению":/p >

    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).

Ответ 6

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

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master