If you still maintain legacy CVS repositories, small workflow mistakes can quickly turn into conflicts, auth issues, or confusing history output. This revised guide explains five common problems, what causes them, and practical recovery steps you can apply in day-to-day operations.
Originally published on 2009-01-30; fully revised and updated.
Original post: List of 5 Common Problems in CVS – Troubleshooting Guide.

A practical workflow for diagnosing CVS issues
Most CVS failures are easier to fix if you classify the symptom first (conflict, authentication, history lookup, or removed file), then run targeted commands.
flowchart TD
A[Run cvs update or cvs commit] --> B{What failed}
B -->|Conflict marker C| C1[Open file and resolve markers]
C1 --> C2[Test locally]
C2 --> C3[Commit resolved file]
B -->|Password or user mismatch| D1[Inspect CVS metadata]
D1 --> D2[Set your own CVS user and login]
B -->|Need deleted history| E1[Use log annotate and diff]
E1 --> E2[Recover or compare target revision]
B -->|File moved to Attic| F1[Find last non dead revision]
F1 --> F2[Recreate file add and commit]
Problem 1: Conflict after update (status C)
When multiple developers edit the same lines, CVS marks conflicts during update. Start with a dry run so you can see status codes before modifying your workspace.
A filename: file added locallyM filename: file modified locallyC filename: content conflict that needs manual merge
cvs -n update
cvs update -dP
Conflicted files contain markers. Remove the markers only after you merge both sides correctly.
<<<<<<< filename
your lines
=======
other developer lines
>>>>>>> current version
Problem 2: CVS asks for your colleague’s password
This usually happens when you copied someone else’s checked-out workspace. CVS metadata inside each CVS/ directory can still point to that user.
find . -type f -path "*/CVS/Root" -print
cat path/to/CVS/RootCode language: PHP (php)
Preferred fix: do a fresh checkout with your own account. If you must reuse the workspace, update the Root metadata carefully and re-authenticate.
export CVSROOT=:pserver:youruser@cvs.example.com:/cvsroot/project
cvs loginCode language: JavaScript (javascript)
Problem 3: Need information about deleted lines
cvs annotate shows blame-style info for lines that currently exist. To inspect lines that were removed, use revision logs and diffs between revisions.
cvs annotate path/to/file.c
cvs log path/to/file.c
cvs diff -u -r 1.23 -r 1.24 path/to/file.c
cvs update -p -r 1.23 path/to/file.c > /tmp/file.c.r1.23Code language: JavaScript (javascript)
Problem 4: cvs log shows +0 -0 for a revision
Line counts in log output are not always a reliable summary of actual content change. Verify the real delta directly with cvs diff between explicit revisions.
cvs log path/to/file.c
cvs status path/to/file.c
cvs diff -u -r 1.10 -r 1.11 path/to/file.c
Problem 5: Restore a file from Attic (DEAD state)
If a file was removed with cvs remove, CVS stores it in Attic and marks newer revisions as dead. Restoration generally means recreating working content from the last non-dead revision, then adding and committing again.
# 1) Identify last non-dead revision
cvs log path/to/foo.c
# 2) Recreate file content from that revision (example: 1.7)
cvs update -p -r 1.7 path/to/foo.c > path/to/foo.c
# 3) Re-add and commit
cvs add path/to/foo.c
cvs commit -m "Restore foo.c from Attic" path/to/foo.cCode language: PHP (php)
Quick reference: symptoms, causes, and fixes
| Problem | Typical symptom | Likely cause | First commands to run |
|---|---|---|---|
| Update conflict | C filename | Concurrent edits on same lines | cvs -n update, then manual merge |
| Wrong password prompt | Auth asks for colleague account | Copied workspace with foreign CVS metadata | Inspect CVS/Root, set your own CVSROOT, cvs login |
| Need deleted line history | Annotate does not show removed lines | Annotate only covers current text | cvs log + cvs diff -r old -r new |
Log shows +0 -0 | Unexpected line summary | Log counters do not always reflect expected net edits | cvs diff between exact revisions |
| File in Attic | DEAD state / removed file | cvs remove committed earlier | Find last live revision, recreate, cvs add, commit |
Best practices for legacy CVS repositories
- Prefer fresh checkouts over copying another developer’s workspace.
- Run
cvs -n updatebefore commit windows to catch conflicts early. - Use explicit revision numbers when investigating history or restoring content.
- Treat Attic restores as change-controlled operations and document the source revision in commit messages.
- Keep a small internal runbook for your team’s CVS authentication and branching conventions.
I’m Rajesh Kumar, a DevOps, SRE, DevSecOps, Cloud, and Platform Engineering expert passionate about sharing practical knowledge, real-world experiences, and industry best practices. I have worked at Cotocus and regularly write about technology, travel, investing, health, product reviews, and digital marketing through my various platforms.
I publish technical articles at DevOps School, travel stories at Holiday Landmark, stock market insights at Stocks Mantra, health and fitness guidance at My Medic Plus, product reviews at TrueReviewNow, and SEO and digital marketing strategies at Wizbrand.
Find Trusted Cardiac Hospitals
Compare heart hospitals by city and services — all in one place.
Explore Hospitals