Claude Code xóa lịch sử sau 30 ngày: cách lưu lại
MarkdownClaude Code lưu các phiên ở đâu, cách cấu hình cleanupPeriodDays và cách sắp xếp kho lưu trữ bên ngoài bằng rsync, launchd hoặc cron.
Đọc toàn bộ bài viết
Để được trợ giúp khi sử dụng dịch vụ, hãy xem tài liệu Ailoot.
Claude Code có thực sự xóa lịch sử phiên của bạn không?
Điểm chính
Có. Mỗi khi Claude Code khởi động, ứng dụng sẽ xóa các tệp phiên cũ hơn 30 ngày. Cài đặt cleanupPeriodDays trong ~/.claude/settings.json chịu trách nhiệm cho việc này; giá trị mặc định là 30. Việc xóa diễn ra không báo trước, không hỏi ý kiến bạn và không có cách khôi phục tệp.
Bạn mở Claude Code để quay lại một phiên từ hai tháng trước — nhưng phiên đó đã biến mất. Tệp đã bị xóa hoàn toàn khỏi đĩa. Đây không phải sự cố hay lỗi hiếm gặp: đó là cách cơ chế dọn dẹp mặc định hoạt động.
Một cài đặt kiểm soát việc dọn dẹp: cleanupPeriodDays. Giá trị mặc định là 30. Mỗi khi Claude Code khởi động, ứng dụng quét thư mục lịch sử và xóa mọi thứ cũ hơn khoảng thời gian đó. Tôi hoàn toàn không có cài đặt này trong ~/.claude/settings.json, nghĩa là giá trị mặc định đang được áp dụng, và một số phiên cũ của tôi đã biến mất.
Một số báo cáo lỗi về vấn đề này vẫn đang mở trong kho lưu trữ của Anthropic và chưa có báo cáo nào được xử lý.
Claude Code lưu lịch sử phiên ở đâu?
Điểm chính
Lịch sử của từng phiên được lưu tại ~/.claude/projects/<project-path>/<session-id>.jsonl. Tên thư mục là đường dẫn tuyệt đối của thư mục làm việc nơi bạn chạy Claude Code, trong đó các dấu gạch chéo được thay bằng dấu gạch ngang. Tệp .jsonl chứa toàn bộ cuộc trò chuyện, mỗi dòng một mục: lời nhắc của bạn, phản hồi của mô hình, lệnh gọi công cụ và chỉnh sửa tệp. Đây chính là bộ nhớ mà quá trình dọn dẹp xóa đi.
Bạn có thể dễ dàng tìm lịch sử. Mở terminal và xem nội dung thư mục:
ls ~/.claude/projects/
Mỗi thư mục con là một dự án riêng. Tên thư mục mã hóa đường dẫn: chẳng hạn, dự án ở /Users/alex/dev/shop sẽ trở thành thư mục -Users-alex-dev-shop. Bên trong là các tệp phiên:
ls -lt ~/.claude/projects/-Users-alex-dev-shop/
# 3f8a1c2e-....jsonl ← một phiên = một tệp
# a91b7d40-....jsonl
Mỗi tệp .jsonl là nhật ký theo từng dòng: một dòng tương ứng với một sự kiện trong phiên. Tệp chứa nhiều hơn văn bản cuộc trò chuyện. Nó lưu lại logic đằng sau các quyết định của bạn: vì sao bạn chọn một cấu trúc cơ sở dữ liệu cụ thể, bạn đã bác bỏ những phương án nào, Claude mắc lỗi ở đâu và bạn đã sửa lỗi đó như thế nào.
Về bản chất, đây là nhật ký phát triển dự án. Vì vậy, mất nó thật đau lòng: thứ bạn mất không chỉ là một “đoạn chat”, mà là bối cảnh bạn đã tích lũy trong nhiều tuần. Tôi đã trình bày cấu trúc của bối cảnh này trong hướng dẫn “Claude Memory và CLAUDE.md”.
Vì sao Anthropic xóa bản ghi phiên sau 30 ngày?
Điểm chính
Quan điểm của Anthropic liên quan đến quyền riêng tư và bảo mật. Tệp phiên được lưu trên đĩa dưới dạng văn bản thuần và có thể chứa mã nguồn, mật khẩu cùng API key. Giữ chúng mãi mãi là một rủi ro: nếu máy tính xách tay bị đánh cắp hoặc ai đó truy cập được vào đĩa, họ sẽ có toàn bộ dữ liệu nhạy cảm đó. Khoảng thời gian 30 ngày là sự cân bằng giữa “tiếp tục công việc gần đây” và “không lưu bí mật trên đĩa lâu hơn mức cần thiết”.
Việc xóa có lý do của nó, và bạn nên hiểu lý do đó trước khi tắt hoàn toàn. Bản ghi phiên là văn bản thuần. Nếu Claude đọc tệp .env trong một phiên, chèn khóa vào một lệnh hoặc bạn dán mật khẩu vào lời nhắc, tất cả đều được ghi vào .jsonl dưới dạng văn bản thuần. Tệp như vậy nằm trên đĩa càng lâu thì nguy cơ một ngày nào đó dữ liệu bị rò rỉ càng cao.
Anthropic nói rõ: bản ghi phiên có thể chứa mã nguồn, thông tin xác thực và các dữ liệu nhạy cảm khác; lưu chúng trên đĩa lâu hơn mức cần thiết tạo ra rủi ro thực sự về quyền riêng tư. Khoảng thời gian 30 ngày được chọn như một sự thỏa hiệp.
Cộng đồng phản đối ba điểm: việc xóa diễn ra âm thầm (không có cảnh báo trong lúc thiết lập hoặc khi khởi động), không có sự đồng ý (bạn không được hỏi) và không thể khôi phục (tệp không được chuyển vào Thùng rác và không có thao tác hoàn tác). Trong issue #59248, các nhà phát triển chỉ yêu cầu một điều: làm cho việc dọn dẹp công bằng hơn — đưa ra cảnh báo, có thời gian khôi phục và đặt khoảng thời gian mặc định ít nghiêm ngặt hơn.
Vì sao chính tập lệnh sao lưu có thể kích hoạt việc xóa?
Điểm chính
Quá trình dọn dẹp quyết định xóa tệp nào dựa trên thời gian sửa đổi tệp (mtime). Nó không kiểm tra hoạt động thực tế gần nhất trong một phiên. Bất kỳ tiến trình nào chạm vào tệp .jsonl — đồng bộ đám mây, rsync, trình soạn thảo hay tập lệnh — đều có thể thay đổi mtime khiến một phiên mới trông như đã lỗi thời. Lần khởi động Claude Code tiếp theo sẽ xem phiên đó là cũ và xóa nó. Nghịch lý là: một nỗ lực sao lưu lịch sử thiếu cẩn trọng ngay trong thư mục được quản lý lại đẩy nhanh việc mất dữ liệu.
Đây là phần khó nhất và thường khiến những người tự bảo vệ dữ liệu của mình mắc bẫy. Quá trình dọn dẹp kiểm tra mtime, dấu thời gian cho biết lần sửa đổi tệp gần nhất. Nó giả định mtime phản ánh lần gần nhất bạn làm việc trong phiên. Trên thực tế, bất cứ thứ gì cũng có thể thay đổi mtime: ứng dụng đồng bộ Dropbox hoặc iCloud, rsync, phần mềm diệt vi-rút, trình lập chỉ mục hoặc chính tập lệnh sao lưu của bạn.
Đây là cái bẫy. Bạn quyết định lưu lịch sử và thiết lập đồng bộ đám mây cho ~/.claude/projects/. Đến một lúc nào đó, dịch vụ đồng bộ ghi lại một tệp và đặt mtime của tệp về một ngày sớm hơn (điều này có thể xảy ra khi khôi phục từ bản sao trên đám mây). Claude Code thấy một tệp “cũ” khi khởi động và xóa nó. Bạn muốn lưu tệp, nhưng lại khiến nó bị xóa sớm hơn.
Chỉ có một kết luận: bản sao lưu phải nằm bên ngoài ~/.claude/projects/. Quá trình dọn dẹp chỉ hoạt động bên trong thư mục này. Bản sao được lưu bên ngoài nằm ngoài tầm với của quá trình dọn dẹp. Tôi sẽ xây dựng giải pháp dựa trên nguyên tắc này.
Làm thế nào để ngăn việc xóa lịch sử ngay bây giờ?
Điểm chính
Chỉ cần một cài đặt. Mở ~/.claude/settings.json và đặt cleanupPeriodDays thành một số lớn — chẳng hạn 3650 (mười năm). Trên thực tế, cách này vô hiệu hóa việc xóa tự động: sẽ không có gì cũ hơn giới hạn đó. Quan trọng: cài đặt này chỉ bảo vệ những gì chưa bị xóa. Không thể khôi phục lịch sử mà quá trình dọn dẹp đã xóa. Vì vậy, bước đầu tiên là hành động trước khi bạn mất thêm một phiên nữa.
Ngăn việc xóa trong ba bước:
- Mở tệp cài đặt:
~/.claude/settings.json(nếu tệp chưa tồn tại, hãy tạo tệp). - Thêm cài đặt
cleanupPeriodDaysvới giá trị lớn:
{
"cleanupPeriodDays": 3650
}
- Lưu tệp. Cài đặt sẽ có hiệu lực vào lần khởi động Claude Code tiếp theo.
Giá trị 3650 tương đương mười năm: trên thực tế, việc xóa sẽ không còn diễn ra. Nếu bạn vẫn muốn dọn dẹp nhưng cần thêm thời gian, hãy đặt giá trị 365 (một năm); khi đó chỉ các phiên cũ hơn một năm mới biến mất. Bạn có thể kiểm tra xem cài đặt đã được áp dụng hay chưa bằng lệnh sau:
grep cleanupPeriodDays ~/.claude/settings.json
Một lưu ý dễ bỏ qua: kéo dài khoảng thời gian KHÔNG khôi phục những gì đã bị xóa. Quá trình dọn dẹp chạy khi khởi động, và mọi thứ đã bị xóa trong các lần chạy trước đều mất vĩnh viễn. Vì vậy, bạn nên đặt cài đặt này trước — nó ngăn tổn thất trong tương lai nhưng không thể đưa những gì đã bị xóa trở lại. Nếu muốn tránh mất lịch sử Claude Code cũng như tránh làm hỏng dự án do một lệnh vô tình, hãy xem hướng dẫn “Cách cấu hình Claude Code để không làm hỏng dự án của bạn”.
Lịch sử phiên là một phần bộ não thứ hai của dự án: nó chứa logic ra quyết định mà bạn chưa ghi lại ở nơi nào khác. cleanupPeriodDays giữ các tệp lại, nhưng không biến chúng thành một hệ thống giúp bạn tìm được thứ cần thiết sau sáu tháng.
Tự động lưu trữ lịch sử ngoài thư mục dọn dẹp thế nào?
Điểm chính
Sao chép các phiên vào một kho lưu trữ bên ngoài ~/.claude/projects/, nơi quá trình dọn dẹp không tác động đến. Chạy rsync -a đơn giản đến một thư mục riêng mỗi ngày một lần là đủ: các tệp mới được thêm vào, còn tệp cũ vẫn ở đó. Vì kho lưu trữ nằm bên ngoài nên cả cleanupPeriodDays lẫn lỗi mtime đều không ảnh hưởng đến nó. Tự động hóa việc chạy bằng launchd (macOS) hoặc cron (Linux), lịch sử của bạn sẽ tự tích lũy.
Ý tưởng rất đơn giản: cứ để Claude Code làm những gì nó muốn với thư mục của nó, còn bạn giữ kho lưu trữ riêng bên ngoài thư mục đó. Nó được bảo vệ khỏi cơ chế dọn dẹp này nhưng vẫn có thể mất do hỏng đĩa, xóa nhầm hoặc chép thất bại. Thiết lập như sau:
- Tạo thư mục lưu trữ bên ngoài thư mục được quản lý:
mkdir -p ~/claude-history-archive
- Sao chép lịch sử hiện tại vào đó. Cờ
-agiữ nguyên cấu trúc và dấu thời gian;--ignore-existinggiữ nguyên các tệp đã được sao chép:
rsync -a ~/.claude/projects/ ~/claude-history-archive/
- Tự động hóa việc chạy mỗi ngày một lần. Trên macOS, dùng launchd. Tạo tệp
~/Library/LaunchAgents/com.example.claudearchive.plist:
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.claudearchive</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/rsync</string>
<string>-a</string>
<string>/Users/YOUR_NAME/.claude/projects/</string>
<string>/Users/YOUR_NAME/claude-history-archive/</string>
</array>
<key>StartInterval</key>
<integer>86400</integer>
</dict>
</plist>
- Tải agent để nó chạy trong nền:
launchctl load ~/Library/LaunchAgents/com.example.claudearchive.plist
Trên Linux, bạn cũng làm tương tự bằng một dòng trong crontab (crontab -e):
0 3 * * * rsync -a ~/.claude/projects/ ~/claude-history-archive/
Vì sao cách này hiệu quả trong khi đồng bộ ở phần trước lại thất bại? Kho lưu trữ nằm bên ngoài ~/.claude/projects/, nên quá trình dọn dẹp hoàn toàn không thể nhìn thấy nó. Việc sao chép chỉ theo một hướng (từ thư mục đang hoạt động sang kho lưu trữ), và chúng ta không tác động đến mtime của các tệp đang hoạt động — vì vậy lỗi mtime không xảy ra. Ngay cả khi Claude Code xóa một phiên khỏi thư mục của nó vào ngày mai, bản sao trong kho lưu trữ vẫn còn.
Làm thế nào để biến kho lưu trữ phiên thành bộ não thứ hai có thể tìm kiếm?
Điểm chính
Đưa kho lưu trữ vào git, bạn sẽ có một cơ sở dữ liệu có quản lý phiên bản và có thể tìm kiếm toàn bộ các phiên. Chạy git init trong thư mục kho lưu trữ, sau đó chạy git add -A && git commit mỗi ngày để có lịch sử thay đổi và bảo vệ khỏi việc ghi đè vô tình. Bạn có thể tìm các phiên cũ bằng grep thông thường và trích xuất nội dung có cấu trúc bằng jq, vì .jsonl là JSON phân tách theo dòng. Nhờ vậy, kho lưu trữ trở thành một công cụ thiết thực.
Chỉ tích lũy tệp thôi là chưa đủ — bạn cần truy cập được chúng. Hai bước sẽ biến kho lưu trữ thành một công cụ hoạt động thực sự.
Đầu tiên, quản lý phiên bản bằng git. Khởi tạo một kho lưu trữ trong thư mục lưu trữ:
cd ~/claude-history-archive
git init
git add -A && git commit -m "First snapshot of Claude Code history"
Thêm git add -A && git commit vào cùng lượt chạy rsync hằng ngày. Giờ đây bạn có lịch sử phiên bản: có thể xem nội dung nào xuất hiện và xuất hiện khi nào, cũng như hoàn tác một lần ghi đè vô tình bằng một lệnh.
Thứ hai, tìm kiếm. Tệp .jsonl là JSON phân tách theo dòng, vì vậy bạn có thể dùng các công cụ quen thuộc. Tìm phiên nào đã thảo luận về một chủ đề cụ thể:
grep -rl "database migration" ~/claude-history-archive/
Chỉ trích xuất văn bản lời nhắc của bạn từ một phiên (dùng jq vì đây là JSON):
jq -r 'select(.type=="user") | .message.content' session.jsonl
Lúc này, lịch sử phiên bắt đầu hoạt động như bộ não thứ hai của dự án: một cơ sở dữ liệu giúp bạn truy xuất trong vài giây câu trả lời cho câu hỏi “chúng ta đã quyết định việc này như thế nào vào tháng Ba”. Để xem phân tích riêng về vị trí lưu ngữ cảnh trong một phiên và cách quản lý ngữ cảnh, hãy xem hướng dẫn “Token đi đâu trong Claude Code”.
Có thể khôi phục các phiên đã bị xóa không?
Điểm chính
Không có cách nào được tích hợp sẵn. Claude Code không chuyển tệp đã xóa vào Thùng rác hay lưu lại trạng thái để hoàn tác; tệp bị xóa vĩnh viễn. Cơ hội duy nhất là có bản sao bên ngoài được tạo TRƯỚC khi xóa: ảnh chụp Time Machine trên macOS, lịch sử phiên bản OneDrive hoặc Dropbox, hay bản sao lưu thủ công. Nếu không có những bản sao này, phiên đã mất. Vì vậy, cần thiết lập bảo vệ trước — trước khi có thứ gì đó để mất.
Câu trả lời thành thật là: có lẽ không. Claude Code không có tính năng khôi phục, Thùng rác hay nhật ký hoàn tác cho các bản ghi phiên đã xóa. Tệp đơn giản là biến mất khỏi đĩa.
Chỉ có một lựa chọn: bản sao lưu hệ thống, nếu đã bật từ trước:
- Time Machine trên macOS — nếu một ảnh chụp đã lưu
~/.claude/projects/trước khi bị xóa, bạn có thể lấy tệp từ bản sao lưu vào ngày cần thiết. - Lịch sử phiên bản OneDrive / Dropbox — nếu thư mục được đồng bộ khi tính năng quản lý phiên bản đang bật, hãy tìm tệp trong lịch sử phiên bản trên đám mây (nhưng hãy nhớ cái bẫy mtime: việc đồng bộ cũng có thể đã kích hoạt xóa).
- Bản sao thủ công — bất kỳ lần chạy
rsync/cpthủ công nào tới một nơi bên ngoài thư mục được quản lý.
Nếu không có bản sao nào như vậy, phiên đã mất. Và chuyện này không hiếm: một tác giả của lỗi trong kho lưu trữ của Anthropic đã có 26 trong số 38 bản ghi bị hỏng, tương đương nhiều tháng làm việc. Cách bảo vệ đáng tin cậy duy nhất là thiết lập trước KHI mất dữ liệu. Hãy thiết lập cleanupPeriodDays và lưu trữ tự động ngay hôm nay, khi vẫn còn thứ để lưu.
Nên chọn giá trị nào cho cleanupPeriodDays?
Điểm chính
Với hầu hết mọi người, hãy dùng 3650 (mười năm, trên thực tế vô hiệu hóa việc xóa) cùng với kho lưu trữ tự động bên ngoài. Chỉ giữ giá trị mặc định 30 nếu bạn không cần lịch sử và việc không lưu bí mật trên đĩa quan trọng hơn. Giá trị 365 là mức trung dung hợp lý với việc dọn dẹp mỗi năm một lần. Một lựa chọn khác là hoàn toàn không ghi lịch sử: dùng biến môi trường CLAUDE_CODE_SKIP_PROMPT_HISTORY hoặc cờ --no-session-persistence, nhưng cách đó phục vụ mục đích ngược lại.
Chỉ có một cài đặt nhưng nó có thể phục vụ nhiều mục đích. So sánh các lựa chọn và chọn phương án phù hợp với trường hợp sử dụng của bạn:
| Giá trị | Tác dụng | Phù hợp với ai |
|---|---|---|
30 (mặc định) | Xóa các phiên cũ hơn 30 ngày khi khởi động | Bạn không cần lịch sử; việc tránh lưu dữ liệu nhạy cảm trên đĩa quan trọng hơn |
365 | Giữ lịch sử một năm, sau đó dọn dẹp mỗi năm một lần | Bạn cần lịch sử gần đây nhưng không cần kho lưu trữ vô thời hạn |
3650 | Trên thực tế, vô hiệu hóa việc xóa | Bạn muốn giữ mọi thứ + có kho lưu trữ bên ngoài (được khuyến nghị) |
CLAUDE_CODE_SKIP_PROMPT_HISTORY | Hoàn toàn không ghi lịch sử lên đĩa | Quyền riêng tư tối đa; bạn hoàn toàn không cần lịch sử |
Lưu ý quan trọng về bảo mật: nếu đặt 3650 và giữ lại mọi thứ, bạn đồng ý lưu trên đĩa các bản ghi phiên có thể chứa khóa và mã. Đây là sự đánh đổi có chủ ý giữa sự tiện lợi của kho lưu trữ và rủi ro. Hãy giảm thiểu rủi ro: lưu kho trên đĩa được mã hóa (FileVault trên macOS), không đưa lên đám mây công khai và không commit vào kho git công khai. Tôi đã biên soạn hướng dẫn riêng về dữ liệu có thể rò rỉ qua Claude Code: “Bảo mật dữ liệu trong Claude Code”.
Hôm nay cần làm gì: danh sách kiểm tra
Điểm chính
Các bước giảm mất lịch sử: kéo retention bằng cleanupPeriodDays: 3650, chép phiên ngoài ~/.claude/projects/ và quản lý phiên bản kho lưu. Chỉ tệp chép thành công được bảo vệ khỏi dọn dẹp Claude Code. Lịch ngày dù chạy tốt vẫn có thể thiếu tới một ngày thay đổi; lần lỗi hoặc bỏ lỡ làm khoảng trống dài hơn. Bản cùng đĩa không chống hỏng đĩa.
Thiết lập bảo vệ theo từng bước:
- Đặt
cleanupPeriodDays: 3650trong~/.claude/settings.json— bạn đã ngăn việc xóa. - Tạo
~/claude-history-archivebên ngoài thư mục được quản lý và chạyrsync -alần đầu. - Lên lịch chạy hằng ngày bằng launchd (macOS) hoặc cron (Linux).
- Khởi tạo git trong kho lưu trữ và thêm
git add -A && git commitvào cùng lượt chạy. - Kiểm tra kho lưu trữ nằm trên đĩa được mã hóa và không đồng bộ lên đám mây công khai.
- Kiểm từng lần theo lịch có chép thành công, xem phiên lưu gần đây và định kỳ khôi phục mẫu vào thư mục tạm riêng để xác minh đọc được.
- Nếu cần chống mất thiết bị hoặc đĩa, giữ backup độc lập với kiểm soát quyền phù hợp, thử khôi phục nó. Lịch sử Git cùng đĩa không là backup độc lập.
Lịch sử phiên chỉ là một lớp trong bối cảnh giúp Claude hoạt động đáng tin cậy.
Nguồn
Hãy tìm hiểu Ailoot.
Xem thêm chi tiết
Câu hỏi thường gặp
Lưu trữ hằng ngày có bảo đảm không mất phiên nào không?
Không. Nó bảo vệ tệp đã chép thành công khỏi dọn dẹp ở thư mục được quản lý. Dù chạy hằng ngày thành công vẫn có thể thiếu tới một ngày thay đổi mới; lỗi chạy làm khoảng trống lớn hơn, bản cùng đĩa có thể hỏng cùng gốc.
Kiểm tra kho lưu trữ có dùng được thế nào?
Xác nhận lần chép theo lịch thành công, xem phiên lưu gần đây và định kỳ khôi phục mẫu vào thư mục tạm riêng. Muốn chống mất máy hoặc đĩa, thử cả bản sao lưu độc lập với gốc.