You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从git.push()获取Gerrit链接?解决推送后无链接输出问题

解决Gerrit推送后无法获取URL的问题

嘿,这个场景我太熟悉了!你遇到的问题其实是sh模块默认的输出捕获逻辑导致的——Gerrit推送成功后的链接信息通常会被Git输出到stderr,而sh模块调用git.push()时默认只返回stdout的内容,所以你看不到那串URL。

下面给你两种靠谱的解决办法:

方法1:捕获合并的stdout和stderr

修改你的git.push调用,让sh把stderr的内容合并到stdout里,这样就能拿到完整的推送输出,进而提取Gerrit URL:

import sh
from sh import git

# 你的现有代码...
git.add("file1.txt")
gitdir = git('rev-parse', '--git-dir')
sh.scp("-p","-P", port, user+"@"+ghost+":hooks/commit-msg", str(gitdir.rstrip())+"/hooks/")
git.commit(m='my commit message')

# 关键修改:合并stderr到stdout,捕获完整输出
push_output = git.push('origin', 'HEAD:refs/for/master', _err_to_out=True)
print("推送输出:")
print(push_output)

# 从输出里提取Gerrit URL
gerrit_url = None
for line in push_output.splitlines():
    line = line.strip()
    # Gerrit的URL通常包含远程地址和变更编号,比如http://gerrit.example.com/12345
    if line.startswith("remote:") and "http" in line:
        # 去掉开头的"remote: "前缀
        gerrit_url = line.replace("remote: ", "")
        break

if gerrit_url:
    print(f"\nGerrit变更链接:{gerrit_url}")
else:
    print("\n未找到Gerrit URL,请检查输出格式")

方法2:手动构造Gerrit URL(备选方案)

如果你不想依赖推送输出,也可以通过Gerrit的规则手动拼接URL。需要提前知道Gerrit服务器地址和你的项目名称:

# 获取当前提交的哈希值
commit_hash = git.rev_parse('HEAD').strip()
# 构造Gerrit变更URL(格式根据你的Gerrit实例调整,通常是这种)
gerrit_url = f"https://{ghost}/c/{your_repo_name}/+/{commit_hash}"
print(f"Gerrit变更链接:{gerrit_url}")

不过这种方法的缺点是,Gerrit的变更编号(比如12345)和提交哈希是不同的,手动构造的URL是直接跳转到提交页面,而推送输出里的URL是跳转到变更审核页面,后者更实用。所以优先推荐方法1。

为什么之前的print(git.push(...))没输出?因为sh模块的命令调用,当命令成功执行时,默认只返回stdout,但Gerrit的推送提示信息是Git的remote输出,会被发送到stderr,所以你看不到。加上_err_to_out=True就能把两者合并,拿到完整内容啦!

内容的提问来源于stack exchange,提问作者rodee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:53:00