git-bug bridge auth show 命令详解:查看桥接凭据的完整指南
2026/9/15 22:51:41 网站建设 项目流程

git-bug bridge auth show 命令详解:查看桥接凭据的完整指南

【免费下载链接】git-bugDistributed, offline-first bug tracker embedded in git项目地址: https://gitcode.com/GitHub_Trending/gi/git-bug

git-bug bridge auth show是 git-bug 分布式 bug 追踪器(内嵌于 Git)中用于显示单条桥接认证凭据(credential)详情的命令。当你在 Git 仓库中通过git-bug bridge auth add-token存储了 GitHub、GitLab、Jira 等外部 bug 追踪器的访问令牌后,可以使用本命令按 ID(或 ID 前缀)精确查看某条凭据的目标平台、类型、创建时间、令牌值与附加元数据,是排查桥接推送/拉取认证问题时的核心诊断工具。读完本文,你将掌握该命令的完整用法、输出字段含义及其底层的凭据存储与加载机制。

命令概览

git-bug bridge auth show属于git-bug bridge auth命令族,该命令族用于管理所有已知的桥接认证凭据。官方命令文档(doc/md/git-bug_bridge_auth_show.md)给出的基本用法如下:

git-bug bridge auth show [flags]

选项

-h, --help help for show

该命令仅有一个-h/--help帮助选项,本身不提供额外参数标志,但它要求恰好一个位置参数(即要查看的凭据 ID 或 ID 前缀)。

命令层级与上下文

showauth子命令树中的一员。从 commands/bridge/bridge_auth.go 的源码可见,git-bug bridge auth一共挂载了三个子命令:

cmd.AddCommand(newBridgeAuthAddTokenCommand(env)) cmd.AddCommand(newBridgeAuthRm(env)) cmd.AddCommand(newBridgeAuthShow(env))

对应关系:

子命令用途
git-bug bridge auth列出所有已知的桥接认证凭据
git-bug bridge auth add-token [TOKEN]存储一个新的令牌
git-bug bridge auth show显示单条认证凭据详情
git-bug bridge auth rm删除一条凭据

从 commands/bridge/bridge_auth_show.go 的定义可以看到,show命令有以下关键行为:

  • PreRunE: execenv.LoadBackend(env):执行前加载 git-bug 后端(仓库缓存环境);
  • RunE: execenv.CloseBackend(...):执行完成后自动关闭后端,保证资源释放;
  • Args: cobra.ExactArgs(1):严格要求传入恰好一个位置参数——凭据 ID 或其前缀;
  • ValidArgsFunction: completion.BridgeAuth(env):为show提供 shell 补全,按下 Tab 即可列出当前仓库中已存储的凭据 ID。

凭据 ID 参数:支持前缀匹配

show的位置参数接受凭据 ID 或 ID 前缀。其底层调用是 bridge/core/auth/credential.go 中的LoadWithPrefix

func LoadWithPrefix(repo repository.RepoKeyring, prefix string) (Credential, error) { keys, err := repo.Keyring().Keys() ... for _, key := range keys { if !strings.HasPrefix(key, keyringKeyPrefix+prefix) { continue } ... } if len(matching) > 1 { return nil, NewErrMultipleMatchCredential(ids) } if len(matching) == 0 { return nil, ErrCredentialNotExist } return matching[0], nil }

前缀匹配遵循如下规则:

  • 无匹配:返回ErrCredentialNotExist("credential doesn't exist"),提示该凭据不存在;
  • 多个匹配:返回ErrMultipleMatch错误,并列出所有匹配的凭据 ID,提示参数需要更精确;
  • 恰好一个匹配:返回该凭据。

因此在实际使用中,可以省略凭据 ID 的尾部(只要不引起歧义)。例如某个凭据 ID 为a1b2c3d4...,可以直接执行git-bug bridge auth show a1b2

配合 shell 补全(见 commands/completion/helper_completion.go),show会在输入时通过auth.List(env.Backend)动态列出所有凭据 ID 作为候选值,无需手动记忆冗长的完整 ID。

输出字段解析

runBridgeAuthShow(commands/bridge/bridge_auth_show.go)的执行逻辑如下:

cred, err := auth.LoadWithPrefix(env.Repo, args[0]) ... env.Out.Printf("Id: %s\n", cred.ID()) env.Out.Printf("Target: %s\n", cred.Target()) env.Out.Printf("Kind: %s\n", cred.Kind()) env.Out.Printf("Creation: %s\n", cred.CreateTime().Format(time.RFC822)) switch cred := cred.(type) { case *auth.Token: env.Out.Printf("Value: %s\n", cred.Value) } env.Out.Println("Metadata:") meta := make([]string, 0, len(cred.Metadata())) for key, value := range cred.Metadata() { meta = append(meta, fmt.Sprintf(" %s --> %s\n", key, value)) } sort.Strings(meta) env.Out.Print(strings.Join(meta, ""))

典型的输出形如:

Id: 2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae Target: github Kind: token Creation: 15 Sep 26 02:29 +0000 Value: ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Metadata: login --> octocat

各字段含义如下:

字段说明
Id凭据的唯一标识符,SHA-256 十六进制摘要(详见下文"凭据 ID 的计算方式")
Target桥接目标平台,即githubgitlabjira等(参见bridge.Targets()
Kind凭据类型:tokenloginlogin-password(详见下文"凭据类型")
Creation凭据创建时间,格式为 RFC 822(如15 Sep 26 02:29 +0000
Value令牌值,仅当凭据类型为token时显示
Metadata附加的键值对元数据,按键名排序输出,每行以 4 空格缩进

凭据 ID 的计算方式

凭据 ID 并非随机生成的序列号,而是对关键字段的 SHA-256 摘要。以最常见的令牌凭据为例,bridge/core/auth/token.go 中:

func (t *Token) ID() entity.Id { h := sha256.New() _, _ = h.Write(t.salt) _, _ = h.Write([]byte(t.target)) _, _ = h.Write([]byte(t.Value)) return entity.Id(fmt.Sprintf("%x", h.Sum(nil))) }

ID = SHA-256(salt || target || value)。其中salt是创建凭据时通过crypto/rand生成的 16 字节随机盐(见 bridge/core/auth/credential_base.go)。这意味着:

  • 即使两个用户使用完全相同的令牌值,其凭据 ID 也因盐不同而不同;
  • ID 具有确定性:同一凭据在任意机器上加载时计算出的 ID 一致,可用于跨环境核验;
  • 使用盐参与哈希可以避免通过 ID 反推令牌内容。

凭据类型(Kind)与存储格式

show输出的Kind字段取值来自 bridge/core/auth/credential.go:

const ( KindToken CredentialKind = "token" KindLogin CredentialKind = "login" KindLoginPassword CredentialKind = "login-password" )
  • token:API 访问令牌(如 GitHub Personal Access Token),是add-token命令存储的类型;
  • login:仅包含登录名(用户名)的凭据;
  • login-password:同时包含登录名与密码的凭据,多用于不支持 OAuth 令牌的老式 API。

show命令的源码通过类型断言只对*auth.Token输出Value字段:

switch cred := cred.(type) { case *auth.Token: env.Out.Printf("Value: %s\n", cred.Value) }

因此当Kindloginlogin-password时,输出中不会出现Value行,仅显示Id / Target / Kind / Creation / Metadata

底层存储:加密文件 keyring

凭据并非存放在 git 仓库内,而是存储在操作系统用户配置目录下的 keyring 中。从 repository/keyring.go 可见,git-bug 默认使用99designs/keyring文件后端(FileBackend)

  • 存储目录:~/.config/git-bug/keyring/(通过os.UserConfigDir()解析);
  • 服务名:git-bug
  • 文件使用固定口令"git-bug"加密,目的是防止通用文件扫描器直接读取敏感内容(文件本身的权限保护依赖操作系统的用户目录权限机制)。

凭据的序列化格式为 JSON map,键名规则见 bridge/core/auth/credential.go:

auth-<id> → keyring 中的条目 Key kind → 凭据类型 target → 目标平台 createtime → Unix 时间戳 salt → base64 编码的 16 字节盐 meta.<key> → 元数据项(前缀 "meta.") value → 令牌值(仅 token 类型)

存储逻辑在Store(bridge/core/auth/credential.go):若盐长度不为 16 字节会直接 panic,随后将通用字段(kind、target、createtime、salt)与类型特有字段(如 token 的 value)以及所有meta.前缀元数据合并为 JSON,写入 keyring。

元数据字段:login 与 base-url

show输出的Metadata区域包含凭据的附加信息。git-bug 预定义了两个元数据键(bridge/core/auth/credential.go):

MetaKeyLogin = "login" MetaKeyBaseURL = "base-url"
  • login:远程 bug 追踪器上的登录名。使用add-token存储令牌时通过--login指定(见 commands/bridge/bridge_auth_addtoken.go):
    token.SetMetadata(auth.MetaKeyLogin, opts.login)

    该登录名还会同步写入 git-bug 用户身份的元数据中,作为桥接时匹配身份与凭据的依据(bridge.LoginMetaKey,见 bridge/bridges.go)。

  • base-url:部分桥接(如 GitLab 自托管实例)需要的服务地址。

此外,各桥接实现可以在注册时(见 bridge/core/bridge.go)通过impl.LoginMetaKey()注入自己的元数据键。

典型使用流程

结合add-tokenshowauthrm的完整凭据生命周期如下:

  1. 存储令牌(目标为 github,登录名 octocat):

    git-bug bridge auth add-token --target github --login octocat

    若不加位置参数[TOKEN],命令会从 stdin 读取令牌值(在交互式终端中会先提示Enter the token:)。

  2. 列出全部凭据(获取 ID):

    git-bug bridge auth

    输出每行包含 ID(青色)、目标平台(黄色,左填充对齐到 10 字符)、类型(品红)、令牌值与排序后的元数据。

  3. 查看单条凭据详情

    git-bug bridge auth show <ID 或 ID 前缀>

    例如git-bug bridge auth show 2c26。若前缀有歧义会报 multiple match 错误并列出候选 ID。

  4. 删除凭据

    git-bug bridge auth rm <ID 或 ID 前缀>

    底层同样调用LoadWithPrefix定位凭据后经auth.Remove删除(见 commands/bridge/bridge_auth_rm.go)。

常见错误与排查

  • credential doesn't exist:传入的 ID 或前缀没有匹配任何已存储凭据。可先执行git-bug bridge auth确认当前 keyring 中实际存在的凭据 ID。
  • multiple credentials matching ...:前缀过短,命中了多条凭据。将参数补充到足以唯一区分的长度即可。
  • unknown target:通常出现在add-token阶段,--target的取值必须属于bridge.Targets()返回的已注册桥接目标(githubgitlabjiralaunchpad等),show阶段不会触发此错误。
  • missing value:令牌值为空时Token.Validate()会拒绝存储(见 bridge/core/auth/token.go),show阶段不会触发此错误。

需要说明的是,show仅从本地 keyring 读取并展示凭据,不会向远程 bug 追踪器发起任何网络请求,也不会校验令牌是否仍然有效。若怀疑令牌已失效,应结合git-bug bridge pull/git-bug bridge push的实际报错,或直接查看目标平台的令牌状态页面确认。

小结

git-bug bridge auth show是桥接认证凭据管理中最基础的"只读"命令:它以单一 ID 为入口,输出凭据的类型、目标、创建时间、令牌值与元数据,并通过前缀匹配与 shell 补全降低使用门槛。理解其背后的 keyring 文件存储、LoadWithPrefix前缀解析逻辑与凭据 ID 的 SHA-256 计算方式,有助于在跨机器同步 git-bug 配置、排查桥接认证失败时快速定位问题。相关完整实现可继续阅读 commands/bridge/bridge_auth_show.go、bridge/core/auth/credential.go 与 repository/keyring.go。

【免费下载链接】git-bugDistributed, offline-first bug tracker embedded in git项目地址: https://gitcode.com/GitHub_Trending/gi/git-bug

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询