Claude Code po 30 dneh izbriše zgodovino: kako jo shraniti
MarkdownKje so shranjene seje Claude Code, kako nastaviti cleanupPeriodDays in kako urediti zunanji arhiv z uporabo rsync, launchd ali cron.
Preberi celoten članek
Za pomoč pri uporabi storitve si oglejte dokumentacijo Ailoot.
Ali Claude Code res izbriše zgodovino sej?
Ključne ugotovitve
Da. Vsakič, ko se Claude Code zažene, izbriše datoteke sej, starejše od 30 dni. Za to je odgovorna nastavitev cleanupPeriodDays v datoteki ~/.claude/settings.json; njena privzeta vrednost je 30. Brisanje poteka brez opozorila, brez zahteve za soglasje in brez možnosti obnovitve datotek.
Odprete Claude Code, da bi nadaljevali sejo izpred dveh mesecev — vendar je ni več. Datoteka je bila v celoti izbrisana z diska. To ni napaka ali redek hrošč: tako deluje privzeti mehanizem čiščenja.
Čiščenje nadzira ena nastavitev: cleanupPeriodDays. Njena privzeta vrednost je 30. Vsakič, ko se Claude Code zažene, pregleda mapo z zgodovino in izbriše vse, kar je starejše od tega obdobja. Te nastavitve v moji datoteki ~/.claude/settings.json sploh ni bilo, kar pomeni, da je veljala privzeta vrednost, nekatere moje starejše seje pa so že izginile.
V Anthropicovem repozitoriju je odprtih več prijav napak v zvezi s tem, vendar ni bila odpravljena nobena.
Kje Claude Code shranjuje zgodovino sej?
Ključne ugotovitve
Zgodovina vsake seje je shranjena v ~/.claude/projects/<project-path>/<session-id>.jsonl. Ime mape je absolutna pot do delovnega imenika, v katerem ste zagnali Claude Code, pri čemer so poševnice zamenjane z vezaji. Datoteka .jsonl vsebuje celoten pogovor, vrstico za vrstico: vaše pozive, odgovore modela, klice orodij in urejanja datotek. To je prav tisti spomin, ki ga čiščenje izbriše.
Svojo zgodovino preprosto najdete. Odprite terminal in si oglejte vsebino mape:
ls ~/.claude/projects/
Vsaka podmapa je ločen projekt. Njeno ime kodira pot: projekt v /Users/alex/dev/shop na primer postane mapa -Users-alex-dev-shop. V njej so datoteke sej:
ls -lt ~/.claude/projects/-Users-alex-dev-shop/
# 3f8a1c2e-....jsonl ← ena seja = ena datoteka
# a91b7d40-....jsonl
Vsaka datoteka .jsonl je dnevnik po vrsticah: ena vrstica predstavlja en dogodek seje. Vsebuje več kot le besedilo pogovora. Shranjuje logiko vaših odločitev: zakaj ste izbrali določeno strukturo baze podatkov, katere možnosti ste zavrnili, kje se je Claude zmotil in kako ste napako odpravili.
V bistvu gre za dnevnik razvoja projekta. Zato je izguba tako boleča: ne izgubite »klepeta«, temveč kontekst, ki ste ga gradili več tednov. O strukturi tega konteksta sem pisal v vodniku »Claude Memory vs. CLAUDE.md«.
Zakaj Anthropic po 30 dneh izbriše prepise?
Ključne ugotovitve
Anthropic kot razlog navaja zasebnost in varnost. Datoteke sej so na disku shranjene kot navadno besedilo in lahko vsebujejo izvorno kodo, gesla ter ključe API. Trajna hramba predstavlja tveganje: če vam ukradejo prenosnik ali nekdo pridobi dostop do diska, dobi vse te občutljive podatke. Obdobje 30 dni je kompromis med »nadaljevanjem nedavnega dela« in »nehranjenjem skrivnosti na disku dlje, kot je potrebno«.
Za brisanje obstaja razlog, ki ga je vredno razumeti, preden ga povsem izklopite. Prepis je navadno besedilo. Če je Claude med sejo prebral datoteko .env, vstavil ključ v ukaz ali pa ste v poziv prilepili geslo, se je vse to shranilo v .jsonl kot navadno besedilo. Dlje ko taka datoteka ostane na disku, večja je možnost, da bo nekega dne prišlo do uhajanja podatkov.
Anthropic to pove naravnost: prepisi lahko vsebujejo izvorno kodo, poverilnice in drugo občutljivo gradivo, njihova hramba na disku dlje, kot je potrebno, pa pomeni resnično tveganje za zasebnost. Obdobje 30 dni je bilo izbrano kot kompromis.
Pomisleki skupnosti se nanašajo na tri stvari: brisanje je tiho (med nastavitvijo ali zagonom ni opozorila), ni soglasja (nihče vas ne vpraša) in ni obnovitve (datoteke ne gredo v koš in ni povrnitve). V prijavi #59248 razvijalci prosijo za eno stvar: pravičnejše čiščenje — opozorilo, obdobje za obnovitev in manj agresivno privzeto obdobje.
Zakaj lahko varnostna kopija sama sproži brisanje?
Ključne ugotovitve
Čiščenje določi, kaj bo izbrisalo, na podlagi časa spremembe datoteke (mtime). Ne preveri dejanske zadnje dejavnosti v seji. Vsak proces, ki poseže v datoteko .jsonl — sinhronizacija v oblak, rsync, urejevalnik ali skript — lahko spremeni njen mtime, zato je videti, kot da je nova seja zastarela. Ob naslednjem zagonu Claude Code sejo oceni kot staro in jo izbriše. Paradoks: naivni poskus varnostnega kopiranja zgodovine v upravljani mapi pospeši njeno izgubo.
To je najtežji del in tu se ujamejo ljudje, ki skušajo sami zaščititi svoje podatke. Čiščenje upošteva mtime, časovni žig zadnje spremembe datoteke. Predpostavlja, da mtime odraža, kdaj ste nazadnje delali v seji. V praksi lahko mtime spremeni kar koli: odjemalec za sinhronizacijo Dropbox ali iCloud, rsync, protivirusna programska oprema, indeksator ali vaš skript za varnostno kopiranje.
Tu je past. Odločite se, da boste shranili svojo zgodovino, in nastavite sinhronizacijo v oblak za ~/.claude/projects/. V nekem trenutku storitev za sinhronizacijo prepiše datoteko in njen mtime nastavi na starejši datum (to se lahko zgodi pri obnovitvi iz kopije v oblaku). Claude Code ob zagonu zazna »staro« datoteko in jo izbriše. Želeli ste jo shraniti, a ste pospešili njeno izbrisanje.
Sklep je samo eden: varnostna kopija mora biti zunaj mape ~/.claude/projects/. Čiščenje deluje samo znotraj te mape. Kopija, shranjena zunaj nje, je zunaj njegovega dosega. Rešitev bom zasnoval na tem načelu.
Kako lahko takoj ustavite brisanje zgodovine?
Ključne ugotovitve
Ena nastavitev. Odprite ~/.claude/settings.json in nastavite cleanupPeriodDays na veliko vrednost — na primer 3650 (deset let). V praksi s tem onemogočite samodejno brisanje: nič ne bo starejše od omejitve. Pomembno: ta nastavitev ščiti samo tisto, kar še ni bilo izbrisano. Zgodovine, ki jo je čiščenje že izbrisalo, ni mogoče obnoviti. Zato ukrepajte najprej, preden izgubite še kakšno sejo.
Brisanje ustavite v treh korakih:
- Odprite datoteko z nastavitvami:
~/.claude/settings.json(če datoteka ne obstaja, jo ustvarite). - Dodajte nastavitev
cleanupPeriodDaysz veliko vrednostjo:
{
"cleanupPeriodDays": 3650
}
- Shranite datoteko. Nastavitev bo začela veljati ob naslednjem zagonu Claude Code.
Vrednost 3650 pomeni deset let: v praksi se brisanje ne bo več izvajalo. Če želite čiščenje ohraniti, vendar dovoliti daljše obdobje, nastavite vrednost na 365 (eno leto); izginile bodo samo seje, starejše od enega leta. Ali je bila nastavitev upoštevana, lahko preverite s tem ukazom:
grep cleanupPeriodDays ~/.claude/settings.json
Ena pomembna podrobnost, ki jo je lahko spregledati: podaljšanje obdobja NE obnovi že izbrisanih podatkov. Čiščenje se izvede ob zagonu in vse, kar je bilo izbrisano v prejšnjih zagonih, je za vedno izgubljeno. Zato to nastavite najprej — s tem preprečite prihodnje izgube, ne povrnete pa že izbrisanih podatkov. Če se želite izogniti izgubi zgodovine Claude Code in projekta zaradi nenamernega ukaza, si oglejte vodnik »Kako nastaviti Claude Code, da ne bo poškodoval vašega projekta«.
Zgodovina vaših sej je del drugega možganja projekta: vsebuje logiko odločitev, ki je niste zabeležili nikjer drugje. cleanupPeriodDays ohrani datoteke, vendar jih ne spremeni v sistem, ki bi vam omogočal, da čez šest mesecev poiščete, kar potrebujete.
Kako samodejno arhivirati zgodovino zunaj mape čiščenja?
Ključne ugotovitve
Kopirajte seje v arhiv ZUNAJ mape ~/.claude/projects/, kjer čiščenje ne velja. Preprost ukaz rsync -a, ki ga enkrat na dan zaženete za ločen imenik, zadostuje: nove datoteke se dodajo, stare pa ostanejo. Ker je arhiv zunaj, nanj ne vplivata niti cleanupPeriodDays niti napaka z mtime. Izvajanje avtomatizirajte z launchd (macOS) ali cron (Linux), pa se bo vaša zgodovina kopičila sama od sebe.
Ideja je preprosta: pustite Claude Code, da s svojo mapo počne, kar želi, vi pa hranite ločen arhiv zunaj nje. Arhiv je zaščiten pred tem mehanizmom čiščenja, vendar se še vedno lahko izgubi zaradi odpovedi diska, nenamernega brisanja ali neuspele kopije. Nastavite ga takole:
- Ustvarite mapo za arhiv zunaj upravljanega imenika:
mkdir -p ~/claude-history-archive
- Tja kopirajte trenutno zgodovino. Zastavica
-aohrani strukturo in časovne žige;--ignore-existingpusti že kopirane datoteke nedotaknjene:
rsync -a ~/.claude/projects/ ~/claude-history-archive/
- Avtomatizirajte vsakodnevno izvajanje. V macOS uporabite launchd. Ustvarite datoteko
~/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>
- Naložite agenta, da bo deloval v ozadju:
launchctl load ~/Library/LaunchAgents/com.example.claudearchive.plist
V Linuxu enako storite z eno vrstico v crontabu (crontab -e):
0 3 * * * rsync -a ~/.claude/projects/ ~/claude-history-archive/
Zakaj to deluje, medtem ko sinhronizacija iz prejšnjega razdelka ne? Arhiv je ZUNAJ mape ~/.claude/projects/, zato ga čiščenje sploh ne more videti. Kopiranje poteka samo v eno smer (iz aktivne mape v arhiv), mtime aktivnih datotek pa se ne spreminja — zato do napake z mtime ne pride. Tudi če Claude Code jutri izbriše sejo iz svoje mape, bo njena kopija ostala v arhivu.
Kako lahko arhiv sej spremenite v iskalno drugo možganstvo?
Ključne ugotovitve
Arhiv dajte pod git, pa boste dobili različicami opremljeno in v celoti iskalno zbirko vseh svojih sej. V mapi za arhiv zaženite git init, nato pa vsak dan git add -A && git commit, da dobite zgodovino sprememb in zaščito pred nenamernim prepisovanjem. Po preteklih sejah lahko iščete z običajnim grepom, strukturirano vsebino pa pridobite z jq, saj je .jsonl JSON, razdeljen po vrsticah. Tako arhiv postane praktično orodje.
Samo kopičenje datotek ni dovolj — do njih morate imeti dostop. Arhiv lahko spremenite v uporabno orodje v dveh korakih.
Najprej ga različicite z gitom. V mapi za arhiv inicializirajte repozitorij:
cd ~/claude-history-archive
git init
git add -A && git commit -m "Prvi posnetek zgodovine Claude Code"
V isto dnevno opravilo kot rsync dodajte git add -A && git commit. Zdaj imate zgodovino različic: vidite lahko, kaj se je pojavilo in kdaj, ter z enim ukazom razveljavite nenamerno prepisovanje.
Drugič, iščite. Datoteke .jsonl so JSON, razdeljen po vrsticah, zato lahko uporabite znana orodja. Poiščite, v kateri seji je bila obravnavana določena tema:
grep -rl "selitev baze podatkov" ~/claude-history-archive/
Iz seje pridobite samo besedilo svojih pozivov (z uporabo jq, saj gre za JSON):
jq -r 'select(.type=="user") | .message.content' session.jsonl
Na tej točki začne zgodovina sej delovati kot drugo možganstvo projekta: kot zbirka podatkov, v kateri lahko v nekaj sekundah poiščete »kako smo se o tem odločili marca«. Za ločen pregled tega, kam gre kontekst v seji in kako ga upravljati, si oglejte »Kam gredo tokeni v Claude Code«.
Ali lahko obnovite že izbrisane seje?
Ključne ugotovitve
Vgrajene metode ni. Claude Code izbrisanih datotek ne premakne v koš in ne hrani možnosti povrnitve; datoteka je za vedno izbrisana. Edino upanje so zunanje kopije, ustvarjene PRED brisanjem: posnetek Time Machine v macOS, zgodovina različic OneDrive ali Dropbox ali ročna varnostna kopija. Če nič od tega ne obstaja, je seja izgubljena. Zato je treba zaščito nastaviti vnaprej — preden je kaj izgubiti.
Pošten odgovor: verjetno ne. Claude Code nima funkcije za obnovitev, koša ali dnevnika razveljavitev za izbrisane prepise. Datoteka preprosto izgine z diska.
Obstaja ena možnost: varnostne kopije sistema, če so bile vnaprej omogočene:
- macOS Time Machine — če je posnetek zajel
~/.claude/projects/pred brisanjem, lahko datoteko pridobite iz varnostne kopije za želeni datum. - Zgodovina različic OneDrive / Dropbox — če se je mapa sinhronizirala z omogočenim shranjevanjem različic, poiščite datoteko v zgodovini različic v oblaku (vendar ne pozabite na past z mtime: sinhronizacija je lahko sprožila tudi brisanje).
- Ročne kopije — kateri koli
rsync/cp, ki ste ga ročno zagnali in kopiral datoteke nekam zunaj upravljane mape.
Če nič od tega ni obstajalo, je seja izgubljena. In to ni redkost: enemu avtorju napake v Anthropicovem repozitoriju je bilo poškodovanih 26 od 38 zapisov, kar je predstavljalo več mesecev dela. Edina zanesljiva zaščita je tista, ki je vzpostavljena PRED izgubo. Nastavite cleanupPeriodDays in samodejno arhiviranje še danes, dokler je še kaj za rešiti.
Katero vrednost izbrati za cleanupPeriodDays?
Ključne ugotovitve
Za večino ljudi je primerna vrednost 3650 (deset let, kar v praksi onemogoči brisanje) skupaj z zunanjim samodejnim arhivom. Privzeto vrednost 30 ohranite samo, če ne potrebujete zgodovine in vam je pomembneje, da skrivnosti ne hranite na disku. Vrednost 365 je razumna srednja pot z letnim čiščenjem. Druga možnost je, da zgodovine sploh ne zapisujete: uporabite okoljsko spremenljivko CLAUDE_CODE_SKIP_PROMPT_HISTORY ali zastavico --no-session-persistence, vendar imata ta možnost nasproten namen.
Nastavitev je ena, vendar ima lahko več pomenov. Primerjajte možnosti in izberite tisto, ki ustreza vaši uporabi:
| Vrednost | Kaj naredi | Komu ustreza |
|---|---|---|
30 (privzeto) | Ob zagonu izbriše seje, starejše od 30 dni | Zgodovine ne potrebujete; pomembneje vam je, da občutljivih podatkov ne hranite na disku |
365 | Hrani enoletno zgodovino, nato jo enkrat na leto počisti | Potrebujete novejšo zgodovino, ne pa arhiva za nedoločen čas |
3650 | V praksi onemogoči brisanje | Vse želite obdržati + zunanji arhiv (priporočeno) |
CLAUDE_CODE_SKIP_PROMPT_HISTORY | Zgodovine sploh ne zapisuje na disk | Največja zasebnost; zgodovine sploh ne potrebujete |
Pomembno varnostno opozorilo: če nastavite 3650 in obdržite vse, se strinjate s shranjevanjem prepisov na disku, ki lahko vsebujejo ključe in kodo. To je zavesten kompromis: priročnost arhiva proti tveganju. Zmanjšajte tveganje: arhiv hranite na šifriranem disku (FileVault v macOS), ne shranjujte ga v javnem oblaku in ga ne oddajte v javni repozitorij git. Pripravil sem ločen vodnik o tem, kateri podatki lahko uidejo prek Claude Code: »Varnost podatkov v Claude Code«.
Kaj storiti danes: kontrolni seznam
Ključne ugotovitve
Ti koraki zmanjšajo izgubo zgodovine: podaljšajte hrambo z cleanupPeriodDays: 3650, seje kopirajte zunaj ~/.claude/projects/ in arhiv različic upravljajte ločeno. Pred čiščenjem Claude Code so zaščitene samo uspešno kopirane datoteke. Dnevni urnik ob uspešnem izvajanju pušča do en dan novejših sprememb brez arhiva; neuspele ali izpuščene izvedbe vrzel povečajo. Kopija na istem disku ne ščiti pred odpovedjo diska.
Zaščito nastavite po korakih:
- V datoteki
~/.claude/settings.jsonnastavitecleanupPeriodDays: 3650— brisanje ste ustavili. - Ustvarite
~/claude-history-archivezunaj upravljane mape in prvič zaženitersync -a. - Načrtujte vsakodnevno izvajanje z launchd (macOS) ali cron (Linux).
- V arhivu inicializirajte git in istemu opravilu dodajte
git add -A && git commit. - Preverite, ali je arhiv na šifriranem disku in se ne sinhronizira z javnim oblakom.
- Pri vsaki načrtovani izvedbi preverite uspešno kopiranje, nato preglejte nedavno arhivirano sejo in redno obnovite vzorec v ločeno začasno mapo ter preverite berljivost.
- Če želite zaščito pred izgubo naprave ali diska, hranite neodvisno shranjeno varnostno kopijo z ustreznim nadzorom dostopa in preizkusite tudi njeno obnovo. Zgodovina Git na istem disku ni neodvisna varnostna kopija.
Zgodovina sej je le ena od plasti konteksta, zaradi katerih je Claude zanesljiv.
Viri
Spoznajte Ailoot.
Več podrobnosti
Vprašanja in odgovori: Claude Code po 30 dneh izbriše zgodovino: kako jo shraniti
Ali dnevni arhiv zagotavlja, da se nobena seja ne more izgubiti?
Ne. Uspešno kopirane datoteke zaščiti pred čiščenjem upravljane mape. Pri uspešnih dnevnih izvedbah lahko še vedno manjka do en dan novejših sprememb; neuspele izvedbe povečajo vrzel, kopija na istem disku pa lahko odpove skupaj z izvirnikom.
Kako preverim uporabnost arhiva?
Potrdite uspešnost načrtovanih kopiranj, preglejte nedavno arhivirano sejo in redno obnovite vzorec v ločeno začasno mapo. Za zaščito pred izgubo naprave ali diska preizkusite tudi kopijo, shranjeno neodvisno od izvirnika.