Каковы последствия использования приема.denyCurrentBranch в Git?

у меня есть Git-репозиторий. Я клонировал репозиторий и могу зафиксировать свои локальные изменения. Когда я нажимаю свои изменения на сервер, он работает.

Как только я создаю ветку, я проверяю ветку, совершаю свою работу, а затем проверяю главную ветку. Затем я объединяю свои локальные изменения в главную ветвь. Когда я пытаюсь нажать на сервер, я получаю следующее исключение:

Welcome to Git (version 1.7.11-preview20120620)

Run 'git help git' to display the help index.
Run 'git help <command>' to display help for specific commands.

$ git push origin master:master
 Counting objects: 9, done.
 Delta compression using up to 4 threads.
 Compressing objects: 100% (7/7), done.
 Writing objects: 100% (8/8), 13.68 KiB, done.
 Total 8 (delta 2), reused 1 (delta 0)
 Unpacking objects: 100% (8/8), 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:/jGit
 ! [remote rejected] master -> master (branch is currently checked out)
 error: failed to push some refs to 'c:/gitRepository'

одним из решений является выполнение следующего команда:

git config receive.denyCurrentBranch ignore

после этого он работает, но я хотел бы знать, почему мне нужно использовать эту опцию. Это единственный вариант? Каковы последствия этого?

что я действительно хотел бы сделать, это создать ветви, объединить их в главную ветвь, а затем нажать мои изменения на сервер.

6 ответов


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

как преобразовать обычный репозиторий Git в голый?


почему Git не позволит вам нажать на не-голые репозитории

оригинальный плакат говорит:

одним из решений является выполнение следующей команды:

git config receive.denyCurrentBranch ignore

после этого он работает, но я хотел бы знать, почему мне нужно использовать эту выбор. Это единственный вариант? Каковы последствия это?

как я указываю в мой ответ на подобный вопрос, начиная с Git версии 1.6.2, Git не позволит давить на не "голый" репозиторий по умолчанию. Это потому что git push команда обновляет только ветку и HEAD ссылки на удаленный репозиторий. Что это!--25-->не do также обновляет рабочую копию и промежуточную область в этом не-голом пульте дистанционного управления.

как следствие, при использовании git status в удаленном РЕПО вы увидите, что предыдущее состояние РЕПО все еще присутствует в рабочей копии (и поставлено в index):

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   previous-state.txt

если вы посмотрите на сообщение об ошибке, которое вы получили, когда вы впервые попытались нажать на свой не-голый удаленный РЕПО с receive.denyCurrentBranch значение по умолчанию refuse значение, вы увидите, что сообщение говорит вам в основном то же самое:

error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error:
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.

вам нужно просто нажать на голые репозитории Git

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

так как то, что ответ государства, простой способ преобразовать существующее не-голое РЕПО в голое-это просто повторно закрыть его как голое РЕПО:

git clone --bare old-repo

или вы можете попробовать возиться с core.bare config параметр, как описано в ответ.


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

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


У меня была такая же ошибка, и мне нужно было, чтобы репозиторий работал как тестовая страница dev в интернете (то есть, я думаю, чтобы сохранить не-голое РЕПО). Надеюсь, я решил это, запустив репозиторий с этой серией команд (начиная с git 2.3):

git init
git config --global user.email "your@mail.here"
git config --global user.name "Your Name"
git commit
git config receive.denyCurrentBranch updateInstead

Как видно здесь: не удается нажать в репозиторий git


вскрытие проблемы

когда ветвь извлечена, committing добавит новую фиксацию с головкой текущей ветви в качестве ее родителя и переместит головку ветви в эту новую фиксацию.

так

A ← B
    ↑
[HEAD,branch1]

становится

A ← B ← C
        ↑
    [HEAD,branch1]

но если кто-то может нажать на эту ветку между ними, пользователь получит себя в том, что git называет режимом отсоединенной головы:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

теперь пользователь больше не находится в branch1, не имея явного попросил проверить другой филиал. Хуже того, пользователь теперь находится вне любой ветви, и любая новая фиксация будет просто болтаться:

     [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

гипотетически, если в этот момент пользователь проверяет другую ветку, то этот висящий совершать в игре на ГИТ в сборщик мусора.


Я думаю, что не голый репозиторий может быть полезен, когда человек настраивает git обновление крюк для развертывания из самого репозитория после нажатия. Только не забудьте сбросить репозиторий. Если вы пропустите этот шаг, файлы не будут отслеживать фактическое состояние...