Вчера я опубликовал вопрос о том, как клонировать 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 на локальной машине). Это возможная причина?
git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309Ответы:
Вы можете просто преобразовать свой удаленный репозиторий в пустой репозиторий (в пустом репозитории нет рабочей копии - папка содержит только фактические данные репозитория).
Выполните следующую команду в вашей папке удаленного хранилища:
Затем удалите все файлы, кроме
.git
этой папки. И тогда вы сможете выполнитьgit push
в удаленном хранилище без каких-либо ошибок.источник
git config --bool core.bare true
. Есть ли какая-то особая причина, по которой некоторые файлы нужно удалить? Если да, можете ли вы быть более точным в том, что нужно удалить?У меня была та же ошибка, когда я начал изучать Git . Некоторые другие ответы явно не для кого-то нового в Git!
(Я собираюсь использовать нетехнические термины, чтобы донести идею.) В любом случае, у вас есть два хранилища: одно - оригинал, который вы впервые сделали, а другое - работа, которую вы только что сделали.
Прямо сейчас вы находитесь в своем рабочем репозитории и используете ветку «master». Но вы также «залогинены» в исходном репозитории в ту же «главную» ветку. Теперь, когда вы «вошли» в оригинал, Git боится, что вы можете испортить, потому что вы можете работать с оригиналом и все испортить. Так что вам нужно вернуться в исходный репозиторий и выполнить «git checkout someotherbranch», и теперь вы можете выполнить без проблем.
Надеюсь, это поможет.
источник
git checkout -b tmp
. Тогда в источнике репо:git push
. Затем вернитесь в цель (необязательно):git checkout master; git branch -d tmp
Сообщение об ошибке описывает, что произошло. Более современные версии Git отказываются обновлять ветку с помощью push, если эта ветка извлечена.
Самый простой способ работать между двумя не голыми репозиториями - это либо
всегда обновляйте репозитории с помощью pull (или fetch and merge) или, если нужно,
нажав на отдельную ветку (ветку импорта), а затем объединяя эту ветку с главной веткой на удаленной машине.
Причина этого ограничения заключается в том, что операция push работает только в удаленном репозитории Git, у нее нет доступа к индексу и рабочему дереву. Таким образом, если это разрешено, отправка извлеченной ветки изменит ее
HEAD
на несовместимую с индексом и рабочим деревом в удаленном хранилище.Это позволит очень легко случайно зафиксировать изменение, которое отменяет все внесенные изменения, а также очень затруднит различие между любыми локальными изменениями, которые не были зафиксированы, и различиями между новым
HEAD
, индексом и рабочим деревом, которые были вызвано движением толчкаHEAD
.источник
git remote add box191 <191url>
), либо вы можете перейти из блока 191 в альтернативно названную ветвь (напримерgit push origin master:refs/heads/upload
), затем в поле 192 и объединить (напримерgit merge upload
).git config receive.denyCurrentBranch=updateInstead
: stackoverflow.com/a/28262104/6309 : вам больше не нужен вариант 2.Резюме
Вы не можете нажать на одну извлеченную ветвь репозитория, потому что он будет связываться с пользователем этого репозитория таким образом, который, скорее всего, закончится потерей данных и истории . Но вы можете нажать на любую другую ветку того же хранилища.
Поскольку в пустых репозиториях никогда не проверяется какая-либо ветка, вы всегда можете перейти в любую ветку пустого репозитория.
Есть несколько решений, в зависимости от ваших потребностей.
Решение 1. Используйте голое хранилище
Как и предполагалось, если на одной машине вам не нужен рабочий каталог, вы можете перейти в пустой репозиторий. Чтобы не связываться с хранилищем, вы можете просто его клонировать:
Теперь вы можете отправить все, что вы хотите, на тот же адрес, что и раньше.
Решение 2. Перейдите в не проверенную ветвь
Но если вам нужно проверить код на вашем пульте
<remote>
, вы можете использовать специальную ветку для push. Допустим, в вашем локальном хранилище вы назвали свой удаленныйorigin
и вы работаете с мастером филиала. Тогда вы могли бы сделатьЗатем вам нужно объединить его, когда вы находитесь в
origin
удаленном репо:Вскрытие проблемы
Когда ветвь извлечена, фиксация добавит новый коммит с заголовком текущей ветки в качестве его родителя и переместит голову ветки, чтобы стать этим новым коммитом.
Так
становится
Но если бы кто-то мог нажать на эту промежуточную ветвь, пользователь оказался бы в том, что git называет режим отключенной головы :
Теперь пользователь больше не находится в branch1, без явного запроса проверить другую ветку. Хуже того, пользователь теперь находится вне какой-либо ветви , и любой новый коммит будет просто зависать :
Гипотетически, если в этот момент пользователь проверяет другую ветвь, то этот висячий коммит становится честной игрой для сборщика мусора в Git .
источник
HEAD
в репозитории push-to.HEAD
будет по-прежнему указывать на ветвь, а ветка в свою очередь будет указывать на новую отправленную фиксацию; но рабочий каталог и index / staging-area будут неизменными. Тот, кто работает с репозиторием с принудительным переносом, теперь должен усердно работать, чтобы оправиться от последствий толчка: выяснить, есть ли какие-либо изменения для сохранения и, если это необходимо, тщательно подготовить их для сохранения.master
репозитории на своем локальном ПК. Я добавилremotes
папку в папку на сервере и пытался вставить свой репозиторий на сервер, чтобы другой пользователь мог извлечь / извлечь его для работы. Я получаю следующую ошибку:! [remote rejected] master -> master (branch is currently checked out)
Как я могу проверить это?Вы можете обойти это «ограничение», отредактировав его
.git/config
на целевом сервере. Добавьте следующее, чтобы разрешить отправку репозитория git, даже если он «извлечен»:или
Первое позволит толкать, предупреждая о возможности испортить ветку, а второе просто спокойно это разрешит.
Это может быть использовано для «развертывания» кода на сервере, который не предназначен для редактирования. Это не лучший подход, но быстрый для развертывания кода.
источник
cd .. && git reset --hard
хуком post-receive для развертывания. Взломать, но работает.git config receive.denyCurrentBranch warn
git config --local receive.denyCurrentBranch updateInstead
https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155
Используйте это в репозитории сервера, и оно также обновляет рабочее дерево, если не будет перезаписи без отслеживания.
Это было добавлено в Git 2.3, как упомянуто VonC в комментариях.
Я скомпилировал Git 2.3 и попробовал. Пример использования:
Вывод:
Yay,
b
толкнул!источник
--bare
клон, я думаю:--force
требуется нажать, и это заставит вас «потерять» коммиты на пульте.Мне нравится идея о том, что на удаленном компьютере все еще можно использовать репозиторий, но вместо фиктивной ветки мне нравится использовать:
Кажется, это очень новая функция Git - я использую git версии 1.7.7.4.
источник
git checkout master
чтобы вернуться в главную ветку. Только тогда ваши изменения будут применены.Я была такая же проблема. Для меня я использую Git push для перемещения кода на мои серверы. Я никогда не меняю код на стороне сервера, так что это безопасно.
В репозитории вы нажимаете, чтобы набрать:
Это позволит вам изменить хранилище, пока оно является рабочей копией.
После запуска Git push перейдите на удаленный компьютер и введите:
Это заставит внесенные вами изменения отразиться на рабочей копии удаленного компьютера.
Обратите внимание, что это не всегда безопасно, если вы вносите изменения в рабочую копию, на которую вы нажимаете.
источник
denyCurrentBranch
и помещаюgit checkout -f
вhooks
папку, как @ jack-senechal, размещенный здесьВы можете воссоздать свой репозиторий сервера и перенести его с главного локального филиала на главный сервер.
На вашем удаленном сервере:
ОК, из вашего местного отделения:
источник
Что вы, вероятно, сделали, чтобы вызвать это:
Такого рода вещи случаются, когда вы отправляетесь в небольшую программу. Вы собираетесь изменить что-то, что уже работало, поэтому вы разыгрываете заклинание 3-го уровня вечной отмены:
и вы начинаете добавлять / совершать. Но затем проект становится более активным, и вы хотите работать над ним с другого компьютера (например, домашнего компьютера или ноутбука), поэтому вы делаете что-то вроде
и он клонируется, и все выглядит хорошо, и поэтому вы работаете над своим кодом с machine2.
затем ... вы пытаетесь отправить свои коммиты с machine2, и вы получите предупреждающее сообщение в заголовке.
Причиной этого сообщения является то, что git-репо, из которого вы извлекли, было как бы предназначено для использования только для этой папки на машине1. Вы можете клонировать его просто отлично, но нажатие может вызвать проблемы. «Правильный» способ управления кодом в двух разных местах - это «голое» репо, как было предложено. Голые репо не предназначена, что любая работа делается в ней, она призвана координировать коммиты из нескольких источников. Вот почему самый лучший ответ предлагает удалить все файлы / папки, кроме папки .git, после того, как вы
git config --bool core.bare true
.Уточнение ответа с самым высоким рейтингом: во многих комментариях к этому ответу говорится что-то вроде: «Я не удалял файлы, не относящиеся к .git, с machine1, и я все еще мог зафиксировать с machine2». Вот так. Однако эти другие файлы полностью «отделены» от git-репо. Попробуйте
git status
там, и вы должны увидеть что-то вроде «роковой: эта операция должна выполняться в рабочем дереве». Таким образом, предложение удалить файлы не так, чтобы коммит с machine2 работал ; это чтобы вы не запутались и не подумали, что git все еще отслеживает эти файлы. Но удаление файлов является проблемой, если вы все еще хотите работать с файлами на компьютере1, не так ли?Итак, что вы должны делать?
Зависит от того, сколько вы планируете по-прежнему работать на machine1 и machine2 ...
Если вы закончили разработку с machine1 и перенесли всю свою разработку на machine2 ... просто сделайте то, что предлагает ответ с самым высоким рейтингом:
git config --bool core.bare true
а затем, при необходимости, удалите все файлы / папки, кроме .git, из этой папки, так как они не отслежены и могут вызвать путаницу.Если ваша работа на machine2 была разовой, и вам не нужно продолжать там разработку ... тогда не пытайтесь делать голое репо; просто ftp / rsync / scp / и т.д. ваши файлы с машины * 2 * поверх файлов на машине * 1 *, подтвердите / нажмите с машины * 1 *, а затем удалите файлы с машины * 2 *. Другие предлагали создать ветку, но я думаю, что это немного запутанно, если вы просто хотите объединить какую-то разработку, которую вы делали единовременно, с другой машины.
Если вам нужно продолжить разработку как на machine1, так и на machine2 ... тогда вам нужно правильно все настроить. Вам нужно конвертировать репо в голое, затем вам нужно сделать клон этого на machine1, чтобы вы могли с ним работать . Вероятно, самый быстрый способ сделать это -
Очень важно: поскольку вы перенесли расположение репозитория с proj1 на proj1.git, вам необходимо обновить его в файле .git / config на machine2 . После этого вы можете зафиксировать свои изменения с machine2. Наконец, я стараюсь хранить свои голые репозитории в центральном месте, вдали от моих рабочих деревьев (то есть не помещайте «proj1.git» в ту же родительскую папку, что и «proj1»). Я советую вам сделать то же самое, но я хотел, чтобы описанные выше шаги были максимально простыми.
источник
С помощью нескольких шагов настройки вы можете легко развернуть изменения на своем веб-сайте, используя одну строку, например
Что приятно и просто, и вам не нужно заходить на удаленный сервер и делать попытки или что-то еще. Обратите внимание, что это будет работать лучше всего, если вы не используете свой производственный контроль как рабочую ветку! (OP работал в несколько ином контексте, и я думаю, что решение @Robert Gould хорошо сработало. Это решение больше подходит для развертывания на удаленном сервере.)
Во-первых, вам нужно настроить пустой репозиторий где-то на вашем сервере, вне вашего webroot.
Затем создайте файл
hooks/post-receive
:И сделайте файл исполняемым:
На вашей локальной машине,
Все готово! Теперь в будущем вы можете использовать
git push production
для развертывания ваших изменений!Кредит на это решение идет в http://sebduggan.com/blog/deploy-your-website-changes-using-git/ . Ищите там более подробное объяснение того, что происходит.
источник
bare
, я следую этому и сливаюсь сhooks
(что вы предложили) и работал отлично.Вы должны только подтолкнуть к голому хранилищу. Пустое хранилище - это хранилище, в котором нет проверенных веток. Если вы перейдете в пустой каталог репозитория, вы увидите только содержимое каталога .git.
источник
У вас есть 3 варианта
Потяните и нажмите еще раз:
Нажмите в другую ветку:
и объединить его на пульте дистанционного управления (либо
git
или выдвижной запросу )Принудительно (не рекомендуется, если вы не намеренно изменили коммиты через
rebase
):Если все еще отказано, отключите
denyCurrentBranch
в удаленном хранилище:источник
На самом деле, достаточно установить удаленную ветку на неиспользованную ветку. После того, как вы проверили пульт в другой ветке, вы можете нажать.
источник
Проверьте свой
.git/config
в целевом проекте:Если
core. bare
false, вы можете установить его в true:а затем в вашем локальном пуш к удаленному:
это будет успешно, в remote_repo вы можете проверить версию git.
и теперь вы не можете использовать git в своем «рабочем пространстве»:
Вы должны установить
bare.bare
обратно в ложь.источник
У меня была та же проблема с использованием Git для синхронизации репозиториев на моем телефоне Android и ноутбуке. Решением для меня было сделать тягу вместо толчка, как предложил @CharlesBailey.
git push origin master
в Android-хранилище у меня происходит сбой с теми же сообщениями об ошибках, которые получил @ hap497 из-за толчка к несложной проверке хранилища + рабочей копии.git pull droid master
на ноутбуке у меня работает репозиторий и рабочая копия. Конечно, нужно предварительно запустить что-то подобноеgit remote add droid /media/KINGSTON4GB/notes_repo/
.источник
Более ранние версии Git, используемые для разрешения проталкивания в текущую извлеченную ветвь не-пустого хранилища.
Оказывается, это было ужасно запутанно. Поэтому они добавили предупреждающее сообщение, которое вы видите, что также очень запутанно.
Если первый репозиторий просто действует как сервер, то преобразуйте его в пустой репозиторий, как рекомендуют другие ответы, и покончите с этим.
Однако, если вам нужно иметь общую ветку между двумя репо, которые используются, вы можете добиться этого с помощью следующей настройки
Repo1 - будет выступать в роли сервера, а также использоваться для разработки
Repo2 - будет только для разработки
Настройте Repo1 следующим образом
Создайте ветку, чтобы поделиться работой.
Чтобы быть в безопасности, вы также должны создать $ (REPO) .git / hooks / update, который отклоняет любые изменения чего-либо, кроме shared_branch, потому что вы не хотите, чтобы люди копались в ваших личных ветках.
Теперь создайте локальный филиал в repo1, где вы будете выполнять свою реальную работу.
(возможно, для
git config --global push.default upstream
того,git push
чтобы работать)Теперь вы можете создать repo2 с
На этом этапе у вас есть и настройки repo1, и repo2 для работы с локальными ветвями, которые запускаются и извлекаются из
shared_branch
repo1, не беспокоясь об этом сообщении об ошибке или не синхронизируя рабочий каталог в repo1. Какой бы нормальный рабочий процесс вы ни использовали, он должен работать.источник
Хорошо, если вам нужен обычный удаленный репозиторий, создайте дополнительную ветку и проверьте ее. Вставьте его в одну ветку (которая не извлечена) и объедините ее с той, которая активна в данный момент позже, после выталкивания из локально.
Например, на удаленном сервере:
На локальной установке:
На удаленном сервере:
источник
Вот один тест, который вы можете сделать, чтобы увидеть, как работает
bare
серверная часть:Представьте, что у вас есть рабочая станция и сервер с размещенным на ней живым сайтом, и вы хотите время от времени обновлять этот сайт (это также относится к ситуации, когда два разработчика отправляют свою работу туда и обратно через голого посредника).
инициализация
Создайте каталог на своем локальном компьютере и
cd
вставьте в него, затем выполните следующие команды:server
каталог (обратите внимание на .git в конце). Этот каталог будет служить контейнером только для ваших файлов репозитория.content
каталог. Это ваш каталог live / production, который будет обслуживаться вашим серверным программным обеспечением.Workflow
Теперь вот основной рабочий процесс:
Войдите в
local
каталог, создайте несколько файлов и зафиксируйте их. Наконец, отправьте их на сервер:Теперь введите
content
каталог и обновите содержимое сервера:Повторите 1-2. Здесь
content
может быть другой разработчик, который также может подтолкнуть к серверу, и,local
как вы можете вытащить от него.источник
Использование этого для передачи его в удаленную ветку upstream решило эту проблему для меня:
Удаленный не имел доступа к репозиторию в восходящем направлении, так что это был хороший способ получить последние изменения в этом удаленном
источник
git push <remote> master:newbranch
. Идея состоит в том, что вы отправляете новую ветку на удаленный узел, который затем можно объединить. Таким образом вы избежите любых проблем несоответствия, упомянутых в сообщении об ошибке.Мне пришлось перезапускать
git --init
в существующем пустом хранилище, и это создало.git
каталог внутри пустого дерева хранилища - я понял это после вводаgit status
там. Я удалил это, и все снова было хорошо :)(Все эти ответы великолепны, но в моем случае это было что-то совершенно другое (насколько я вижу), как описано.)
источник
Я уверен, что большинство людей, просматривающих этот вопрос, остановятся на первых двух огромных ответах, но я все же хотел бы предложить свое решение.
У меня была настройка веб-проекта Eclipse + EGit при обнаружении описанной ошибки. Что мне помогло, так это простое использование приложения GitHub, которое, казалось, волшебным образом решило проблему. В то время как EGit всегда отказывался от пуша, настольное приложение GitHub просто пожало плечами и подтолкнуло мои изменения. Может быть, он обрабатывает ситуацию с несколькими входами более изящно.
источник
Статья, которую я нашел, которая может быть полезна другим, - это Git за 5 минут .
У меня был проект XCode под управлением версией Git, который я хотел передать в виртуальный распределенный Ethernet (VDE), который у меня есть в DC. VDE работает Centos 5.
Ни одна из статей, которые я читал о Git, не говорила о голых репозиториях. Все это звучало так просто, пока я не попробовал то, что, по моему мнению, должно быть легко, исходя из фона SVN .
Предложения здесь, чтобы сделать удаленный репозиторий голым, работали. Еще лучше для моих требований было клонировать проект Xcode
projectname.git
, скопировать его на удаленный сервер; затем толчки волшебным образом сработали. Следующим шагом будет получение Xcode для отправки без ошибок о коммитах, но пока я в порядке, делая это из терминала.Так:
Чтобы отправить изменения из вашего проекта Xcode после фиксации в Xcode:
Я уверен, что есть более плавный и изощренный способ сделать это, но как минимум это работает. Просто, чтобы все было ясно, вот некоторые пояснения:
/xcode-project-directory
каталог, в котором хранится ваш проект xcode./Users/Your_Name/Documents/Project_Name
. имя проекта - это буквально название проекта, но это может быть любое название. Git не волнует, ты будешь.Чтобы использовать scp, вам нужно иметь учетную запись пользователя на удаленном сервере, которому разрешен доступ по SSH . Любой, у кого есть собственный сервер, будет иметь это. Если вы используете виртуальный хостинг или тому подобное, вам может не повезти.
remotehost.com
это имя вашего удаленного хоста. Вы можете так же легко использовать его IP-адрес. Просто для большей ясности я использую Gitosis на удаленном хосте с SSH-ключами, поэтому мне не нужно вводить пароли при нажатии. В статье « Хостинг Git-репозиториев, простой (и безопасный) способ» рассказывается, как все это настроить.источник
Лучший способ сделать это:
Это приведет к клонированию хранилища, но не создаст никаких рабочих копий
.../remote
. Если вы посмотрите на пульт, вы увидите созданный каталог,currentrepo.git
который, вероятно, вам нужен.Затем из вашего локального репозитория Git:
После внесения изменений вы можете:
источник
Я только что столкнулся с этой проблемой в Git-репозитории на Heroku .
Я не знаю, почему у Heroku есть хранилище с ненастроенным хранилищем, но в качестве обходного пути я смог сбросить настройки удаленного хранилища и перезагрузить его.
Вы не должны использовать копию своего хранилища Heroku в качестве единственного git-хранилища для совместной работы, но на всякий случай я четко скажу: не делайте этого, если вы не уверены, что у вас есть полная копия вашего хранилища, надежно хранящаяся где-то, кроме Heroku. Выполнение сброса приведет к удалению содержимого хранилища.
Для сброса:
Установите плагин heroku-repo, если вы этого еще не сделали.
Сделайте сброс, который удалит хранилище и создаст новый, пустой
Нажмите на пульт Heroku, как обычно; это перезагрузит все.
источник
heroku plugins:install https://github.com/heroku/heroku-repo.git
Вам нужно будет изменить файл конфигурации на удаленном сервере, как только вы создадите пустой (пустой) репозиторий, скажем
там вы увидите
Вы превратите это значение от ложного до истинного, и я удалил logallrefupdates = true (не уверен в его использовании!)
в
Вы можете проверить следующее
Эта ветка HEAD: (неизвестно) будет показана, если вы не можете нажать. Так что, если ветвь HEAD неизвестна, вы должны изменить голое значение на true, а после успешного нажатия вы можете повторно использовать
и ты увидишь
источник
Для меня рабочее решение это:
НА УДАЛЕННО:
НА МЕСТНОМ
НА УДАЛЕННО:
Но это не реальное решение, это просто обходной путь.
источник
На всякий случай, если кто-то найдет это полезным. Для меня это была проблема с разрешениями на git-сервере. Я проверил проект с самого начала и отправил простой файл, а затем я получил «Push rejected: Push to origin / master был отклонен»
источник
С Git два обычных (не голых) репозитория не могут напрямую перемещать / извлекать файлы назад и вперед. Должен быть промежуточный голый репозиторий. Видимо, это похоже на семейную пару, у которой есть ребенок, и пара разводится. Родители не будут разговаривать друг с другом, но они будут общаться через ребенка.
Итак, у вас есть один репозиторий, вы клонируете этот репозиторий в пустой репозиторий, а затем клонируете его в третий. Первый и третий могут обмениваться информацией через второй репозиторий, пустой. Я думаю, что это имеет смысл, так как вы не хотели бы, чтобы кто-то мог проверить вещи в вашем хранилище без вашего согласия, так как это может вызвать конфликты слияния и тому подобное.
Итак, вот пример:
На ПК в ~ / рабочей области
На ноутбуке, в ~ / workspace (не делайте git init и т. Д.)
// Затем делаем различные коммиты и нажимаем на них:
Затем снова на ПК, в ~ / рабочей области
// Затем делаем различные коммиты и нажимаем на них:
На ноутбуке git pull
и так далее..
Вот абсолютно конкретный пример, все на одной машине, скопированный прямо из окна команд, так что мы будем знать, что не было пропущено ни одного шага, что это действительно сработало и т.д .:
источник
Мое решение (используется)
бинго
источник