Git push error '[удаленный отклонен] master -> master (ветка в настоящее время извлечена)' - PullRequest
926 голосов
/ 12 мая 2010

Вчера я опубликовал вопрос о том, как клонировать репозиторий Git с одной из моих машин на другую, Как я могу 'git clone' с другой машины? .

Теперь я могу успешно клонировать Git-репозиторий из моего источника (192.168.1.2) в пункт назначения (192.168.1.1).

Но когда я произвел редактирование файла, a git commit -a -m "test" и a git push, я получаю эту ошибку в пункте назначения (192.168.1.1):

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
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.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

Я использую две разные версии Git (1.7 на пульте и 1.5 на локальной машине). Это возможная причина?

Ответы [ 30 ]

18 голосов
/ 15 октября 2012

С помощью нескольких шагов настройки вы можете легко развернуть изменения на своем веб-сайте, используя однострочную строку, например

git push production

Что приятно и просто, и вам не нужно заходить на удаленный сервер и делать попытки или что-то еще. Обратите внимание, что это будет работать лучше всего, если вы не используете свой производственный контроль как рабочую ветку! (ОП работал в несколько ином контексте, и я думаю, что решение @Robert Gould хорошо сработало. Это решение больше подходит для развертывания на удаленном сервере.)

Сначала вам нужно создать пустой репозиторий где-нибудь на вашем сервере, вне вашего webroot.

mkdir mywebsite.git
cd mywebsite.git
git init --bare

Затем создайте файл hooks/post-receive:

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

И сделать файл исполняемым:

chmod +x hooks/post-receive

На вашем локальном компьютере

git remote add production git@myserver.com:mywebsite.git
git push production +master:refs/heads/master

Все готово! Теперь в будущем вы можете использовать git push production для развертывания ваших изменений!

Кредит на это решение идет на http://sebduggan.com/blog/deploy-your-website-changes-using-git/. Более подробное объяснение происходящего здесь.

10 голосов
/ 12 мая 2010

Вы должны толкать только в пустой репозиторий. Пустое хранилище - это хранилище, в котором нет проверенных веток. Если вы перейдете в пустой каталог репозитория, вы увидите только содержимое каталога .git.

9 голосов
/ 30 сентября 2015

У вас есть 3 варианта

  1. Потяните и снова нажмите:

    git pull; git push
    
  2. Вставить в другую ветку:

    git push origin master:foo
    

    и объединить его на удаленном компьютере (либо git, либо pull-request )

    git merge foo
    
  3. Принудительно (не рекомендуется, если вы не намеренно изменили коммит с помощью rebase):

    git push origin master -f
    

    Если все еще отказано, отключите denyCurrentBranch в удаленном хранилище:

    git config receive.denyCurrentBranch ignore
    
7 голосов
/ 11 декабря 2010

На самом деле, достаточно установить удаленную ветку на не проверенную ветку. После того, как вы проверили пульт в другой ветке, вы можете нажать.

5 голосов
/ 15 апреля 2012

У меня была та же проблема с использованием Git для синхронизации репозиториев на моем телефоне Android и ноутбуке. Решением для меня было сделать тягу вместо толчка, как предложил @CharlesBailey.

git push origin master в хранилище Android для меня не работает с теми же сообщениями об ошибках, которые получил @ hap497 из-за толчка к несложной проверке хранилища + рабочей копии.

git pull droid master на репозитории ноутбука и у меня работает рабочая копия. Конечно, вам нужно предварительно запустить что-то вроде git remote add droid /media/KINGSTON4GB/notes_repo/.

4 голосов
/ 28 октября 2014

Более ранние версии Git, используемые для разрешения проталкивания в текущую извлеченную ветвь не-пустого хранилища.

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

Если первый репозиторий просто выступает в роли сервера, преобразуйте его в пустой репозиторий, как рекомендуют другие ответы, и покончите с этим.

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

Repo1 - будет выступать в роли сервера, а также использоваться для разработки

Repo2 - будет только для разработки

Настройте Repo1 следующим образом

Создайте ветку, чтобы поделиться работой.

git branch shared_branch

Чтобы быть в безопасности, вы также должны создать $ (REPO) .git / hooks / update, который отклоняет любые изменения чего-либо, кроме shared_branch, потому что вы не хотите, чтобы люди копались в ваших частных ветвях.

repo1/.git/hooks  (GIT_DIR!)$ cat update
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"

if [ "${refname}" != "refs/heads/shared_branch" ]
then
   echo "You can only push changes to shared_branch, you cannot push to ${refname}"
   exit 1
fi

Теперь создайте локальную ветку в repo1, где вы будете выполнять свою реальную работу.

git checkout -b my_work --track shared_branch
Branch my_work set up to track local branch shared_branch.
Switched to a new branch 'my_work'

(может потребоваться git config --global push.default upstream, чтобы git push работал)

Теперь вы можете создать repo2 с помощью

git clone path/to/repo1 repo2 
git checkout shared_branch 

На этом этапе у вас есть настройки repo1 и repo2 для работы с локальными ветками, которые запускают и извлекают из shared_branch в repo1, не беспокоясь об этом сообщении об ошибке или не синхронизируя рабочий каталог в repo1. Какой бы нормальный рабочий процесс вы ни использовали, он должен работать.

2 голосов
/ 18 июля 2012

Вот один тест, который вы можете сделать, чтобы увидеть, как работает сервер bare:

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

Инициализация

Создайте какой-нибудь каталог на своемлокальный компьютер и cd в него, затем выполните следующие команды:

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. Сначала вы создаете пустой каталог server (обратите внимание на .git в конце).Этот каталог будет служить контейнером только для ваших файлов репозитория.
  2. Затем клонируйте ваш репозиторий сервера во вновь созданный каталог content.Это ваш действующий / рабочий каталог, который будет обслуживаться вашим серверным программным обеспечением.
  3. Первые два каталога находятся на вашем сервере, третий - локальный каталог на вашей рабочей станции.

Рабочий процесс

Теперь вот основной рабочий процесс:

  1. Войдите в каталог local, создайте несколько файлов и зафиксируйте их.Наконец, отправьте их на сервер:

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. Теперь введите каталог content и обновите содержимое сервера:

    git pull
    
  3. Повторите 1-2.Здесь content может быть другим разработчиком, который также может выдвигаться на сервер, и local, как вы можете от него извлекать.

2 голосов
/ 31 января 2013

ОК, если вам нужен обычный удаленный репозиторий, создайте дополнительную ветку и проверьте ее. Вставьте его в одну ветвь (которая не извлечена) и объедините ее с той, которая активна в данный момент позже после выталкивания из локально.

Например, на удаленном сервере:

git branch dev
git checkout dev

При локальной настройке:

git push 

На удаленном сервере:

git merge dev
2 голосов
/ 18 мая 2018

проверьте ваш .git/config в проекте назначения:

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[receive]
    denyCurrentBranch = updateInstead

Если core. bare имеет значение false, вы можете установить его в значение true:

$ git config core.bare true

и затем в своемлокальный push to remote:

git push remote_repo   // suppose the destination repo is remote_repo

это будет успешно, в remote_repo вы можете проверить версию git.

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < aircraft_xxx@126.com>
Date:   Thu May 17 21:54:37 2018 +0800

и теперь вы не можете использовать git в своем «рабочем пространстве»:

$ git status
fatal: This operation must be run in a work tree

вы должны установить bare.bare обратно в false.

$ git config core.bare false
1 голос
/ 05 октября 2018

Использование этого для передачи его в удаленную ветвь верхнего уровня решило эту проблему для меня:

git push <remote> master:origin/master

Пульт не имел доступа к репозиторию в восходящем направлении, так что это был хороший способ получить последние изменения в этом удаленном

...