Git Push error: отказ от обновления проверенной ветки
Я решил некоторые конфликты слияния, совершил затем попытался нажать мои изменения и получил следующую ошибку:
c:Program Files (x86)Gitbingit.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'
кто-нибудь знает, что может быть причиной этой ошибки?
9 ответов:
существует два типа репозиториев:голые и не голые
голые репозитории не имеющие рабочей копии и вы можете нажать на них. Это типы репозиториев, которые вы получаете в Github! Если вы хотите создать "голый" репозиторий, вы можете использовать
git init --bare
так, короче, вы не можете нажать на "голый" репозиторий(Edit: Ну, вы не можете нажать на текущую извлеченную ветку репозитория. С голыми репозиториями, вы можете нажать на любую ветку, так как ни один не проверен. Хотя это возможно, нажатие на не-голые репозитории не является распространенным). Что вы можете сделать, это извлечь и объединить из другого репозитория. Вот как этоpull requestчто вы можете увидеть в GitHub работает. Вы просите их тянуть от вас, и вы не заставляете-толкаете в них.
обновление: спасибо VonC за указание на это, в последних версиях git (в настоящее время 2.3.0),нажатие на проверенную ветку а не голые репозитории возможны. Тем не менее, вы все еще не можете нажать на грязный рабочее дерево, которое не является безопасной операцией в любом случае.
Я решил эту проблему, сначала проверив, что удаленный ничего не проверял (это действительно не предполагалось), а затем сделал его голым с:
$ git config --bool core.bare trueпосле этого git push работал нормально.
резюме
вы не можете нажать на одну извлеченную ветку репозитория, потому что это будет мешать пользователю этого репозитория таким образом, что, скорее всего, закончится потеря данных и истории. Но вы можете нажать на любую другую ветку того же репозитория.
поскольку голые репозитории никогда не проверяют ветвь, вы всегда можете нажать на любую ветвь голого репозитория.
вскрытие проблемы
когда ветку проверяется, committing добавит новую фиксацию с головкой текущей ветви в качестве ее родителя и переместит головку ветви, чтобы быть этой новой фиксацией.
так
A ← B ↑ [HEAD,branch1]становится
A ← B ← C ↑ [HEAD,branch1]но если кто-то может нажать на эту ветку между ними, пользователь получит себя в том, что git называет отрезанная голова режим:
A ← B ← X ↑ ↑ [HEAD] [branch1]теперь пользователь больше не находится в branch1, явно не попросив проверить другую ветвь. Хуже того, пользователь теперь вне всякого филиал, и любой новый коммит будет просто свесив:
[HEAD] ↓ C ↙ A ← B ← X ↑ [branch1]гипотетически, если в этот момент пользователь проверяет другую ветку, то этот висящий совершать в игре на ГИТ в сборщик мусора.
поскольку уже существует репозиторий, работает
git config --bool core.bare trueна удаленном репозитории должно хватить
из ядра.голая документация
если true (bare = true), предполагается, что репозиторий является голым без привязки к рабочему каталогу. Если это так, то ряд команд, требующих рабочего каталога, будут отключены, например git-add или git-merge (но вы сможете нажать на него).
этот параметр автоматически угадывается git-clone или git-init при создании репозитория. По умолчанию репозиторий, который заканчивается на "/.ГИТ", как предполагается, не чуть-чуть (чуть-чуть = ложь), а все остальные репозитории предполагается чуть-чуть (чуть-чуть = истина).
для меня, следующие сделали трюк:
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, на обеих машинах.
UPDATE: у меня все еще были проблемы с внесением изменений, в некоторых случаях. Я наконец, просто начал вытягивать изменения вместо этого, запустив следующее на компьютере, я хочу вытащить последние фиксации:
git pull --all --prune
TLDR
- потяните и нажмите еще раз:
git pull &&& git push.- по-прежнему проблема? Нажмите в другую ветку:
git push origin master:fooи слить его на удаленном РЕПО.- альтернативно заставить толчок, добавив
-f(denyCurrentBranchдолжен быть проигнорирован).
в основном ошибка означает, что ваш репозиторий не обновлен с удаленным кодом (его индекс и дерево работы несовместимы с тем, что вы нажали).
обычно вы должен
pullпервым, чтобы получить последние изменения иpushэто снова.если не поможет, попробуйте нажать в другую ветку, например:
git push origin master:fooзатем объедините эту ветвь в удаленном репозитории обратно с master.
если вы изменили некоторые прошлые коммиты намеренно через
git rebaseи вы хотите переопределить РЕПО с вашими изменениями, вы, вероятно, хотите, чтобы заставить толчок, добавив-f/
возможно, ваше удаленное РЕПО находится в ветке, которую вы хотите нажать. Вы можете попробовать проверить другую ветку на удаленном компьютере. Я сделал это, чем эти ошибки исчезли, и я подтолкнул успех к моему удаленному РЕПО. Обратите внимание, что я использую ssh для подключения собственного сервера вместо github.com.
У меня есть эта ошибка, потому что РЕПО git было (случайно) инициализировано дважды в одном и том же месте : сначала как не голое РЕПО и вскоре после этого как голое РЕПО. Потому что .папка git остается, git предполагает, что репозиторий не является голым. Удаление .git folder and working directory data решил проблему.
Comments