Git Ошибка нажатия: отказ обновить отмеченную ветку
Я решил некоторые конфликты слияния, затем попытался нажать Мои изменения и получил следующую ошибку:
c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'
Кто-нибудь знает, что может вызвать эту ошибку?
Ответы
Ответ 1
Существует два типа репозиториев: голый и не голый
У Bare-хранилищ нет рабочей копии, и вы можете нажать на них. Таковы типы репозиториев, которые вы получаете в Github! Если вы хотите создать голый репозиторий, вы можете использовать
git init --bare
Итак, короче говоря, вы не можете нажать на не-голый репозиторий (Edit: ну, вы не можете нажать на текущую отмеченную ветку репозиторий. С открытым репозиторием вы можете нажать на любую ветку, поскольку ни один из них не был извлечен. Хотя возможно, переключение на не-голые репозитории не является обычным явлением). Что вы можете сделать, это извлечь и слить из другого репозитория. Вот как работает pull request
, который вы можете видеть в работе Github. Вы просите их отталкиваться от вас, и вы не нажимаете на них.
Обновление. Благодаря VonC, указав это, в последних версиях git (в настоящее время 2.3.0), нажатие на отмеченную ветку из не-голых репозиториев возможно. Тем не менее, вы все равно не можете нажать на грязное рабочее дерево, что в любом случае не является безопасной.
Ответ 2
Я решил эту проблему, сначала проверив, что этот пульт не получил ничего (он действительно не должен был), а затем сделал его голым с помощью
$ git config --bool core.bare true
После этого git push работал нормально.
Ответ 3
Резюме
Вы не можете нажать на одну отмеченную ветку репозитория, потому что она будет конфликтовать с пользователем этого репозитория таким образом, который, скорее всего, закончится потерей данных и истории. Но вы можете нажать на любую другую ветку одного и того же репозитория.
Поскольку в открытых хранилищах ни один филиал не проверен, вы всегда можете нажать на любую ветвь открытого репозитория.
Вскрытие проблемы
Когда ветвь вычеркнута, фиксация добавит новую фиксацию с текущей ветвью ветки в качестве ее родителя и переместит ветвь ветки в новую фиксацию.
Итак,
A ← B
↑
[HEAD,branch1]
становится
A ← B ← C
↑
[HEAD,branch1]
Но если кто-то может нажать на эту ветку между ними, пользователь получит себя в том, что git вызывает отключенный головной режим:
A ← B ← X
↑ ↑
[HEAD] [branch1]
Теперь пользователь больше не находится в ветке1, не запросив явно другую ветку. Хуже того, пользователь теперь вне любой ветки, и любая новая фиксация будет просто болтаться:
[HEAD]
↓
C
↙
A ← B ← X
↑
[branch1]
Гипотетически, если на данный момент пользователь проверяет другую ветвь, то это оборванное коммитирование становится честной игрой для git сборщика мусора.
Ответ 4
cd в каталог repo/, который вы нажимаете на удаленную машину, и введите
$ git config core.bare true
Ответ 5
Как уже существует существующий репозиторий, запуск
git config --bool core.bare true
в удаленном репозитории должно быть достаточно
Из документации core.bare
Если true (bare = true), предполагается, что репозиторий будет голым без привязки рабочего каталога. Если это так, будет отключено несколько команд, требующих рабочий каталог, например git -add или git -merge (но вы сможете нажать на него).
Этот параметр автоматически угадывается git -clone или git -init, когда создается репозиторий. По умолчанию репозиторий, который заканчивается на "/.git", считается не голым (bare = false), а все остальные репозитории считаются голыми (bare = true).
Ответ 6
TL;DR
- Потяните и нажмите еще раз:
git pull &&& git push
.
- Еще проблема? Нажимайте в другую ветку:
git push origin master:foo
и объедините ее на удаленном репо.
- В качестве альтернативы принудительно нажмите push, добавив
-f
(denyCurrentBranch
необходимо игнорировать).
В основном ошибка означает, что ваш репозиторий не обновляется с удаленным кодом (его индекс и дерево работы несовместимы с тем, что вы нажали).
Обычно вам нужно pull
сначала получить последние изменения и push
снова.
Если это не поможет, попробуйте нажать в другую ветку, например:
git push origin master:foo
затем слейте эту ветку в удаленный репозиторий обратно с помощью мастера.
Если вы изменили некоторые прошлые намерения с помощью git rebase
, и вы хотите переопределить репо с вашими изменениями, вы, вероятно, захотите принудительно нажать, добавив параметр -f
/--force
(не рекомендуется, если вы этого не сделали rebase
). Если вы все еще не сработаете, вам нужно установить receive.denyCurrentBranch
на ignore
на пульте, как было предложено сообщением git с помощью:
git config receive.denyCurrentBranch ignore
Ответ 7
Для меня следующее трюк:
git config --global receive.denyCurrentBranch updateInstead
Я установил диск F:, почти полностью, чтобы синхронизировать между моим настольным компьютером Windows 10 и моим ноутбуком Windows 10, используя Git. Я закончил работу над указанной командой на обеих машинах.
Сначала я поделился файловым компьютером F в сети. Затем я смог клонировать его на своем ноутбуке, запустив:
F:
git clone 'file://///DESKTOP-PC/f'
К сожалению, все файлы оказались под "F:\f \" на моем ноутбуке, а не под F:\напрямую. Но я смог вырезать и вставить их вручную. После этого Git по-прежнему работал с новым местоположением.
Затем я попытался внести некоторые изменения в файлы на ноутбуке, совершив их и вернув их на рабочий стол. Это не сработало, пока я не запустил команду Git config, упомянутую выше.
Обратите внимание, что я запускал все эти команды из Windows PowerShell на обеих машинах.
ОБНОВЛЕНИЕ: В некоторых случаях у меня все еще были проблемы с нажатием изменений. Я, наконец, только начал набирать изменения, выполнив на компьютере следующее: я хочу вытащить последние фиксации:
git pull --all --prune
Ответ 8
Возможно, ваше удаленное репо находится в ветке, которую вы хотите нажать. Вы можете попробовать проверить другую ветку на удаленном компьютере. Я сделал это, но эти ошибки исчезли, и я добился успеха в своем удаленном репо. Обратите внимание, что я использую ssh для подключения моего собственного сервера вместо github.com.
Ответ 9
У меня есть эта ошибка, потому что репо git было (случайно) инициализировано дважды в одном и том же месте: сначала в качестве не-голого репо и вскоре после него в качестве голого репо. Поскольку папка .git остается, git предполагает, что репозиторий не голый. Удаление папки .git и данных рабочего каталога решило проблему.