Введение / Зачем это нужно
Ошибка permission denied (отказ в доступе) — одна из самых частых проблем при работе с Git на Linux. Она возникает, когда у текущего пользователя нет прав на чтение/запись файлов в директории репозитория или при обращении к удалённому серверу. Эта инструкция поможет быстро диагностировать и исправить проблему, восстановив работоспособность Git без потери данных.
Требования / Подготовка
Перед началом убедитесь, что:
- У вас есть доступ к терминалу Linux (Ubuntu, Debian, Fedora и т.д.)
- Установлен Git (версия 2.30 или новее). Проверить:
git --version - Вы знаете полный путь к локальному репозиторию, где возникает ошибка
- Для некоторых шагов могут потребоваться права
sudo(если репозиторий в системной директории)
Причины ошибки 'permission denied' в Git
Ошибка обычно вызвана одной из следующих причин:
- Несовпадение владельца файлов: Файлы репозитория принадлежат другому пользователю (например,
root), а вы работаете под своей учётной записью. - Системные директории: Попытка разместить репозиторий в защищённой папке (
/usr,/opt,/var). - Некорректные права: У файлов или папок репозитория отсутствуют флаги чтения/записи для вашего пользователя.
- Проблемы с удалённым доступом: Неверные права на SSH-ключ или недостаточно прав на удалённом сервере.
Шаг 1: Определите точную причину ошибки
Сначала посмотрите полный текст ошибки в терминале. Он укажет, какая операция (clone, pull, push, fetch) и в каком пути вызвала проблему.
# Пример ошибки при попытке клонирования
git clone https://github.com/user/repo.git
# fatal: could not create work tree dir 'repo': Permission denied
# Пример ошибки при pull
git pull origin main
# error: unable to create file path/to/file.txt: Permission denied
Запишите полный путь к репозиторию, упомянутый в ошибке.
Шаг 2: Исправьте права доступа к файлам репозитория
Если репозиторий уже существует и принадлежит другому пользователю (например, root), смените владельца:
# Замените /path/to/repo на фактический путь к вашей папке репозитория
sudo chown -R $USER:$USER /path/to/repo
Затем установите корректные права доступа:
# Дать владельцу полные права (чтение, запись, выполнение для папок)
find /path/to/repo -type d -exec chmod 755 {} \;
# Дать владельцу права на чтение и запись для файлов
find /path/to/repo -type f -exec chmod 644 {} \;
# Особые права для исполняемых файлов (если есть)
find /path/to/repo -type f -name "*.sh" -exec chmod +x {} \;
⚠️ Важно: Не используйте
chmod 777— это серьёзная уязвимость безопасности.
Шаг 3: Настройте безопасные директории в Git
Если репозиторий находится в системной или общей директории, добавьте его в список безопасных:
# Добавить конкретный путь в глобальную конфигурацию
git config --global --add safe.directory /path/to/repo
# Или разрешить все директории (не рекомендуется для безопасности)
git config --global --add safe.directory '*'
Проверьте текущий список безопасных директорий:
git config --global --get-all safe.directory
Шаг 4: Используйте правильный протокол доступа (SSH вместо HTTPS)
Если ошибка возникает при работе с удалённым репозиторием (clone, pull, push), возможно, проблема в аутентификации. Переключитесь с HTTPS на SSH:
- Сгенерируйте SSH-ключ (если ещё нет):
ssh-keygen -t ed25519 -C "your_email@example.com" - Добавьте публичный ключ на GitHub/GitLab/Bitbucket:
Скопируйте вывод и вставьте в настройках аккаунта на хостинге.cat ~/.ssh/id_ed25519.pub - Измените URL репозитория на SSH-формат:
git remote set-url origin git@github.com:user/repo.git
Проверьте подключение:
ssh -T git@github.com
Шаг 5: Переклонируйте репозиторий в правильную директорию
Если предыдущие шаги не помогли, переместите репозиторий в домашнюю директорию пользователя (~/), где нет ограничений:
# Создайте папку для проектов (если нет)
mkdir -p ~/projects
# Переместите репозиторий
mv /path/to/repo ~/projects/
# Или удалите и клонируйте заново
rm -rf /path/to/repo
git clone https://github.com/user/repo.git ~/projects/repo
После перемещения перейдите в директорию репозитория и проверьте статус:
cd ~/projects/repo
git status
Проверка результата
Убедитесь, что ошибка устранена, выполнив основные операции:
# 1. Проверка статуса (должна работать без ошибок)
git status
# 2. Получение изменений с удалённого репозитория
git pull
# 3. Если есть незакоммиченные изменения — создайте тестовый коммит
echo "test" >> test.txt
git add test.txt
git commit -m "test commit"
git push
Если все команды выполняются без ошибок permission denied, проблема решена.
Возможные проблемы
Проблема: Ошибка persists после chown
Решение: Убедитесь, что вы указали правильный путь. Проверьте владельца командой:
ls -la /path/to/repo
Первые столбцы покажут владельца и группу. Должен отображаться ваш пользователь.
Проблема: Ошибка при работе с git submodule
Решение: Для подмодулей нужно исправить права в каждой их папке:
git submodule foreach --recursive 'sudo chown -R $USER:$USER .'
Проблема: Ошибка detected dubious ownership после настройки safe.directory
Решение: Убедитесь, что путь в safe.directory точно совпадает с реальным путём репозитория. Используйте абсолютный путь.
Проблема: Нет прав sudo для выполнения chown
Решение: Обратитесь к администратору системы или переместите репозиторий в домашнюю директорию, где chown не требуется.
Проблема: Ошибка возникает только при push/pull
Решение: Проверьте права на .git-папку внутри репозитория:
sudo chown -R $USER:$USER /path/to/repo/.git