Как я могу проверить доступ на запись в удаленный Git-репозиторий ("Могу ли я нажать?")

Я создаю (несколько ограниченный) клиент Git. Чтобы настроить хранилище, введите URL-адрес для удаленного хранилища. Я хочу проверить, есть ли у пользователя права на чтение и запись в этом хранилище. Если нет, я представляю диалог аутентификации.

Я проверяю доступ для чтения с git ls-remote <url>,

Есть ли аналогичный способ проверки доступа на запись без предварительного клонирования репо? (Я знаю, что мог git clone <url> а потом git push --dry-run)

8 ответов

Если репозиторий git находится в github, откройте любой файл в репозитории, затем нажмите "изменить", github покажет что-то вроде этого:

Вы редактируете файл в проекте, к которому у вас нет прав записи. Мы создали форк этого проекта, чтобы вы могли зафиксировать предложенные изменения. Отправка изменения в этот файл запишет его в новую ветку вашего форка, поэтому вы можете отправить запрос на извлечение кода.

С помощью последней версии GitHub API вы можете проверить разрешения на конкретное репо для ИМЯ ПОЛЬЗОВАТЕЛЯ (вашего или другого пользователя) с помощью следующей команды (вам нужно будет пройти аутентификацию с использованием вашего личного токена доступа ), например:

      curl -u your_username:your_access_token \
 -H "Accept: application/vnd.github.v3+json" \
 https://api.github.com/repos/octocat/hello-world/collaborators/USERNAME/permission

Ответ покажет, какие разрешения имеет USERNAME для этого репо. В противном случае он сообщит:

"Сообщение не найдено"

Обратите внимание, что у вас должен быть push-доступ к рассматриваемому репо, иначе он не удастся

      {
  "message": "Must have push access to view collaborator permission.",
  "documentation_url": "https://docs.github.com/rest/reference/repos#get-repository-permissions-for-a-user"
}

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

При правильной настройке учетных данных:

      $ git push
Everything up-to-date

после испорченной конфигурации ssh:

      $ git push
ERROR: Permission to [some repo] denied to [my user name].
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

Вы можете выполнить git push git+ssh://host.org/path/to/repo some_ref без клонирования. Но смотри мой комментарий выше

Отправьте безобидную ветку на сервер:

      git clone (...)
git branch -a
# Make sure no branch named "test" exists. If it does, use another name.

git branch test
git push -u origin test
# If the above push worked, you have write access

# Cleaning up
git branch -d test
git push -d origin test # only run this if you do have write access

Перейдите к ветке, которую вы хотите отредактировать, и наведите указатель мыши на кнопку редактирования, и она может сказать «Разветвить этот репозиторий и отредактировать этот файл», если у вас нет доступа к репозиторию. Но предположим, что у вас есть некоторый доступ к репозиторию, тогда всплывающее сообщение покажет «Редактировать этот файл», но у вас может не быть доступа для фиксации ветки. Чтобы проверить доступ к определенной ветке, вы можете нажать на кнопку редактирования и в форме отправки изменений вы увидите «Зафиксировать изменения», если у вас есть доступ. Или, если у вас нет доступа, вы увидите «Предложить изменения», поскольку это создаст новую ветку.

      GIT_TERMINAL_PROMPT=0 git push --dry-run &>/dev/null
  • GIT_TERMINAL_PROMPT=0: ошибка, если вам необходимо ввести учетные данные вручную.

  • git push: попробуйте отправить изменения в источник.

  • --dry-run: моделировать операцию, но не выполнять ее.

  • &>/dev/null: отключить любой вывод.

Вы можете использоватьgh(GitHub CLI)apiподкоманда, чтобы проверить ваш доступ к репозиторию (вам нужно использоватьgh auth loginсначала войти в свою учетную запись GitHub).

Команда

gh api /repos{/owner}{/repo}/collaborators/USERNAME/permission

Это даст вам много информации.

Если вы хотите, чтобы команда выводила простоreadилиwrite, запустите это:

gh api /repos{/owner}{/repo}/collaborators/USERNAME/permission | jq '.permission' -r

Другие вопросы по тегам