Codex 对话迁移教程 Windows 旧电脑 TO Windows 新电脑
零 Git 基础迁移手册:Codex 对话迁移教程
Windows 旧电脑 → Windows 新电脑
不使用 Git,也能备份、迁移并恢复本地历史对话
最终成功标准: 旧电脑的历史对话出现在新电脑 Codex 列表中,并且可以双击正常打开。文件数量相同、命令能够列出会话,都只是中间检查,不等于迁移已经完成。
- 适用系统:Windows 10 / Windows 11
先看结论:整个迁移分为 5 个动作
- 旧电脑:找到并备份 .codex\sessions 中的会话文件。
- 同时迁移需要继续使用的项目文件夹,尽量保持原来的相对路径。
- 新电脑:确认 Codex 图形界面可正常打开并登录,再安装 Node.js 和 Codex CLI。
- 合并旧会话;如果用户名或项目路径不同,再修复会话文件中的旧路径。
- 使用 codex resume --all 检查,然后回到 Codex 界面逐条双击验证。
- 最后有常见问题排查,在迁移过程中若遇到问题可看排查中是否有同样问题。
重要边界: 本教程迁移的是 Codex 本地会话,不是 ChatGPT 网页版的普通聊天记录。对话文件也不等于项目代码;如果希望在新电脑继续开发,项目文件夹需要另外复制或重新拉取。
开始前准备
- 两台 Windows 电脑,且旧电脑仍能访问 Codex 文件。
- 一个可正常读写的 U 盘、移动硬盘或其他安全传输介质。
- 新电脑能够正常打开 Codex 图形界面,并已登录自己的 OpenAI 账号。
- 迁移期间不要同时打开 Codex 桌面端或运行中的 Codex CLI。
- 所有操作以“复制”为主,不剪切、不删除旧电脑文件。
隐私提醒: 会话文件可能包含提示词、代码、项目路径或其他工作内容。不要把 .codex 文件夹公开上传,也不要向他人发送 auth.json。
先记下两台电脑的用户名和用户目录
分别在旧电脑和新电脑打开 PowerShell,执行下面两行。
$env:USERNAME
$env:USERPROFILE
记录结果。后面的示例使用:旧电脑用户名 OLD_NAME,新电脑用户名 NEW_NAME。请替换成你自己的结果,不要照抄示例。
第一部分:在旧电脑完成备份
步骤 1 完全退出 Codex
关闭 Codex 窗口;如果右下角系统托盘仍有图标,也一并退出。再关闭所有正在运行 Codex 的 PowerShell 或命令提示符窗口。
步骤 2 打开旧电脑的 Codex 数据目录
按 Win + R,粘贴下面的路径,然后按回车。
%USERPROFILE%\.codex
正常情况下可以看到 sessions 文件夹。里面通常按 年 / 月 / 日 分层存放 .jsonl 会话文件。
步骤 3 统计旧电脑的会话文件数量
在 PowerShell 执行:
(Get-ChildItem "$env:USERPROFILE\.codex\sessions" -Recurse -Filter *.jsonl -File).Count
把显示的数字记下来。后面需要用新电脑再次统计,确认文件是否完整复制。
步骤 4 使用 PowerShell 复制 sessions 和项目文件
建议使用 PowerShell 调用 Windows 自带的 robocopy 完成复制。它会保留原有目录层级,并在复制结束后显示结果,比直接拖拽文件夹更容易检查。
4.1 确认 U 盘盘符
打开“此电脑”,查看 U 盘对应的盘符,例如 E: 或 F:。下面的命令以 E: 为例;如果你的 U 盘不是 E:,只修改代码第一行中的盘符。
执行方式: 在旧电脑打开 PowerShell,把下面整段命令一次性粘贴进去,然后按回车。无需以管理员身份运行。
4.2 复制 sessions 并自动核对数量
& {
# 只修改这里的 U 盘盘符
$usbDrive = "E:"
$source = Join-Path $env:USERPROFILE ".codex\sessions"
$timeStamp = Get-Date -Format "yyyyMMdd-HHmmss"
$backupRoot = Join-Path $usbDrive "Codex-Migration-Backup-$timeStamp"
$destination = Join-Path $backupRoot "sessions"
if (-not (Test-Path "$usbDrive\")) {
Write-Host "没有找到 U 盘,请检查盘符。" -ForegroundColor Red
return
}
if (-not (Test-Path $source)) {
Write-Host "没有找到 sessions:$source" -ForegroundColor Red
return
}
New-Item -ItemType Directory -Force -Path $destination | Out-Null
robocopy $source $destination /E /Z /FFT /COPY:DAT /DCOPY:DAT /R:2 /W:2 /XJ
$copyCode = $LASTEXITCODE
$sourceCount = (Get-ChildItem $source -Recurse -Filter *.jsonl -File).Count
$destinationCount = (Get-ChildItem $destination -Recurse -Filter *.jsonl -File).Count
Write-Host "旧电脑文件数量:$sourceCount"
Write-Host "U 盘文件数量:$destinationCount"
Write-Host "备份位置:$backupRoot"
if (($copyCode -lt 8) -and ($sourceCount -eq $destinationCount)) {
Write-Host "复制完成,文件数量一致。" -ForegroundColor Green
} else {
Write-Host "复制结果需要检查,请先不要拔出 U 盘。" -ForegroundColor Red
Write-Host "Robocopy 返回代码:$copyCode"
}
}
命令每次都会在 U 盘中新建一个带日期和时间的文件夹,例如 E:\Codex-Migration-Backup-20260827-153000,不会覆盖之前的备份。
- 显示绿色的“复制完成,文件数量一致”:sessions 已完整复制。
- 显示红色提醒或数量不一致:先不要拔出 U 盘,也不要删除旧电脑文件。
- 命令没有使用 /MIR;/MIR 可能删除目标中多余的文件,不适合迁移备份。
4.3 复制 archived_sessions(如果旧电脑上存在)
部分电脑的 .codex 下还可能存在 archived_sessions。先把第一行改成上一步显示的实际备份位置,再执行:
$backupRoot = "E:\Codex-Migration-Backup-20260827-153000"
$archivedSource = Join-Path $env:USERPROFILE ".codex\archived_sessions"
$archivedDestination = Join-Path $backupRoot "archived_sessions"
if (Test-Path $archivedSource) {
robocopy $archivedSource $archivedDestination /E /Z /FFT /COPY:DAT /DCOPY:DAT /R:2 /W:2 /XJ
if ($LASTEXITCODE -lt 8) {
Write-Host "archived_sessions 复制完成。" -ForegroundColor Green
} else {
Write-Host "archived_sessions 复制失败,请检查。" -ForegroundColor Red
}
} else {
Write-Host "旧电脑中没有 archived_sessions,可以跳过。"
}
4.4 复制需要继续使用的项目文件
Codex 对话文件不等于项目代码。如果希望在新电脑继续原来的工作,还需要把相关项目文件夹复制到 U 盘。以下为单个项目示例,执行前必须修改前三行:
$projectSource = "C:\Users\旧用户名\Documents\ProjectA"
$backupRoot = "E:\Codex-Migration-Backup-20260827-153000"
$projectName = "ProjectA"
$projectDestination = Join-Path $backupRoot "projects\$projectName"
if (Test-Path $projectSource) {
robocopy $projectSource $projectDestination /E /Z /FFT /COPY:DAT /DCOPY:DAT /R:2 /W:2 /XJ
if ($LASTEXITCODE -lt 8) {
Write-Host "项目复制完成:$projectName" -ForegroundColor Green
} else {
Write-Host "项目复制失败:$projectName" -ForegroundColor Red
}
} else {
Write-Host "没有找到项目:$projectSource" -ForegroundColor Red
}
有多个项目时,分别修改 projectSource 和 projectName,逐个复制。不要为了迁移会话而复制 auth.json;新电脑应当自行登录。
备份完成检查: 打开 U 盘中的备份文件夹,确认 sessions 可以继续进入年、月、日目录并看到 .jsonl 文件;PowerShell 显示的新旧文件数量一致;需要继续使用的项目也已复制。全部确认后,再安全弹出 U 盘。
第二部分:在新电脑安装 Codex CLI
步骤 5 安装 Node.js LTS
Codex CLI 可以通过 npm 安装,因此先在新电脑打开 PowerShell,执行下面的命令安装 Node.js 长期支持版(LTS)。
winget install --id OpenJS.NodeJS.LTS
如果出现来源协议或安装确认提示,输入“Y”。安装完成后,关闭当前 PowerShell,再重新打开一个 PowerShell 窗口。
步骤 6 验证 Node.js 和 npm
在新打开的 PowerShell 中逐行执行:
node -v
npm -v
两条命令都能显示版本号,说明 Node.js 和 npm 已可正常使用。如果提示找不到命令,先重启新电脑,再重新验证。
步骤 7 安装并验证 Codex CLI
在 PowerShell 中执行:
npm install -g @openai/codex@latest
安装完成后(大概需要2分钟 ),关闭并重新打开 PowerShell,然后执行下面的命令:
codex --version
能够显示 Codex CLI 版本号,才说明安装成功。这里安装的是后文执行 codex resume --all 所需的命令行工具。
步骤 8 首次启动 Codex CLI 并登录
继续在 PowerShell 中执行:
codex
首次启动时,按照屏幕提示选择使用 ChatGPT/OpenAI 账号登录,并在浏览器中完成授权。登录成功并进入 Codex CLI 后,可以先退出;后续迁移验证时还会再次使用它。
第三部分:在新电脑合并会话
步骤 9 让新电脑先生成本机目录
打开一次 Codex 图形界面,确认已经登录。建议新建一条临时对话,等待它正常显示后再退出 Codex。这样可以确认新电脑的 .codex\sessions 已经生成。
步骤 10 备份新电脑现有 sessions
即使新电脑只有一条测试对话,也先做备份。打开 PowerShell,逐行执行:
$sessionRoot = Join-Path $env:USERPROFILE '.codex\sessions'
$backupRoot = Join-Path $env:USERPROFILE ('.codex\sessions-before-migration-' + (Get-Date -Format 'yyyyMMdd-HHmmss'))
Copy-Item $sessionRoot $backupRoot -Recurse -Force
Write-Host "备份位置:$backupRoot"
步骤 11 把旧电脑 sessions 合并到新电脑
保持 Codex 完全退出。这一步也建议使用 PowerShell 完成,不再手动拖拽文件夹。PowerShell 调用 Windows 自带的 robocopy,可以保留原有目录层级、跳过新电脑中已经存在的文件,并在完成后核对结果。
先打开“此电脑”,确认 U 盘盘符,并找到步骤 4 生成的实际备份文件夹。下面以 E:\Codex-Migration-Backup-20260827-153000 为例;只修改命令第一行的备份路径。然后在新电脑打开 PowerShell,把整段命令一次性粘贴并按回车。无需管理员权限。
& {
# 只修改这里:U 盘中的实际备份文件夹
$backupRoot = "E:\Codex-Migration-Backup-20260827-153000"
$source = Join-Path $backupRoot "sessions"
$destination = Join-Path $env:USERPROFILE ".codex\sessions"
if (-not (Test-Path $source -PathType Container)) {
Write-Host "没有找到 U 盘中的 sessions:$source" -ForegroundColor Red
return
}
New-Item -ItemType Directory -Force -Path $destination | Out-Null
$sourceCount = (Get-ChildItem $source -Recurse -Filter *.jsonl -File).Count
$beforeCount = (Get-ChildItem $destination -Recurse -Filter *.jsonl -File).Count
if ($sourceCount -eq 0) {
Write-Host "U 盘的 sessions 中没有找到 .jsonl 文件,请检查备份路径。" -ForegroundColor Red
return
}
robocopy $source $destination /E /Z /FFT /COPY:DAT /DCOPY:DAT /R:2 /W:2 /XJ /XC /XN /XO
$copyCode = $LASTEXITCODE
$afterCount = (Get-ChildItem $destination -Recurse -Filter *.jsonl -File).Count
$missingCount = @(
Get-ChildItem $source -Recurse -Filter *.jsonl -File | Where-Object {
$relativePath = $_.FullName.Substring($source.Length).TrimStart([char]'\')
-not (Test-Path (Join-Path $destination $relativePath))
}
).Count
Write-Host "U 盘旧会话数量:$sourceCount"
Write-Host "合并前新电脑数量:$beforeCount"
Write-Host "合并后新电脑数量:$afterCount"
Write-Host "仍缺少的旧会话数量:$missingCount"
if (($copyCode -lt 8) -and ($missingCount -eq 0)) {
Write-Host "合并完成,所有旧会话文件都已到位。" -ForegroundColor Green
} else {
Write-Host "合并结果需要检查,请先不要继续后面的路径修复。" -ForegroundColor Red
Write-Host "Robocopy 返回代码:$copyCode"
}
}
- 命令会把 U 盘备份中 sessions 里面的内容直接复制到新电脑 sessions,不会形成 sessions\sessions\年份 这样的重复层级。正确结构仍是 sessions\年份\月份\日期*.jsonl。
- 参数 /XC /XN /XO 会跳过目标中已经存在的同路径文件,不覆盖新电脑现有会话。
- 命令未使用 /MIR,不会删除新电脑 sessions 中原有的文件。
- 看到绿色的“合并完成,所有旧会话文件都已到位”,并且“仍缺少的旧会话数量”为 0,才继续下一步;如果出现红色提醒,先检查 U 盘路径和复制结果。
步骤 12 再次统计新电脑会话数量
(Get-ChildItem "$env:USERPROFILE\.codex\sessions" -Recurse -Filter *.jsonl -File).Count
结果至少应包含旧电脑的会话数量;如果新电脑原本已经有新会话,总数可能更大。数量明显偏少时,先不要继续修复路径,应回到复制步骤检查。
第四部分:处理用户名或项目路径不同
什么时候需要做这一部分? 旧电脑和新电脑的 Windows 用户名不同,或旧项目文件夹在新电脑换了盘符/位置时,需要检查路径。用户名完全相同且项目仍在原路径,可以先跳到“第五部分”。
为什么文件明明存在,却提示恢复失败?
Codex 会话不只保存聊天文字,还可能保存当时的工作目录。例如旧电脑的会话记录仍指向 C:\Users\OLD_NAME\Desktop\ProjectA,而新电脑真实路径已经变成 C:\Users\NEW_NAME\Desktop\ProjectA。只复制 .jsonl 文件,并不会自动修复这些旧路径。
- 只迁移对话:可能可以看到标题,但打开或恢复时仍失败。
- 对话和项目一起迁移,并保持相同的相对目录:通常只需要替换用户目录。
- 项目换了盘符或文件夹:需要把完整旧项目路径映射成完整新项目路径。
步骤 13 先检查旧路径出现了多少次
把 OLD_NAME 替换为旧电脑真实用户名,然后执行:
$oldRoot = 'C:\Users\OLD_NAME'
$oldEscaped = $oldRoot.Replace('\','\\')
$sessionRoot = Join-Path $env:USERPROFILE '.codex\sessions'
$hits = Get-ChildItem $sessionRoot -Recurse -Filter *.jsonl -File | Select-String -SimpleMatch $oldEscaped
Write-Host "包含旧用户路径的记录数:$($hits.Count)"
如果结果是 0,并且两台电脑用户名本来就相同,可以跳过批量修复。如果结果大于 0,继续下一步。
步骤 14 批量替换旧用户目录
执行前确认: 必须已经完成“步骤 10”的新电脑 sessions 备份。下面的命令会直接修改 .jsonl 文件。只修改 OLD_NAME;NEW_NAME 会自动使用当前新电脑的用户目录。
$oldRoot = 'C:\Users\OLD_NAME'
$newRoot = $env:USERPROFILE
$oldEscaped = $oldRoot.Replace('\','\\')
$newEscaped = $newRoot.Replace('\','\\')
$sessionRoot = Join-Path $env:USERPROFILE '.codex\sessions'
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
$changed = 0
Get-ChildItem $sessionRoot -Recurse -Filter *.jsonl -File | ForEach-Object {
$text = [System.IO.File]::ReadAllText($_.FullName)
$updated = $text.Replace($oldEscaped, $newEscaped).Replace($oldRoot, $newRoot)
if ($updated -ne $text) {
[System.IO.File]::WriteAllText($_.FullName, $updated, $utf8NoBom)
$changed++
Write-Host "已修复:$($_.FullName)"
}
}
Write-Host "修复完成,共修改 $changed 个文件。"
这段命令同时处理 JSON 中经过转义的双反斜杠路径和普通 Windows 路径,并使用 UTF-8 无 BOM 写回,减少破坏 JSONL 文件编码的风险。
步骤 15 项目位置也改变时,按完整路径映射
如果旧项目原来在 D 盘,新电脑改到其他位置,只替换用户名没有用。应把下面两行改成项目的完整旧路径和完整新路径,再使用与步骤 14 相同的替换逻辑。
$oldRoot = 'D:\旧项目目录\ProjectA'
$newRoot = 'C:\Users\NEW_NAME\Documents\ProjectA'
不要一刀切: 如果历史会话来自多个项目,先分别列出旧路径,再逐个映射。不要把所有会话强行指向同一个空文件夹,否则虽然可能打开,对话对应的项目上下文会变错。
真实案例
例如:旧电脑用户名是 86178,新电脑用户名是 kiemm,那么步骤 14 中只需要把第一行写成:
$oldRoot = 'C:\Users\86178'
$newRoot 仍然使用 $env:USERPROFILE,新电脑会自动得到 C:\Users\kiemm。教程读者不应照抄 86178 或 kiemm,而应使用自己的实际用户名。
第五部分:让 Codex 重新识别并验证会话
步骤 16 在安全的普通目录运行 resume
不要在 C:\WINDOWS\system32 中运行或信任目录。打开 PowerShell,逐行执行:
$resumeDir = Join-Path $env:USERPROFILE 'CodexResume'
New-Item -ItemType Directory -Force -Path $resumeDir | Out-Null
Set-Location $resumeDir
codex resume --all
如果出现是否信任当前目录的提示,只确认当前路径确实是自己刚创建的 C:\Users\你的用户名\CodexResume,然后再选择信任。
看到列表代表什么? codex resume --all 能列出历史会话,说明 CLI 已经读取到会话文件;但仍要回到 Codex 图形界面双击验证,才能判定迁移完成。
步骤 17 重启 Codex 并实际打开旧对话
- 退出 CLI 会话,完全关闭 Codex。
- 重新打开 Codex,等待历史列表加载。
- 不要寻找并不存在的“按照时间顺序”按钮;直接在当前列表中检查旧标题。
- 至少抽查 3 条不同日期、不同项目的旧对话,并双击打开。
- 打开后检查内容是否完整、关联项目目录是否正确。
迁移成功验收表
| 检查项目 | 通过标准 |
|---|---|
| 文件数量 | 旧会话文件已完整复制;新电脑总数不少于旧电脑数量 |
| CLI 识别 | codex resume --all 能显示旧会话 |
| 界面列表 | Codex 界面能够看到旧对话标题 |
| 实际打开 | 抽查的旧对话可以双击打开,不再提示恢复失败 |
| 项目对应 | 打开后关联的工作目录存在,且指向正确项目 |
| 新会话保留 | 新电脑迁移前产生的会话仍然存在 |
常见问题与排查:
U 盘在旧电脑正常,新电脑读不到
先换另一个 USB 接口。接口接触、供电或兼容问题会造成看似复制失败;确认能稳定读取后,再重新统计 .jsonl 数量。
文件数量对,但双击仍显示“恢复对话失败”
优先检查会话中的旧用户名、旧盘符和旧项目目录。数量一致只能证明文件到位,不能证明记录里的工作目录有效。
运行 codex resume --all 时位于 system32
不要信任 C:\WINDOWS\system32。退出提示,进入自己创建的 CodexResume 文件夹后重新运行。
PowerShell 说找不到 codex 命令
回到步骤 6,确认 node -v 和 npm -v 都能显示版本号;再按步骤 7 重新安装 Codex CLI。安装完成后关闭并重新打开 PowerShell,执行 codex --version 验证。不要在命令尚未安装成功时继续修改会话文件。
新电脑看不到任何旧对话
检查是否多套了一层 sessions 文件夹;正确结构是 .codex\sessions\年份\月份\日期*.jsonl。然后完全退出并重启 Codex。
只恢复了一部分对话
重新统计旧电脑、U 盘和新电脑三处文件数量;若旧电脑存在 archived_sessions,也检查是否遗漏。
修复命令执行后情况更糟
停止继续修改,完全退出 Codex,把当前 sessions 改名保留,再用步骤 10 生成的 sessions-before-migration 时间戳备份恢复。
对话能打开,但项目内容不对
会话路径被映射到了错误目录。使用完整项目路径逐个修复,不要把多个项目统一替换成一个文件夹。
回退方法
如果路径修改后出现异常,可以使用新电脑迁移前的时间戳备份恢复。恢复前先完全退出 Codex。
- 打开 %USERPROFILE%.codex。
- 把当前 sessions 改名为 sessions-problem,保留现场,不要直接删除。
- 把 sessions-before-migration-日期时间 文件夹复制一份并改名为 sessions。
- 重新打开 Codex,确认新电脑原有会话恢复正常。
最后的安全提醒
- 迁移完成并稳定使用一段时间前,不要删除旧电脑原始 sessions。
- 不要用记事本批量另存为 .jsonl,避免编码或换行被改变。
- 不要复制或分享 auth.json;账号授权应在新电脑重新登录完成。
- Codex 更新后,本地目录结构可能变化;发现结构明显不同,应先停止并重新确认。
葡萄城是专业的软件开发技术和低代码平台提供商,聚焦软件开发技术,以“赋能开发者”为使命,致力于通过表格控件、低代码和BI等各类软件开发工具和服务,一站式满足开发者需求,帮助企业提升开发效率并创新开发模式。
更多推荐



所有评论(0)