git отказывается получать в текущую ветку

Я настраиваю удаленный репозиторий и могу отправлять в него новые изменения, но не могу получить из него данные, я всегда получаю (довольно загадочное) сообщение об ошибке:

fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
fatal: The remote end hung up unexpectedly

Что это означает? Что мне делать, чтобы разрешить получение?

(Обратите внимание, что это удаленное репо используется только в качестве резервного репозитория, поэтому оно должно быть в значительной степени точной копией моего локального репозитория. Я действительно не могу понять, почему я могу нажимать на него, но не получать из него ...)

Моя конфигурация выглядит так:

[remote "origin"]
    url = ssh://blablablah
    fetch = +refs/*:refs/*
    mirror = true

person Olivier Verdier    schedule 10.02.2010    source источник
comment
Можете ли вы показать свою конфигурацию для репозитория, в который вы загружаете?   -  person CB Bailey    schedule 10.02.2010
comment
Ммм, как я могу увидеть эту конфигурацию? Я просто настроил этот удаленный репозиторий с помощью git remote add name server, возможно, с параметром --mirror.   -  person Olivier Verdier    schedule 10.02.2010
comment
Оливер, конфигурация находится в .git/config. В частности, я считаю, что Чарльз говорит о разделе [remote …].   -  person Michael Krelin - hacker    schedule 10.02.2010
comment
Моя конфигурация выглядит так: [удаленный источник] url = ssh: // blablablah fetch = + refs / *: refs / * mirror = true   -  person Olivier Verdier    schedule 10.02.2010
comment
Вы не должны выполнять зеркальную загрузку в репозиторий, над которым работаете. Вы хотите удалить зеркало и, в основном, следовать моим советам, данным в ответе.   -  person Michael Krelin - hacker    schedule 10.02.2010


Ответы (8)


Вы пытаетесь получить ветку, над которой работаете. То есть вы находитесь в главной ветке и пытаетесь ее обновить. Это невозможно. Чаще всего обновляют ветки remotes/*, а затем переносят их в свои локальные. То, что вы хотите, возможно,

git remote add otherrepo thehost:/the/path.git

Это настроит репозиторий, который будет загружен в remotes/otherrepo/*. git fetch otherrepo должен помочь. В качестве альтернативы вы можете вручную отредактировать свой .git/config и установить fetch для пульта дистанционного управления примерно на refs/heads/*:refs/remotes/otherrepo/*.

person Michael Krelin - hacker    schedule 10.02.2010
comment
Спасибо! Я не совсем понимаю, что делаю, но, следуя вашему совету, теперь все работает нормально. Я вроде как предполагаю, что нужно явно указать, где в локальном репозитории окажутся удаленные ветки; У меня, вероятно, была удаленная ветка, перекрывающая мою локальную ветку, хотя я не уверен, имеет ли это смысл. :-) Спасибо, в любом случае! - person Olivier Verdier; 10.02.2010
comment
Более менее. Тот факт, что удаленные ссылки находятся в refs / remotes, - это просто соглашение, но вы действительно не хотите получать напрямую в свои refs / hreads / master. Особенно, когда ваши ссылки / головы / мастера проверены. - person Michael Krelin - hacker; 10.02.2010
comment
@ MichaelKrelin-hacker что писать вместо хоста - person Punit Vara; 21.08.2017
comment
Имя хоста, на котором находится ваш репозиторий. По сути, часть thehost:/the/path.git следует заменить на URL-адрес вашего репозитория. - person Michael Krelin - hacker; 21.08.2017

В случае, если кто-то обнаружит это, потому что он специально хочет выполнить выборку в текущую ветку, вы можете использовать флаг --update-head-ok. Из документов:

-u
--update-head-ok
По умолчанию git fetch отказывается обновлять заголовок, соответствующий текущей ветке. Этот флаг отключает проверку. Это чисто для внутреннего использования git pull для связи с git fetch, и если вы не реализуете свой собственный Porcelain, вы не должны его использовать.

В некоторых случаях мы действительно хотим реализовать наши собственные фарфоровые команды, например, автоматизацию и инструменты.

person RobW    schedule 06.10.2013
comment
Почему в этом случае git не хочет обновлять голову? Почему они не хотят, чтобы вы использовали этот флаг? - person Chris Marisic; 21.04.2016
comment
Мне тоже любопытно, почему fetch может обновлять все другие ветки, кроме текущей? - person cdosborn; 15.07.2016
comment
Я думал, что ограничение существует для предотвращения потери работы, но я подтвердил, что даже с флагом -u коммиты без перемотки вперед отклоняются: ! [rejected] master -> master (non-fast-forward) - person Diomidis Spinellis; 07.02.2017
comment
Если вы хотите просто выбросить своего мастера и указать его на мастера происхождения: git fetch -fu origin master - person cdosborn; 07.08.2017
comment
Обратите внимание, что это обновит заголовок, но не рабочий каталог. Чтобы рабочий каталог соответствовал заголовку, используйте git reset --hard (осторожно, все несохраненные изменения будут отменены). - person Erik Koopmans; 21.04.2019

Также это должно работать, если вы находитесь в ветке master и хотите получить последнюю попытку

git pull origin мастер

person Sai    schedule 13.04.2017

У меня была эта проблема, когда я бездумно клонировал репозиторий вместо того, чтобы получить его, так что оба репозитория были мастерами. Если вы не работали с удаленным репозиторием, вы можете исправить ситуацию с помощью основных команд git следующим образом: (1) удалить удаленный репозиторий, (2) скопировать локальный репозиторий туда, где находился удаленный, (3) удалить локальный, а затем (4) настроить локальный репозиторий, используя

git init; git fetch $REMOTE_GIT_REPOSITORY_URL  

Тогда git pull и git push поступят правильно. Преимущество избегания git remote, согласно более эффективному и принципиальному ответу Майкла, состоит в том, что вам не нужно думать о семантике отслеживания ветвей.

person Charles Stewart    schedule 14.09.2011
comment
Клон - это клон. Основное репо - это чисто условное обозначение. Вопрос здесь в поведении git fetch remote ref: ref, когда для HEAD установлено значение ref. - person qneill; 13.12.2012

У меня точно такая же проблема. Сначала я пытаюсь получить, используя это

git fetch [remote_name] [branch_name] 

У меня была та же проблема, о которой вы говорите. После этого я попробовал эту простую команду.

git pull [remote_name] [branch_name]

Note будет извлекать и объединять изменения. Если вы используете терминал, тогда файл открывается, требуя фиксации сообщения. Этим сообщением вы отправите последнюю фиксацию. Попробуйте эту команду, и, наконец, вы сможете отправить запрос.

git push [remote_name] [branch_name_local] 
person Hafiz Shehbaz Ali    schedule 11.04.2015

Вы действительно вводите команды Git в командную строку или запускаете исполняемый файл Git из собственного кода?
Если вы запускаете его из кода, уверены ли вы, что Git пытается выполнить выборку в правильном локальный каталог?

Это можно сделать двумя способами:

  1. Используйте параметры, предоставляемые вашим языком программирования, чтобы установить правильный рабочий каталог перед запуском Git
    (пример C # , потому что это то, что я использую)

  2. Всегда передавайте параметр -C в Git, чтобы указать каталог с локальным репо.


У меня есть проект, в котором я вызываю исполняемый файл Git из кода C #, и я получил то же сообщение об ошибке, что и в вопросе, когда я случайно забыл установить -C parameter.

person Christian Specht    schedule 08.09.2017

Если вы действительно хотите перейти в текущую ветку - например, как fetch -u origin mybranch:mybranch из двойного репо (и это не из-за фальшивой конфигурации, как в случае с OP), вам может быть удобнее:

git pull [origin] --ff-only

Это позволяет только быстрое обновление вперед, расширяя линейную историю. Он уже обновляет индекс, в отличие от fetch -u.

В случае, если это не удается из-за расходящейся истории коммитов, и вы хотите немедленно снова достичь единства (вместо создания демонов слияния и т. Д.), Вы можете рассмотреть возможность перенастройки на удаленный компьютер - например, от:

git pull --rebase[=interactive]

Что можно разбить на:

git fetch origin mybranch
# inspect the diverge situation 
git rebase origin/mybranch mybranch [-i]...
person kxr    schedule 07.03.2021

фатальный: отказ от загрузки в текущую ветку refs / Heads / BRANCHNAME не-голого репозитория

Я создал ветку BRANCHNAME локально, затем выполнил команду «git fetch upstream pull / ID / head: BRANCHNAME» и получил фатальный: отказ от выборки в текущую ветку refs / Heads / BRANCHNAME не- чистый репозиторий

затем я удалил ветку и снова вызвал тот же cmd, что и все.

На самом деле я проверял ветку запроса на вытягивание.

person Adit choudhary    schedule 25.02.2019