如何通过给定Git仓库URL确定对应的远程仓库名称?
按指定URL查找对应Git远程仓库名的实现方法
完全可行,优先使用Git原生命令实现即可,不建议自己手写字符串解析逻辑匹配git remote -v的输出——Git原生逻辑会自动处理等价URL匹配(比如同仓库省略.git后缀、配置了URL重写规则的场景),能避免很多硬匹配带来的误判、漏判问题。
兼容所有Git版本的通用方案
通过遍历本地所有已配置的远程仓库,逐个拉取其绑定的URL和目标URL做比对,输出匹配的远程名称即可:
# 将变量值替换为你需要查询的目标URL TARGET_URL="git@github.com:foo/bar.git" git remote | while read -r remote; do if [ "$(git remote get-url "$remote")" = "$TARGET_URL" ]; then echo "$remote" fi done
针对你给出的本地Git配置,执行上述命令传入git@github.com:foo/bar.git时,会正确输出匹配的远程名upstream。
如果需要同时匹配push地址、或者兼容同仓库不同URL写法(比如同一个仓库同时配置了SSH、HTTPS两种地址)的场景,可以调整命令拉取远程绑定的所有地址做匹配:
TARGET_URL="git@github.com:foo/bar.git" git remote | while read -r remote; do git remote get-url --all "$remote" | grep -qxF "$TARGET_URL" && echo "$remote" done
Git 2.41+ 版本的简洁方案
Git 2.41及以上版本原生支持URL反查远程名的能力,不需要自己写循环,一行命令即可得到结果:
git remote get-url --match "git@github.com:foo/bar.git"
这个命令会自动处理URL等价规则、重写规则,匹配结果更准确。
避坑提示
不要直接解析git remote -v的输出来做匹配:不同Git版本、不同系统环境下该命令的输出格式可能存在差异,输出中附带的(fetch)/(push)标记、地址前后的排版空格都可能导致自定义的匹配逻辑失效,稳定性远不如直接调用Git原生的URL查询接口。
内容的提问来源于stack exchange,提问作者Dentrax
相关产品推荐
相关产品推荐

