Mobile wallpaper 1Mobile wallpaper 2Mobile wallpaper 3Mobile wallpaper 4
1370 字
7 分钟
激活 Conda 后 git HTTPS 拉推代码 OpenSSL 版本冲突

激活 Conda 后 git HTTPS 拉推代码 OpenSSL 版本冲突#

在 Conda/PyTorch 环境里写完代码,准备 git push,结果终端抛出一串 OpenSSL 版本错误。很多人第一反应是 SSH key 或仓库权限有问题,但这类报错往往和 Git 账号无关,而是动态链接器加载了错误版本的 OpenSSL。

问题现象#

在激活 Conda 环境后,执行 git push、git pull、git clone 等 HTTPS 操作,可能看到:

OpenSSL version mismatch. Built against 30000020, you have 30600030
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

这段提示容易误导人。Could not read from remote repository 只是最终结果,真正的原因在上一行:OpenSSL 版本不匹配。

根因:LD_LIBRARY_PATH 改变了动态库搜索顺序#

Linux 下的可执行文件通常不会把 OpenSSL 静态编译进去,而是在运行时由动态链接器寻找 libssl.so.3、libcrypto.so.3 等共享库。动态链接器的搜索顺序大致如下:

  1. 可执行文件自身的 RPATH / RUNPATH
  2. 环境变量 LD_LIBRARY_PATH 中的目录
  3. 系统缓存 /etc/ld.so.cache
  4. 默认系统库目录,如 /lib/x86_64-linux-gnu

问题就出在第 2 步。

Conda 激活环境时,可能会把类似下面的路径加到 LD_LIBRARY_PATH 最前面:

/root/miniconda3/envs/pytorch/lib

而系统自带的 Git 是 /usr/bin/git,它编译时链接的是系统 OpenSSL,例如 3.0.x。执行 Git 时,动态链接器看到 LD_LIBRARY_PATH 里有 Conda 的 lib,就会优先加载:

/root/miniconda3/envs/pytorch/lib/libssl.so.3
/root/miniconda3/envs/pytorch/lib/libcrypto.so.3

这些库可能来自更高版本的 OpenSSL,例如 3.6.x。文件名同样是 libssl.so.3,但 ABI 和内部符号版本并不兼容。于是系统 Git 被强行加载了 Conda 的高版本 OpenSSL,运行时版本与编译时版本不一致,最终触发:

OpenSSL version mismatch. Built against 30000020, you have 30600030
NOTE

git push 只是表象。Git 的 HTTPS 传输依赖 libcurl,而 libcurl 又依赖 OpenSSL。OpenSSL 一旦加载错版本,TLS 握手就会失败。

为什么只在 Conda 环境里出现?#

因为 Conda 环境改变了当前 Shell 的动态库搜索路径,但没有改变 /usr/bin/git 的编译方式。我们可以简单对比:

项目系统 GitConda 环境中的 Git
可执行文件/usr/bin/git通常仍是 /usr/bin/git
编译时 OpenSSL系统 OpenSSL 3.0.x不参与编译
运行时加载系统 libssl.so.3可能被强制加载 Conda libssl.so.3
结果HTTPS 正常版本冲突,拉推失败

换句话说,不是 Git 坏了,也不是 GitHub 拒绝了请求,而是系统 Git 被 Conda 的动态库劫持了。

解决方案:让 Git 使用系统 OpenSSL#

核心思路很简单:执行 Git 时不要让它看到 Conda 的 lib 目录。

临时解决:unset LD_LIBRARY_PATH#

在当前终端会话中执行:

unset LD_LIBRARY_PATH

然后重新执行 Git 命令:

git push origin main

此时动态链接器不再优先搜索 Conda 的 lib,/usr/bin/git 会加载系统原生的 libssl.so.3。编译时和运行时都使用系统 OpenSSL,HTTPS 通信恢复正常。

TIP

如果你不想影响当前 Shell 的其他程序,可以只对单条 Git 命令清空变量:

env -u LD_LIBRARY_PATH git push origin main

env -u LD_LIBRARY_PATH 表示在子进程环境中移除该变量,父 Shell 不受影响。

只移除 Conda 路径#

如果你的 LD_LIBRARY_PATH 里还有其他必须保留的路径,可以只过滤掉 Conda 目录:

export LD_LIBRARY_PATH=$(echo "$LD_LIBRARY_PATH" | tr ':' '\n' | grep -v '/root/miniconda3/envs/pytorch/lib' | paste -sd: -)

执行前建议先确认路径:

echo "$LD_LIBRARY_PATH"
WARNING

不要把 unset LD_LIBRARY_PATH 当成万能修复。它只影响当前终端会话;重新 conda activate 后变量可能再次出现。更重要的是,如果你的 PyTorch/CUDA 程序依赖该变量,全局清空可能影响深度学习环境运行。对 Git 单独临时清空通常更安全。

检查 Conda 环境变量#

有些环境变量是 Conda 通过 conda env config vars 设置的:

conda env config vars list -n pytorch

如果看到 LD_LIBRARY_PATH,可以取消:

conda env config vars unset -n pytorch LD_LIBRARY_PATH

然后重新激活环境:

conda deactivate
conda activate pytorch

如果变量来自激活脚本,可以检查:

ls "$CONDA_PREFIX/etc/conda/activate.d/"
grep -R LD_LIBRARY_PATH "$CONDA_PREFIX/etc/conda/activate.d/"

找到对应的 *.sh 后,按需调整或移除相关逻辑。

在 Conda 环境里安装 Git#

另一种思路是让 Git 也来自 Conda,这样它和 Conda 的 OpenSSL 由同一套依赖解析管理:

conda install -c conda-forge git

安装后确认使用的是 Conda Git:

which git

如果输出指向 $CONDA_PREFIX/bin/git,那么 Git、libcurl、OpenSSL 通常来自同一环境,版本冲突会小很多。不过这种方式会增加环境体积,也可能影响你原有的 Git 配置,建议按需选择。

使用 SSH 远程#

如果只是临时要推送代码,也可以把远程 URL 从 HTTPS 换成 SSH:

git remote set-url origin git@github.com:username/repo.git

SSH 方式通常不经过 libcurl 的 HTTPS/OpenSSL 路径,因此可以绕开这个问题。但它不是根因修复,只是换了通信通道。

推荐做法#

  • 在 Conda 环境中执行 Git 前,先用 env -u LD_LIBRARY_PATH git ...,避免污染当前 Shell。
  • 如果长期频繁使用,可以给 Git 设置一个包装别名: 在 ~/.bashrc 中加入 alias git='env -u LD_LIBRARY_PATH /usr/bin/git',然后执行 source ~/.bashrc。这样每次调用 Git 都会自动使用系统库。
  • 尽量保持系统 Git 与系统 OpenSSL 配套,不要手动替换 /usr/lib 下的 libssl.so.3 或 libcrypto.so.3。
  • 如果 Conda 环境确实需要 LD_LIBRARY_PATH,优先对 Git 单命令降级处理,而不是全局 unset。
  • 需要长期稳定使用时,可以考虑在 Conda 环境中安装 Git,或者把 Git 操作放到未激活 Conda 的终端里完成。
激活 Conda 后 git HTTPS 拉推代码 OpenSSL 版本冲突
https://blog.solmount.top/posts/conda-git-openssl-version-mismatch/
作者
空 柏
发布于
2026-10-04
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

封面
Sample Song
Sample Artist
封面
Sample Song
Sample Artist
0:00 / 0:00