如何检查对远程 Git 存储库的写访问(“我可以推吗?”)

我正在构建一个(有些受限的) Git 客户机。要设置存储库,需要输入远程回购的 URL。我想检查用户是否具有对该存储库的读写访问权限。如果没有,我将显示一个身份验证对话框。

我用 git ls-remote <url>检查 读取权限

是否有一种类似的方法来检查 'write' access,而不首先克隆回购?(我知道我可以 git clone <url>然后 git push --dry-run)

195937 次浏览

您可以在不进行克隆的情况下执行 git push git+ssh://host.org/path/to/repo some_ref

但是请记住,推送一个提交链和更新远程引用是两种不同的操作,您可能对前者有权限,但对后者没有权限。而且某些引用可能是不可修改的。

If the git repo is in github, open any file in the repo, then click 'edit', Github 会显示如下内容:

您正在编辑一个无权写入的项目中的文件。我们已经为您创建了这个项目的分支,以提交您提议的更改 对此文件提交更改将把它写入 你的叉子,所以你可以发送一个拉请求。在这里输入代码

使用最新的 GitHub API,您可以使用以下命令(您需要使用 使用您的个人访问令牌进行身份验证)检查 特定回购协议的权限中的 USERNAME (您的用户或其他用户) ,例如:

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 对该回购的权限。否则它将报告:

“信息”: “未找到”

Note that you should have push access to the repo in question or it will fail with

{
"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 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