Не может запихнуть в репозиторий git

Это то, что я сделал до сих пор, и я скажу, что эта процедура работала на Ubuntu 9.10, которая, возможно, имела другую версию git.

server: mkdir ~/git

local: scp -r /../project name@url.com:~/git/
server: cd git
        cd project
        git init 
        git add .
        git commit -a -m "initial"

local: git clone name@url.com:/../git/project /home/name/project
   cd project
   capify .  (from the ruby gem capistrano)
   git add .
   git commit -a -m "capified"
   git push

Когда я пытаюсь вытолкнуть это, я получаю это сообщение об ошибке:

   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 ...
   ! [remote rejected] master -> master (branch is currently checked out)
   error: failed to push some refs to

8 ответов

На стороне сервера сделайте это:

git config receive.denyCurrentBranch ignore

Тогда вы можете нажать на местных.

Теперь возможно продвижение к непроявленному репо (Git 2.3.0, февраль 2015 г.).
И это возможно, когда вы нажимаете на ветку, проверенную в данный момент в удаленном репо!

Смотрите коммит 1404bcb Йоханнеса Шинделина ( dscho ):

receive-pack: добавить еще один вариант для receive.denyCurrentBranch

При синхронизации между рабочими каталогами может быть удобно обновить текущую ветку с помощью ' push ' скорее, чем ' pull ', например, при извлечении исправления изнутри виртуальной машины или при отправке исправления, сделанного на машине пользователя (где разработчик не вправе устанавливать демон ssh, не говоря уже о том, чтобы знать пароль пользователя).

Обычный обходной путь - вставка во временную ветку и затем слияние на другом компьютере - больше не требуется с этим патчем.

Новая опция:

updateInstead

Обновите рабочее дерево соответствующим образом, но откажитесь сделать это, если есть какие-либо незафиксированные изменения.

То есть:

git config receive.denyCurrentBranch updateInstead

Попробуйте следующую команду:

git config receive.denyCurrentBranch warn

Как я уже указывал в этом посте, как в gitku-подобной настройке git? отправка в рабочие репозитории немного опасна, так как любая незавершенная работа не учитывается толчком, и впоследствии довольно легко потерять любые незафиксированные изменения (в основном, рабочий HEAD может выйти из шага с рабочей ветвью HEAD). Git теперь имеет предупреждение, чтобы сообщить вам об этом - gory, подробности находятся по следующей ссылке:

мерзавец толчок к не голому хранилищу

Рекомендуется, чтобы ваш опубликованный репозиторий был пустым репозиторием, у которого нет извлеченного дерева. Голые репозитории создаются с использованием опции "git clone --bare".

Так как ты побежал git init на сервере вы создали рабочий директой, но я думаю, что вы хотите создать пустой репозиторий.

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

Если вы хотите поделиться своим проектом, создайте пустой репозиторий git init --bare project.git на сервере, затем клонировать его на свою машину, и вы сможете нажать на него.

Если вы не хотите создавать новый сейчас, вы можете клонировать свой проект в новое голое хранилище с помощью git clone --bare project new-bare-project.git

Как на стороне клиента, так и на стороне сервера

d:\Repositories\repo.git>git config receive.denyCurrentBranch updateInstead

У меня не сработало. Версия клиента и сервера: 2.16.2.windows.1

Я добавил это в \\File-server\projectFolder\.git\config

[receive]
    denyCurrentBranch = updateInstead

Это работает для Windows. Не нужно init --bare

Ответ VonC был полезен, но мне потребовалось некоторое время, чтобы понять, что для Windows команда будет следующей без равных.

d:\Repositories\repo.git>git config receive.denyCurrentBranch updateInstead

Моя версия Git для Windows v2.11.1

Другие вопросы по тегам