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

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

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

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

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

/questions/34995146/src-refspec-master-ne-sovpadaet-ni-s-odnim-pri-nazhatii-kommitov-v-git/34995160#34995160

Если вы еще не завершили локальное репо, вам нечего нажимать, но сообщение об ошибке 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
Другие вопросы по тегам