【问题标题】:How can I check write access to a remote Git repository ("can I push?")如何检查对远程 Git 存储库的写入权限(“我可以推送吗?”)
【发布时间】:2014-05-13 17:05:37
【问题描述】:

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

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

是否有类似的方法来检查“写入”访问权限,而无需先克隆存储库? (我知道我可以git clone <url> 然后git push --dry-run

【问题讨论】:

  • 好吧,从技术上讲,将提交推送到存储库中,您不需要先克隆它。但是请记住,推送提交链和更新远程引用是两个不同的操作,您可能对前者有权限,但对后者没有权限。此外,某些引用可能是不可修改的。
  • 'git push --dry-run' 在这篇文章中被提及作为一种检查写访问的方法,当你克隆时。但是对于我的一些遥控器,这会打开一个密码提示并无限期挂起。似乎没有一种非交互式的方式来检查您是否具有写访问权限,即使您确实有 repo 的克隆。如果我确实有它的克隆,我如何检查对 git 存储库的写访问权限?
  • 一个非常简单的检查方法是您是否在 repo 的主代码页面上的 README.MD 的右上角看到一个编辑“铅笔”图标(如果有很长,请向下滚动到它顶级文件/文件夹列表)。显然,当您登录到 Github 时执行此操作。

标签: git github git-remote ls-remote


【解决方案1】:

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

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

【讨论】:

  • 此方法可以在带有 ref 的工作目录中工作。有没有办法在不设置虚拟仓库并首先创建提交的情况下做到这一点?
  • 是的,谁想要所有这些随机的虚拟提交?没有更干净的方法吗?
  • 我自己没有尝试过,但也许--dry-run 参数可以用于测试推送访问而不推送真正的提交? git-scm.com/docs/git-push#Documentation/git-push.txt---dry-run
  • --dry-run 不能用于此目的。检查此答案以获得解释:stackoverflow.com/questions/25403573/…
【解决方案2】:

使用最新的 GitHub API,您可以使用以下命令(您需要 authenticate using your personal access token)检查 permissions on a particular repo 的 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 对该 repo 拥有的权限。否则会报告:

“消息”:“未找到”

请注意,您应该拥有对相关存储库的推送访问权限,否则它将失败

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

【讨论】:

    【解决方案3】:

    如果 git repo 在 github,打开 repo 中的任何文件,然后单击“编辑”, github 会显示如下内容:

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

    【讨论】:

    • 你没有错——Github 确实显示了这种行为。但是,OP 要求他们的新工具可以使用类似于 git ls-remote 的东西,因此 Github 网络用户界面可能不适合他们。
    • 有更多的 git 存储库,而不仅仅是 github 存储库;)
    • 关于图形用户界面,工具提示还可以指示如果无法访问,您是否可以“编辑”或“分叉然后编辑”。这对于 Github proper 和 GH Enterprise 都是如此。
    • 分叉一个 repo 会复制整个 repo,对吗?回购可能非常大。这似乎是一项非常繁重的操作,只是为了检查您的访问级别......
    • @KyleDelaney 您无需单击编辑按钮,只需将鼠标悬停在其上即可。它将显示“编辑此文件”或“编辑此项目的 fork 中的文件”,具体取决于您是否具有写入权限。
    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2012-08-11
    • 2010-12-05
    相关资源
    最近更新 更多