git push терпит неудачу: `отказывается обновлять проверенную ветку: refs /heads / master` - PullRequest
56 голосов
/ 24 января 2012

Я хочу сохранить свои локальные изменения в конфиге JBoss в git. Для этого я настроил следующую структуру:

lrwxrwxrwx  1 jboss jboss        19 Jan 24 11:53 current -> jboss-as-7.1.0.CR1b
drwxr-xr-x 11 jboss jboss      4096 Jan 24 12:13 jboss-as-7.1.0.CR1b
-rw-r--r--  1 jboss jboss 108211143 Jan 23 16:02 jboss-as-7.1.0.CR1b.tar.gz
drwxr-xr-x  6 jboss jboss      4096 Jan 24 11:36 local

local - это git-репозиторий, который должен быть «источником». Идея состоит в том, что я хочу иметь возможность легко обновлять свой дистрибутив JBoss, как только обновление станет доступно. Я хочу хранить все локальные модификации распределенного пакета JBoss в git.

Итак, сейчас я делаю это:

jboss@tpl0:~/jboss-as-7.1.0.CR1b$ git init
Initialized empty Git repository in /opt/jboss/jboss-as-7.1.0.CR1b/.git/
jboss@tpl0:~/jboss-as-7.1.0.CR1b$ git remote add origin ../local/   
jboss@tpl0:~/jboss-as-7.1.0.CR1b$ git pull origin master 
From ../local
 * branch            master     -> FETCH_HEAD

Пока все хорошо, все мои локальные модификации там, где я хочу их.

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

jboss@tpl0:~/jboss-as-7.1.0.CR1b$ vim standalone/configuration/standalone.xml   
jboss@tpl0:~/jboss-as-7.1.0.CR1b$ git commit -a -m "renamed database to project2_core,   to distinguish from other projects"
[master 3e54f34] renamed database to project2_core, to distinguish from other projects
Committer: jboss <jboss@tpl0.(none)>
 1 files changed, 1 insertions(+), 1 deletions(-)

jboss@tpl0:~/jboss-as-7.1.0.CR1b$ git push origin master 
Counting objects: 9, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 447 bytes, done.
Total 5 (delta 3), reused 0 (delta 0)
Unpacking objects: 100% (5/5), 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 t
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int
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 som
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, se
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To ../local/
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to '../local/'

Что я могу с этим сделать? Любая помощь с благодарностью!

EDIT

Вот что я сделал, что решило проблему:

cd ~/current
git init
vim .gitignore                   # set up a basic .gitignore file
git add .gitignore
git commit -a -m "initial commit"
cd ~/local
git clone ~/current
git branch -m master current     # rename master branch to 'current'
git branch repo
git checkout repo

Теперь ветка current в каталоге ~/local всегда актуальна, но не проверена, так что я могу в нее войти.

Ответы [ 6 ]

66 голосов
/ 24 января 2012

Pushing предназначен для голых репо.Для репозиториев, не являющихся открытыми, вы должны использовать их.

Если вы все равно хотите форсировать это, вы можете сделать так, как указано в сообщении об ошибке, и настроить receive.denyCurrentBranch на игнорирование.SSH к месту репо, на которое вы нажимаете и запускаете:

git config receive.denyCurrentBranch ignore
59 голосов
/ 24 января 2012

Мастер ветка на удаленном сайте проверена.Если у вас есть доступ к удаленному репозиторию, извлеките любую другую ветку и затем нажмите из своего репозитория.

14 голосов
/ 24 января 2012

Создайте исходный (локальный) репозиторий как пустой репозиторий (т. Е. Git init --bare) или извлеките там ветку, которая не является главной.

13 голосов
/ 15 июля 2014

OR

при инициализации удаленного проекта с использованием

git init --bare
1 голос
/ 31 марта 2017

Я знаю, что это довольно старый вопрос, но если вы используете git init --bare, следите за GIT_DIR =.который будет установлен для чистого репо, если он использует хуки для того, чтобы оформить репо после нажатия.Используйте 'export GIT_DIR = .git' в своей процедуре подключения, чтобы он распознал репо, в которое вы тянете ....

1 голос
/ 12 марта 2014

Мне удалось обойти это, потянув из «local» в «current» вместо того, чтобы нажать «current» из «local».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...