[software development] Trae CN的终端没法使用deepin25的默认终端,导致很多bug
Tofloor
poster avatar
scalaz
deepin
3 hours ago
Author

在 Trae IDE 集成终端中无法使用 git pull / git push 的排查与解决(deepin 25)

一、问题现象

在 deepin 25 系统中使用 Trae IDE 时,集成终端(Terminal 面板)里执行 git pullgit push 报错:

$ git pull
error: cannot run ssh: No such file or directory
fatal: unable to fork

但有几个"奇怪"的现象:

  1. git statusgit log 等本地命令完全正常,不报错;
  2. 在 deepin 系统自带的终端里执行 git pull / git push 一切正常;
  3. ~/.ssh/ 目录下确实有 id_ed25519 私钥,SSH 配置没问题;
  4. 系统里已通过 sudo apt install -y git openssh-client 安装了 git 和 ssh。

也就是说:同一个系统、同一个仓库、同一份 SSH key,在 deepin 原生终端里能用,在 Trae 终端里却不能用。

二、环境信息

项目 信息
操作系统 deepin 25(crimson)
桌面环境 DDE
IDE Trae(基于 VSCode 内核的国产 AI IDE)
Git 远程仓库 阿里云 codeup,SSH 协议(git@codeup.aliyun.com:...)
Shell GNU bash 5.2.21
已安装 git、openssh-client

三、原因分析

3.1 表层原因:Trae 终端找不到 ssh

git pull 走 SSH 协议时,git 需要调用系统的 ssh 程序连接远程仓库。报错 cannot run ssh 说明 git 在 PATH 里找不到 ssh 可执行文件。

git status 不报错,是因为它是纯本地操作,不需要 ssh。

3.2 深层原因:Trae 终端运行在沙箱文件系统中

通过对比 deepin 默认终端和 Trae 集成终端,发现两者看到的文件系统是不一样的:

路径 deepin 默认终端 Trae 集成终端(沙箱)
/usr/bin/git 存在 不存在
/usr/bin/ssh 存在 不存在
~/.ssh/id_ed25519 存在 不存在(沙箱的 ~/.ssh/ 是空的)

原来,Trae IDE 的集成终端运行在一个独立的沙箱环境里,这个沙箱有自己独立的 /usr/bin 视图(虽然能看到 1000 多个文件,但里面没有 git 和 ssh),并且 home 目录也是隔离的——沙箱的 ~/.ssh/ 只有一个 known_hosts,没有私钥。

这就解释了所有现象:

  • deepin 默认终端能正常 git pull:用的是真实系统的 git + ssh + 私钥;
  • Trae 终端报错:沙箱里既没有 ssh,也没有私钥;
  • git status 不报错:本地操作不需要 ssh。

3.3 沙箱里实际使用的 git 是什么

在 Trae 终端里执行 which git,发现指向:

/home/用户名/.sdkman/candidates/scala/current/bin/git

这是个符号链接,最终指向 deepin 玲珑(linglong)应用层里的 git:

/run/host/rootfs/persistent/ostree/deploy/deepin/var/lib/linglong/layers/.../files/bin/git

这个 git 能执行本地命令(如 git status),但它调用 ssh 时,因为沙箱里 /usr/bin/ssh 不存在,所以报 cannot run ssh

名词解释:

  • 玲珑(linglong):deepin 的应用沙箱打包格式,类似 Flatpak。
  • ostree:一种类似 git 的文件系统版本管理技术,deepin 25 用它管理 /usr 等系统目录。
  • sdkman:一个管理 SDK 版本的工具,会在 ~/.sdkman 下放一些工具的软链。

3.4 关键发现:沙箱通过 /run/host/rootfs 映射宿主机

继续排查时发现,虽然 Trae 沙箱隔离了 /usr,但通过 /run/host/rootfs/ 路径可以访问到宿主机的真实文件系统:

$ ls /run/host/rootfs/usr/bin/git       # 存在!
$ ls /run/host/rootfs/usr/bin/ssh       # 存在!
$ ls /run/host/rootfs/home/用户名/.ssh/id_ed25519   # 存在!

这就为解决问题提供了入口:可以让 Trae 终端通过这个路径"借用"宿主机的 git 和 ssh。

四、解决方案

核心思路:在 ~/.bashrc 中配置,让 Trae 终端优先使用 /run/host/rootfs/usr/bin/ 下的 git 和 ssh,并指定宿主机的 SSH 私钥路径。

4.1 编辑 ~/.bashrc

~/.bashrc 末尾追加以下内容(请把 你的用户名 替换为实际用户名):

# 优先使用宿主机原生 git/ssh(Trae 沙箱看不到 /usr/bin/git,需走 /run/host/rootfs)
if [ -x /run/host/rootfs/usr/bin/git ] && [ -x /run/host/rootfs/usr/bin/ssh ]; then
    export PATH="/run/host/rootfs/usr/bin:$PATH"
    # 沙箱 ~/.ssh 无私钥,需指定宿主机私钥路径
    if [ -f /run/host/rootfs/home/你的用户名/.ssh/id_edxxxxx ]; then
        export GIT_SSH_COMMAND="/run/host/rootfs/usr/bin/ssh -i /run/host/rootfs/home/你的用户名/.ssh/id_edxxxxx -o IdentitiesOnly=yes"
    fi
fi

4.2 配置逐行说明

  • if [ -x /run/host/rootfs/usr/bin/git ] && [ -x /run/host/rootfs/usr/bin/ssh ]
    → 判断是否在 Trae 沙箱环境(只有沙箱才有 /run/host/rootfs/),deepin 默认终端不会有这个路径,所以条件不成立,不会影响原有环境。

  • export PATH="/run/host/rootfs/usr/bin:$PATH"
    → 把宿主机 /usr/bin 加到 PATH 最前,让 gitssh 命令优先使用宿主机版本。

  • export GIT_SSH_COMMAND="...ssh -i 私钥路径 -o IdentitiesOnly=yes"
    → 指定 git 调用 ssh 时使用的具体命令和私钥路径。

    • -i 私钥路径:明确指定使用哪个私钥文件;
    • -o IdentitiesOnly=yes:只使用上面指定的私钥,不尝试 ssh-agent 里的其他 key,避免认证失败。

4.3 重启 Trae 终端

修改 ~/.bashrc 后,需要重启 Trae 终端让配置生效:

  • 关闭当前终端面板(点终端右上角的垃圾桶图标);
  • 重新打开终端(快捷键 Ctrl+` )。

五、验证方法

新终端打开后,依次执行以下命令验证:

# 1. 确认 git/ssh 指向宿主机版本
which git
# 预期输出:/run/host/rootfs/usr/bin/git

which ssh
# 预期输出:/run/host/rootfs/usr/bin/ssh

# 2. 测试 SSH 连接(可选,以阿里云 codeup 为例)
ssh -T git@codeup.aliyun.com
# 预期:连接成功的提示

# 3. 测试 git pull
git pull
# 预期:正常拉取,如 "Already up to date."

# 4. 测试 git push(如果有待推送的提交)
git push
# 预期:正常推送

如果以上命令都正常,说明问题已解决。

六、相关注意事项

6.1 不影响 deepin 默认终端

上述配置中的 if 条件会判断 /run/host/rootfs/ 是否存在。这个路径只在 Trae 沙箱环境里存在,deepin 默认终端没有这个路径,所以配置不会生效,原有环境完全不受影响。

6.2 私钥路径需按实际修改

文档里的 /run/host/rootfs/home/你的用户名/.ssh/id_ed25519 需要按实际情况替换:

  • 你的用户名 → 你的 deepin 登录用户名(可用 whoami 命令查看);
  • 如果你的私钥是 id_rsa 而非 id_ed25519,相应把文件名改掉。

6.3 前置条件

在应用本方案前,请确保:

  1. 系统已安装 git 和 openssh-client:
    sudo apt install -y git openssh-client
    
  2. 已生成 SSH 密钥对(如果还没有):
    ssh-keygen -t ed25519 -C "你的邮箱"
    
  3. 公钥(~/.ssh/id_ed25519.pub 的内容)已添加到代码托管平台(codeup / github / gitee 等)的 SSH Keys 设置里。

6.4 让 Trae 终端加载 ~/.bashrc

默认情况下,Trae 终端可能不会以"登录 shell"方式启动,导致 ~/.bashrc 里的配置(包括上面的修复)不生效。需要在 Trae 配置文件 ~/.config/Trae CN/User/settings.json 中添加:

"terminal.integrated.profiles.linux": {
    "bash": {
        "path": "bash",
        "args": ["-l"]
    }
},
"terminal.integrated.defaultProfile.linux": "bash"

-l 参数让 bash 以登录 shell 启动,从而走 /etc/profile~/.profile~/.bashrc 的完整加载链路。

6.5 附带问题:dircolors 报错

配置登录 shell 后,Trae 终端启动时可能还会报:

dircolors: no SHELL environment variable, and no shell type option given

这是 ~/.bashrceval $(dircolors) 缺少 -b 参数导致。修复方法:编辑 ~/.bashrc,把:

eval $(dircolors)

改成:

eval $(dircolors -b)

-b 表示显式指定生成 Bourne shell 语法的命令,不再依赖 $SHELL 变量推断。

七、总结

deepin 25 采用 ostree + 玲珑(linglong)架构,文件系统组织方式和传统 Debian 有所不同。Trae IDE 的沙箱机制又在此基础上做了一层隔离,导致集成终端看不到真实系统的 /usr/bin

本方案的关键在于发现 /run/host/rootfs/ 这个沙箱与宿主机之间的"映射通道"。通过让 Trae 终端优先使用该路径下的宿主机 git 和 ssh,并指定宿主机私钥,既解决了问题,又保证了 deepin 原生终端环境不受影响。

希望这篇排查记录能帮到遇到类似问题的 deepin 用户。如果在其他沙箱类 IDE(如某些版本的 Cursor、Windsurf)上遇到类似问题,也可以参考同样的思路排查。

Reply Favorite View the author
All Replies
avatar
DebuggerX
deepin
an hour ago
#1

like

Reply View the author