Почему я не могу нажать на этот голый репозиторий? - PullRequest
279 голосов
/ 28 мая 2011

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

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

475 голосов
/ 28 мая 2011

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

git push --set-upstream origin master

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

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

43 голосов
/ 28 мая 2011

Если вы:

 git push origin master

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

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

cat .git/config

Это покажет пульт дистанционного управления и филиал по умолчанию.

Если вы

 git push -u origin master

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

28 голосов
/ 11 июля 2013

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

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

https://stackoverflow.com/a/7572252

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

17 голосов
/ 28 мая 2011
git push --all

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

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

git clone --bare

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

git remote add origin <new-remote-repo>

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

7 голосов
/ 28 мая 2011

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

git config push.default tracking

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


*Для 1009 * по умолчанию используется репозиторий 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
    Это выдвигает текущую ветвь к ветке с тем же именем в целевом хранилище.

    Последние два в конечном итоге одинаковы для общих случаев (например, работа с локальным master , который использует 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), push будет идти к origin s мастер филиал.Когда оно равно current, толчок переходит к origin s quickfix branch.

Параметр matching обновит bare master в вашем сценарии, как только он будет установлен.Чтобы установить его, вы можете использовать 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 голос
/ 06 января 2015

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

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...