在 deepin 25 系统中使用 Trae IDE 时,集成终端(Terminal 面板)里执行 git pull 或 git push 报错:
git pull
git push
$ git pull error: cannot run ssh: No such file or directory fatal: unable to fork
但有几个"奇怪"的现象:
git status
git log
~/.ssh/
id_ed25519
sudo apt install -y git openssh-client
也就是说:同一个系统、同一个仓库、同一份 SSH key,在 deepin 原生终端里能用,在 Trae 终端里却不能用。
git@codeup.aliyun.com:...
git pull 走 SSH 协议时,git 需要调用系统的 ssh 程序连接远程仓库。报错 cannot run ssh 说明 git 在 PATH 里找不到 ssh 可执行文件。
ssh
cannot run ssh
而 git status 不报错,是因为它是纯本地操作,不需要 ssh。
通过对比 deepin 默认终端和 Trae 集成终端,发现两者看到的文件系统是不一样的:
/usr/bin/git
/usr/bin/ssh
~/.ssh/id_ed25519
原来,Trae IDE 的集成终端运行在一个独立的沙箱环境里,这个沙箱有自己独立的 /usr/bin 视图(虽然能看到 1000 多个文件,但里面没有 git 和 ssh),并且 home 目录也是隔离的——沙箱的 ~/.ssh/ 只有一个 known_hosts,没有私钥。
/usr/bin
known_hosts
这就解释了所有现象:
在 Trae 终端里执行 which git,发现指向:
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 下放一些工具的软链。
名词解释:
/usr
~/.sdkman
继续排查时发现,虽然 Trae 沙箱隔离了 /usr,但通过 /run/host/rootfs/ 路径可以访问到宿主机的真实文件系统:
/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 私钥路径。
~/.bashrc
/run/host/rootfs/usr/bin/
在 ~/.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
if [ -x /run/host/rootfs/usr/bin/git ] && [ -x /run/host/rootfs/usr/bin/ssh ] → 判断是否在 Trae 沙箱环境(只有沙箱才有 /run/host/rootfs/),deepin 默认终端不会有这个路径,所以条件不成立,不会影响原有环境。
if [ -x /run/host/rootfs/usr/bin/git ] && [ -x /run/host/rootfs/usr/bin/ssh ]
export PATH="/run/host/rootfs/usr/bin:$PATH" → 把宿主机 /usr/bin 加到 PATH 最前,让 git 和 ssh 命令优先使用宿主机版本。
export PATH="/run/host/rootfs/usr/bin:$PATH"
git
export GIT_SSH_COMMAND="...ssh -i 私钥路径 -o IdentitiesOnly=yes" → 指定 git 调用 ssh 时使用的具体命令和私钥路径。
export GIT_SSH_COMMAND="...ssh -i 私钥路径 -o IdentitiesOnly=yes"
-i 私钥路径
-o IdentitiesOnly=yes
修改 ~/.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 # 预期:正常推送
如果以上命令都正常,说明问题已解决。
上述配置中的 if 条件会判断 /run/host/rootfs/ 是否存在。这个路径只在 Trae 沙箱环境里存在,deepin 默认终端没有这个路径,所以配置不会生效,原有环境完全不受影响。
if
文档里的 /run/host/rootfs/home/你的用户名/.ssh/id_ed25519 需要按实际情况替换:
/run/host/rootfs/home/你的用户名/.ssh/id_ed25519
whoami
id_rsa
在应用本方案前,请确保:
ssh-keygen -t ed25519 -C "你的邮箱"
~/.ssh/id_ed25519.pub
默认情况下,Trae 终端可能不会以"登录 shell"方式启动,导致 ~/.bashrc 里的配置(包括上面的修复)不生效。需要在 Trae 配置文件 ~/.config/Trae CN/User/settings.json 中添加:
~/.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 的完整加载链路。
-l
/etc/profile
~/.profile
配置登录 shell 后,Trae 终端启动时可能还会报:
dircolors: no SHELL environment variable, and no shell type option given
这是 ~/.bashrc 里 eval $(dircolors) 缺少 -b 参数导致。修复方法:编辑 ~/.bashrc,把:
eval $(dircolors)
-b
改成:
eval $(dircolors -b)
-b 表示显式指定生成 Bourne shell 语法的命令,不再依赖 $SHELL 变量推断。
$SHELL
deepin 25 采用 ostree + 玲珑(linglong)架构,文件系统组织方式和传统 Debian 有所不同。Trae IDE 的沙箱机制又在此基础上做了一层隔离,导致集成终端看不到真实系统的 /usr/bin。
本方案的关键在于发现 /run/host/rootfs/ 这个沙箱与宿主机之间的"映射通道"。通过让 Trae 终端优先使用该路径下的宿主机 git 和 ssh,并指定宿主机私钥,既解决了问题,又保证了 deepin 原生终端环境不受影响。
希望这篇排查记录能帮到遇到类似问题的 deepin 用户。如果在其他沙箱类 IDE(如某些版本的 Cursor、Windsurf)上遇到类似问题,也可以参考同样的思路排查。
Featured Collection
Popular Ranking
Popular Events
在 Trae IDE 集成终端中无法使用 git pull / git push 的排查与解决(deepin 25)
一、问题现象
在 deepin 25 系统中使用 Trae IDE 时,集成终端(Terminal 面板)里执行
git pull或git push报错:但有几个"奇怪"的现象:
git status、git log等本地命令完全正常,不报错;git pull/git push一切正常;~/.ssh/目录下确实有id_ed25519私钥,SSH 配置没问题;sudo apt install -y git openssh-client安装了 git 和 ssh。也就是说:同一个系统、同一个仓库、同一份 SSH key,在 deepin 原生终端里能用,在 Trae 终端里却不能用。
二、环境信息
git@codeup.aliyun.com:...)三、原因分析
3.1 表层原因:Trae 终端找不到 ssh
git pull走 SSH 协议时,git 需要调用系统的ssh程序连接远程仓库。报错cannot run ssh说明 git 在 PATH 里找不到ssh可执行文件。而
git status不报错,是因为它是纯本地操作,不需要 ssh。3.2 深层原因:Trae 终端运行在沙箱文件系统中
通过对比 deepin 默认终端和 Trae 集成终端,发现两者看到的文件系统是不一样的:
/usr/bin/git/usr/bin/ssh~/.ssh/id_ed25519~/.ssh/是空的)原来,Trae IDE 的集成终端运行在一个独立的沙箱环境里,这个沙箱有自己独立的
/usr/bin视图(虽然能看到 1000 多个文件,但里面没有 git 和 ssh),并且 home 目录也是隔离的——沙箱的~/.ssh/只有一个known_hosts,没有私钥。这就解释了所有现象:
git pull:用的是真实系统的 git + ssh + 私钥;git status不报错:本地操作不需要 ssh。3.3 沙箱里实际使用的 git 是什么
在 Trae 终端里执行
which git,发现指向:这是个符号链接,最终指向 deepin 玲珑(linglong)应用层里的 git:
这个 git 能执行本地命令(如
git status),但它调用 ssh 时,因为沙箱里/usr/bin/ssh不存在,所以报cannot run ssh。3.4 关键发现:沙箱通过 /run/host/rootfs 映射宿主机
继续排查时发现,虽然 Trae 沙箱隔离了
/usr,但通过/run/host/rootfs/路径可以访问到宿主机的真实文件系统:这就为解决问题提供了入口:可以让 Trae 终端通过这个路径"借用"宿主机的 git 和 ssh。
四、解决方案
核心思路:在
~/.bashrc中配置,让 Trae 终端优先使用/run/host/rootfs/usr/bin/下的 git 和 ssh,并指定宿主机的 SSH 私钥路径。4.1 编辑 ~/.bashrc
在
~/.bashrc末尾追加以下内容(请把你的用户名替换为实际用户名):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 最前,让git和ssh命令优先使用宿主机版本。export GIT_SSH_COMMAND="...ssh -i 私钥路径 -o IdentitiesOnly=yes"→ 指定 git 调用 ssh 时使用的具体命令和私钥路径。
-i 私钥路径:明确指定使用哪个私钥文件;-o IdentitiesOnly=yes:只使用上面指定的私钥,不尝试 ssh-agent 里的其他 key,避免认证失败。4.3 重启 Trae 终端
修改
~/.bashrc后,需要重启 Trae 终端让配置生效:Ctrl+`)。五、验证方法
新终端打开后,依次执行以下命令验证:
如果以上命令都正常,说明问题已解决。
六、相关注意事项
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 前置条件
在应用本方案前,请确保:
~/.ssh/id_ed25519.pub的内容)已添加到代码托管平台(codeup / github / gitee 等)的 SSH Keys 设置里。6.4 让 Trae 终端加载 ~/.bashrc
默认情况下,Trae 终端可能不会以"登录 shell"方式启动,导致
~/.bashrc里的配置(包括上面的修复)不生效。需要在 Trae 配置文件~/.config/Trae CN/User/settings.json中添加:-l参数让 bash 以登录 shell 启动,从而走/etc/profile→~/.profile→~/.bashrc的完整加载链路。6.5 附带问题:dircolors 报错
配置登录 shell 后,Trae 终端启动时可能还会报:
这是
~/.bashrc里eval $(dircolors)缺少-b参数导致。修复方法:编辑~/.bashrc,把:改成:
-b表示显式指定生成 Bourne shell 语法的命令,不再依赖$SHELL变量推断。七、总结
deepin 25 采用 ostree + 玲珑(linglong)架构,文件系统组织方式和传统 Debian 有所不同。Trae IDE 的沙箱机制又在此基础上做了一层隔离,导致集成终端看不到真实系统的
/usr/bin。本方案的关键在于发现
/run/host/rootfs/这个沙箱与宿主机之间的"映射通道"。通过让 Trae 终端优先使用该路径下的宿主机 git 和 ssh,并指定宿主机私钥,既解决了问题,又保证了 deepin 原生终端环境不受影响。希望这篇排查记录能帮到遇到类似问题的 deepin 用户。如果在其他沙箱类 IDE(如某些版本的 Cursor、Windsurf)上遇到类似问题,也可以参考同样的思路排查。