如何让 GitHub CLI 在非 colocated 的 Jujutsu 仓库中正常工作?
2026/9/12 3:06:59 网站建设 项目流程

如何让 GitHub CLI 在非 colocated 的 Jujutsu 仓库中正常工作?

【免费下载链接】jjA Git-compatible VCS that is both simple and powerful项目地址: https://gitcode.com/GitHub_Trending/jj/jj

在使用 Jujutsu(jj)管理仓库并对接 GitHub 时,一个常见的具体问题是:GitHub CLI(gh)无法在非 colocated 的 Jujutsu 仓库中找到正确的 Git 仓库路径(对应上游 issue #1008)。原因在于非 colocated 工作区里,Git 仓库被隐藏存放在.jj目录的一个子目录中,而不是工作区根目录下的.gitgh按常规方式探测时找不到它。

解决方法很简单:把GIT_DIR环境变量指向 jj 给出的 Git 目录路径。本文给出两种做法——单次命令内联设置(临时、立即可用)和用 direnv 写入.envrc(进入目录后自动生效),最后给出验证方式和一条可选的替代路径。

先确认你的仓库是否属于受影响的情况

只有非 colocated的工作区会出现这个问题。colocated(混合工作区)是jj git initjj git clone的默认形态:Git 仓库与 Jujutsu 工作区共享同一份工作目录,根目录下同时存在.jj.git,Git 工具能直接发现仓库。

非 colocated 工作区通过以下方式创建:

  • jj git initjj git clone上附加--no-colocate标志;
  • 或设置配置git.colocate = false

在这种模式下,仓库数据仍以 Git 格式存储,但 Git 仓库被隐藏到.jj目录下的子目录中,根目录没有.git,这就是gh出问题的根源。

用下面的命令查看当前工作区的 colocation 状态,判断自己是否命中该场景(参见 git-compatibility.md):

jj git colocation status

最小修复:为单次命令设置 GIT_DIR

jj git root会打印使用 Git 后端的仓库的底层 Git 目录位置。在仓库内执行gh命令时,把它作为GIT_DIR的值内联传给该条命令即可:

$ GIT_DIR=$(jj git root) gh issue list

这条命令只影响当次gh的执行,不修改 shell 环境、不写任何文件,适合先验证方案是否对你的仓库有效。命令能正常列出 issue(即不再因找不到 Git 仓库而报错),就说明路径指对了。

自动配置:用 direnv 和 .envrc 让 gh 一直可用

如果希望不用每次都手动加前缀,可以在仓库根目录安装 direnv 并添加.envrc钩子文件,让 direnv 在进入目录时自动导出GIT_DIR

  1. 安装 direnv(安装方式以 direnv 官方说明为准,本文不展开);
  2. 仓库根目录创建(或编辑).envrc文件,加入这一行:
export GIT_DIR=$(jj git root)
  1. 运行以下命令批准 direnv 执行该文件:
direnv allow

之后进入该仓库目录时 direnv 会自动加载.envrc,即使工作区不是 colocated 的,GitHub CLI 也能自动工作,可以直接像平常一样执行gh issue list等命令。注意.envrc的生效依赖 direnv 已按你 shell 的说明完成初始化,这是 direnv 自身的配置要求,与 jj 无关。

验证

按下面的顺序确认修复是否到位:

  1. jj git root应打印出一个实际存在的 Git 目录路径。如果它输出异常,说明仓库不是 Git 后端工作区,本文方案不适用;
  2. 临时方式:执行GIT_DIR=$(jj git root) gh issue list,能正常返回 issue 列表即成功;
  3. 自动方式:新开一个终端进入仓库目录,直接执行gh issue list,无需前缀也能正常工作,说明 direnv 钩子已生效;
  4. 若想同时确认仓库形态,jj git colocation status应显示为非 colocated(这与上面的修复互为印证)。

可选替代路径:把工作区改回 colocated

如果你之所以用非 colocated 模式是出于文档列出的那些顾虑(例如jjgit命令交错导致的分支冲突、ref 数量很大时每条jj命令的自动 import 变慢等,完整列表见 git-compatibility.md 的 "Colocated Jujutsu/Git workspaces" 一节),并且可以接受 colocated 的权衡,也可以直接让工作区回到 colocated 形态:

jj git colocation enable

colocated 模式下根目录有.git,GitHub CLI 通常不需要额外设置。需要时可再次用jj git colocation disable转回非 colocated。这条路径改变的是仓库的工作区形态,而GIT_DIR方案不改仓库、只影响 Git 工具如何定位仓库,按你的实际诉求二选一即可。

小结

  • 非 colocated 的 Jujutsu 仓库里gh找不到 Git 仓库,是路径探测问题,不是仓库数据问题;
  • 最短可行路径是GIT_DIR=$(jj git root) gh <command>
  • 需要长期可用就用.envrc+direnv allow自动导出GIT_DIR
  • 不想再处理环境变量时,可用jj git colocation enable转为 colocated 工作区,接受其文档列出的相应限制。

【免费下载链接】jjA Git-compatible VCS that is both simple and powerful项目地址: https://gitcode.com/GitHub_Trending/jj/jj

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

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

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

立即咨询