Проблема заключается в том, что эти две конфигурации находятся в конфликте (хотя я согласен, что в принципе они не должны быть):
receive.denyCurrentBranch
установлено на updateInstead
В этом случае во время получения Git замечает, что целью является текущая ветвь, поэтому Git проверяет фиксацию.
и receive.denyNonFastForwards
установленына true
.
Это происходит отдельно: изменение имени отклонено.Коммит уже был принят, и проверка хранилища произошла, и сейчас отклонение имени отклонено.
Я также заметил такое же поведение (неправильно) когда ловушка обновления отклоняет изменения на сервере (но не ловушка предварительного получения).
Это та же проблема: ловушка предварительного получения запускается один раз, перед любыми обновлениями отдельных ссылок,и может отклонить весь толчок.Затем, если ловушка предварительного получения очистила вещи для продолжения, ловушки обновления могут отклонить любое отдельное обновление ref-name.Однако updateInstead
происходит отдельно от того, что обновление имени ветки принято или отклонено.
Вероятно, было бы лучше для Git внутренне избежать изменения рабочего дерева до тех пор, пока после не проверит эталонное обновление,Это потребует некоторых переделок во внутренностях Git.Если это не считается явной ошибкой в Git, это, по крайней мере, довольно удивительно.Фактически, весь этот код нуждается в некоторой работе, потому что если вы используете git worktree add
, Git не сможет рассматривать заголовки добавленных рабочих деревьев как текущие ветви.Учитывая все эти предостережения, я бы рекомендовал использовать только голые репозитории в качестве целей push-уведомлений с перехватами после получения для прямого обновления в других репозиториях или рабочих деревьях.
В стороне (это был комментарий,но это было слишком коротко, чтобы выразить это очень хорошо):
git config --global receive.denyCurrentBranch updateInstead
git config --global receive.denyNonFastForwards true
Хотя это не связано с конкретным поведением, которое вы наблюдали, это определенно неправильная вещь.Запуск git config --global
устанавливает элементы конфигурации для вас лично.То есть они входят в /home/rajesh
(или везде, где находится конфигурация вашего домашнего каталога).Но настройки receive.*
должны быть для каждого репозитория .
Поскольку вы используете ssh
в качестве самого себя для выполнения push, эти параметры конфигурации действительно вступили в силу, но если бы вы когда-либопротолкнуть каким-либо другим методом, они не могут.Любые настройки для каждого репозитория, сделанные с помощью git config
без --global
, все равно будут действовать.