CVS (Concurrent Versions System), присутствующая практически во всех дистрибутивах Linux, легко масштабируется от хранения персональных данных до больших проектов.
CVS в отличие от RCS включает поддержку сложной структуры каталогов и возможность одновременного извлечения группы файлов и целых каталогов.
Для создания личного репозитория создается корневой каталог репозитория (имя и место расположения корневого каталога CVS выбирается произвольно):
oleg@localhost:~:$ mkdir ~/cvsroot
Устанавливаются права, позволяющие пользоваться репозиторием лишь его владельцу:
oleg@localhost:~:$ chmod -R 700 ~/cvsroot
Командой init создается и инициализируется репозиторий:
oleg@localhost:~:$ cvs -d ~/cvsroot init
Далее выполняется переход в каталог с файлами, которые будут храниться в репозитории:
oleg@localhost:~:$ cd ~/webprojects/linuxcookbook/
Затем каталог (дерево каталогов) импортируется в репозиторий:
oleg@localhost:~/webprojects/linuxcookbook:$ \
> cvs -d ~/cvsroot import linuxcookbook mensh version1
Аргументы mensh (метка поставщика) и version1 (номер версии) необходимы для нормальной работы CVS.
Запускается текстовый редактор по умолчанию со следующим текстом:
CVS: Enter log. Lines beginning with `CVS:` are removed automatically
CVS:
CVS:----------------------------------------------------------------------
Вводимое описание проекта должно быть внятым и подробным, чтобы через какое-то время не пришлось гадать, о чем идет речь.
После введения описания проекта, сохранения и закрытия происходит импорт:
cvs import: Importing /home/oleg/cvsroot/linuxcookbook/content
N linuxcookbook/content/passwordfilesintegrity.html
N linuxcookbook/content/cvslocalrepositorycreating.html
N linuxcookbook/content/groupadd.html
N linuxcookbook/content/cupsservinglinuxclients.html
N linuxcookbook/content/sudo.html
N linuxcookbook/content/cddvdrecordintro.html
...
No conflicts created by this import
Теперь за пределами корневого каталога репозитория CVS создается рабочий каталог, в который будут извлекаться файлы для редактирования (из репозитория можно извлекать отдельные файлы, группы файлов и целые каталоги):
oleg@localhost:~:$ mkdir ~/sandbox
Выполняется переход в созданный рабочий каталог:
oleg@localhost:~:$ cd ~/sandbox
oleg@localhost:~/sandbox:$
Из репозитория извлекается необходимый каталог с подкаталогами и всеми файлами в рабочий каталог:
oleg@localhost:~/sandbox:$ cvs -d ~/cvsroot checkout linuxcookbook
cvs checkout: Updating linuxcookbook
cvs checkout: Updating linuxcookbook/content
U linuxcookbook/content/adduser.html
U linuxcookbook/content/cdbootdiskcreating.html
U linuxcookbook/content/cdcopy.html
U linuxcookbook/content/cddvdrecordintro.html
U linuxcookbook/content/cdfiletreecreating.html
U linuxcookbook/content/cdrecordaudio.html
U linuxcookbook/content/cdrecordblank.html
U linuxcookbook/content/cdrecordmultisession.html
U linuxcookbook/content/cdrecordportable.html
U linuxcookbook/content/cdrecordscanbus.html
U linuxcookbook/content/cdrecordsplit.html
U linuxcookbook/content/cups.html
...
При извлечении файлов из репозитория CVS в каталоге ~/sandbox/linuxcookbook — „песочнице“ — создается каталог для работы с файлами и каталог CVS с набором административных файлов CVS:
oleg@localhost:~/sandbox/linuxcookbook:$ ls -l
drwxr-xr-x 2 oleg users 4096 2008-11-05 16:21 CVS/
drwxr-xr-x 3 oleg users 4096 2008-11-05 16:31 content/
Файл после редактирования сохраняется и возвращается в репозиторий CVS командой commit:
oleg@localhost:~/sandbox/linuxcookbook:$ cd content
oleg@localhost:~/sandbox/linuxcookbook/content:$ vim adduser.html
oleg@localhost:~/sandbox/linuxcookbook/content:$ cvs commit
Снова запускается текстовый редактор по умолчанию со следующим текстом:
CVS: Enter log. Lines beginning with `CVS:` are removed automatically
CVS:
CVS: Comitting in .
CVS:
CVS: Modified files:
CVS: adduser.html
CVS:----------------------------------------------------------------------
После занесения в журнал описания изменений и закрытия редактора происходит занесение отредактированного файла в репозиторий:
cvs commit: Examining .
Checking in adduser.html;
/home/oleg/cvsroot/linuxcookbook/content/adduser.html,v <-- adduser.html
new revision: 1.2; previous revision: 1.1
done
Каждый проект — один каталог со всеми файлами и подкаталогами — должен храниться в отдельном каталоге, даже если он состоит из одного файла.