Ошибка failed: remote not allowed in locked state появляется при попытке выполнить git push или git fetch в репозиторий, который находится в заблокированном состоянии на стороне сервера — чаще всего это хостинги вроде GitLab, Gitea или корпоративные Git-серверы. Сама по себе блокировка — не сбой, а защитный механизм: сервер запрещает изменения, пока идёт фоновый процесс (миграция, зеркалирование, обслуживание) или пока администратор вручную не снял ограничение.
Проблема в том, что текст ошибки не объясняет, кто и зачем заблокировал репозиторий. Из-за этого пользователи начинают менять локальные настройки Git, хотя причина почти всегда на стороне сервера. Ниже разберём, как отличить серверную блокировку от локальной, какие проверки безопасны и что делать, если доступа к администрированию репозитория у вас нет.
Что означает состояние locked state
Состояние locked (заблокировано) означает, что сервер Git временно запретил операции записи, а иногда и чтения для конкретного репозитория. Это штатный механизм: например, в GitLab репозиторий может блокироваться во время импорта проекта, при зеркалировании (repository mirroring) или при сбое фоновой задачи, которая не сняла блокировку корректно.
Локальный клиент Git при этом работает исправно. Он просто получает от сервера отказ и выводит его в консоль вместе с текстом remote: ... not allowed in locked state. Поэтому переустановка Git, смена SSH-ключей или пересоздание локального клона, как правило, ничего не меняют.
⚠️ Внимание: не пытайтесь обойти блокировку принудительными командами вроде git push --force. Если репозиторий заблокирован во время миграции или зеркалирования, принудительная отправка после снятия блокировки может перезаписать актуальные данные. Сначала выясните причину блокировки.
Типичные причины блокировки репозитория
Чтобы выбрать правильное действие, нужно понять, какой сценарий привёл к блокировке. Ниже — наиболее частые варианты, которые встречаются на практике.
- 🔄 Зеркалирование репозитория — pull-зеркало периодически забирает изменения с другого сервера, и на время синхронизации push в зеркало запрещён.
- 📦 Импорт или миграция проекта — репозиторий переносится с другого хостинга, и до завершения переноса он доступен только для чтения или полностью заблокирован.
- 🛠️ Обслуживание сервера — администраторы проводят обновление, бэкап или проверку целостности хранилища.
- ⚙️ Зависшая фоновая задача — процесс, который должен был снять блокировку, завершился с ошибкой, и репозиторий «застрял» в locked-состоянии.
- 🔒 Ручная блокировка администратором — например, при расследовании инцидента безопасности или споре по правам доступа.
Точную причину подскажет только интерфейс хостинга или администратор. В GitLab статус проекта виден в настройках, в Gitea — в административной панели, если у вас есть соответствующие права.
Шаг 1. Проверьте, что проблема на стороне сервера
Прежде чем что-то менять, выполните простую диагностику. Откройте терминал и проверьте, как сервер отвечает на операцию чтения:
git fetch origin
Если и чтение возвращает ту же ошибку про locked state — репозиторий заблокирован полностью. Если fetch проходит, а push отклоняется — заблокирована только запись, что типично для зеркал и импортируемых проектов.
Дополнительно откройте репозиторий в веб-интерфейсе хостинга. Часто рядом с названием проекта отображается статус вроде «Import in progress» или «Repository mirror». Это самый быстрый способ подтвердить причину без доступа к серверу.
Шаг 2. Определите сценарий и действуйте по нему
Дальнейшие действия зависят от того, кто управляет репозиторием. Разберём три основных сценария.
Вы владелец проекта на публичном хостинге. Проверьте настройки проекта: в GitLab посмотрите раздел зеркалирования (Settings → Repository → Mirroring repositories) и статус импорта. Если зеркало настроено на pull — push в этот репозиторий по задумке невозможен, изменения нужно вносить в исходный репозиторий.
Репозиторий корпоративный. Здесь самостоятельно снять блокировку обычно нельзя. Направьте администратору текст ошибки, имя репозитория и время, когда ошибка появилась. Администратор сможет проверить фоновые задачи и при необходимости снять зависшую блокировку.
Вы администратор сервера. Проверьте очередь фоновых задач и логи: зависший импорт или задача синхронизации — частая причина «застрявшей» блокировки. Конкретные команды зависят от платформы и её версии, поэтому сверяйтесь с официальной документацией вашей установки (GitLab, Gitea и т.д.), а не с чужими инструкциями.
☑️ Диагностика locked state
Шаг 3. Что проверить после снятия блокировки
Когда блокировка снята, не спешите сразу отправлять накопившиеся коммиты. Сначала синхронизируйтесь с сервером: за время блокировки туда могли попасть изменения из зеркала или миграции.
git fetch origin
git status
git pull --rebase
Команда git status покажет, не разошлись ли ваша локальная ветка и удалённая. Если история разошлась, pull --rebase аккуратно перенесёт ваши коммиты поверх актуального состояния. Только после этого выполняйте git push.
Чего делать не стоит
Некоторые популярные советы из форумов в этой ситуации бесполезны или вредны. Кратко — что можно смело пропустить.
- 🚫 Пересоздание локального клона — не поможет, блокировка на сервере, а не у вас.
- 🚫 Смена протокола с SSH на HTTPS — сервер отклонит операцию по любому протоколу.
- 🚫 Push с флагом --force — риск потери данных, если блокировка была связана с миграцией.
- 🚫 Сброс локальных настроек Git — к серверной блокировке отношения не имеет.
⚠️ Внимание: если репозиторий заблокирован из-за инцидента безопасности (например, утечки ключей в истории коммитов), снятие блокировки и дальнейшие действия должен согласовывать владелец проекта или администратор. Самовольная отправка коммитов может усугубить проблему.
Сравнение сценариев блокировки
Таблица ниже поможет быстро сориентироваться по симптомам.
| Сценарий | Чтение (fetch) | Запись (push) | Что делать |
|---|---|---|---|
| Зеркалирование (pull mirror) | Работает | Запрещён | Вносить изменения в исходный репозиторий |
| Импорт / миграция | Часто запрещён | Запрещён | Дождаться завершения переноса |
| Обслуживание сервера | Может быть запрещено | Запрещён | Дождаться окончания работ |
| Зависшая задача | Зависит от сбоя | Запрещён | Обратиться к администратору |
| Ручная блокировка | По решению администратора | Запрещён | Уточнить причину у владельца проекта |
Если блокировка не снимается долго
Иногда репозиторий остаётся заблокированным часами или днями. Это почти всегда признак зависшей фоновой задачи, а не плановых работ — плановое обслуживание редко длится так долго.
Действия здесь простые: зафиксируйте время появления ошибки, сделайте скриншот статуса проекта в веб-интерфейсе и передайте информацию администратору или в поддержку хостинга. Чем точнее вы опишете симптомы (полный текст ошибки, результаты fetch и push), тем быстрее найдут зависший процесс.
Как сохранить работу, пока репозиторий заблокирован
Продолжайте коммитить локально — блокировка не мешает работе с локальной историей. Если нужно поделиться изменениями с коллегой срочно, можно временно добавить второй remote на другой репозиторий (git remote add temp <url>) и отправить ветку туда, а после снятия блокировки синхронизировать основной репозиторий.
Частые вопросы
Можно ли снять locked state локальной командой Git?
Нет. Блокировка хранится на сервере, и клиент Git не имеет команд для её снятия. Управлять состоянием может только владелец проекта через веб-интерфейс или администратор сервера.
Ошибка появляется только при push, а fetch работает — это нормально?
Да, это типичная картина для репозиториев-зеркал и проектов, заблокированных только на запись. Проверьте настройки зеркалирования: скорее всего, изменения нужно вносить в исходный репозиторий.
Поможет ли смена SSH-ключа или токена?
Нет. Ошибка locked state не связана с аутентификацией — сервер вас узнаёт, но отклоняет операцию из-за состояния репозитория. Проблемы с ключами выдают другие ошибки, например Permission denied.
Сколько обычно длится блокировка при импорте?
Зависит от размера репозитория и загруженности сервера: от минут для небольших проектов до заметного времени для крупных историй с большими файлами. Если статус импорта не меняется неоправданно долго, это повод обратиться к администратору или в поддержку хостинга.
Потеряются ли мои локальные коммиты, пока репозиторий заблокирован?
Нет. Локальные коммиты хранятся на вашем компьютере и никуда не денутся. После снятия блокировки выполните git pull --rebase и затем git push, чтобы отправить их на сервер.