от Курс за ССОК
Системи за контрол на версиите на софтуера или SCM (source code management), са спомагателни системи при разработката на софтуер, чрез които се осъществява следене на промените направени в изходния код.
Важността на SCM
Системите за контрол на версиите са един от най-важните инфраструктурни елементи за всеки проект(независимо дали е с отворен код или не). Те предлагат изключително много предимства, особено когато по проекта работят повече хора. Добра практика е те да се използват и в проекти само с един разработчик!
SCM предоставят възможност за проследяване на промените (change log), разклоняване на проекта на версии (т.нар. branch), прилагане на промените от един клон към друг без да се налага повторното им написване (merge), отмяна на предишни промени (revert) и др.
Видове SCM
- Централизирани - името им идва от това, че кода на проекта се съхранява на централно място - сървър. Един програмист може да изтегли работно копие на кода на своя компютър, да направи промени по него и да ги добави в централното хранилище. Когато други програмисти обновят своите работни копия в тях ще се появят добавени промени. Слабостта на този можел е, че имаме слабо място - централното хранилище. Освен това разклоняването на проектите и някои други операции могат да бъдат по-сложни, в зависимост от дизайна на системата.
- CVS - може би най-известната система за управление на версиите. Набора от фунцкии на cvs е относително ограничен, но системата все още се използва в много проекти.
- Subversion - създаден като заместител на cvs. Коригира много от неговите недостъци и по настоящем е често използвана система в нови проекти.
- Децентрализирани (Разпределени) - при тези системи всяко работно копие е и хранилище. Предимството е, че почти всички операции могат да бъдат извършвани локално, без връзка към основното хранилище. Когато е необходимо локалните промени могат да бъдат публикувани в основното хранилище и да станат достъпни за всички.
- git - създаден от Линус Торвалдс(създателя на Линукс) специално за целите на Линукс разработката. Най-популярната разпределена система по настоящем. Изключително гъвката и мощна. Много популярна сред Ruby и Rails разработчиците.
- Mercurial - създаден приблизително по същото време като git. Предлага почти идентични възможности. Предпочитана SCM система от Sun(NetBeans, OpenJDK, OpenSolaris) и Mozilla.
- Bazaar - създадена за нуждите на Ubuntu. Предлага отлична интеграция с Lauchpad.
Основни команди за работа със SCM
При повечето системи командите и резултатите от тях са подобни. Обикновено това се прави с цел да се минимизира времето, за което нов потребител на системата ще се научи да я използва, ако има опит с друга такава.
CVS
- cvs co - изтегляне на работно копие от хранилище (check out)
cvs -d:pserver:anonymous@cvs.sv.gnu.org:/sources/texinfo co .
- cvs status - преглед на статуса на файловете, показва кои файлове са променени
- cvs diff - преглед на локалните промени или създаване на текстов файл кръпка
$ cvs diff -u TODO
Index: TODO
===================================================================
RCS file: /sources/texinfo/texinfo/TODO,v
retrieving revision 1.46
diff -u -r1.46 TODO
--- TODO 19 Sep 2008 00:47:39 -0000 1.46
+++ TODO 25 Oct 2008 07:13:35 -0000
@@ -191,6 +191,8 @@
[makeinfo should not try to be make, or assume it knows how the user
wants to generate images. Too many different methods are possible.]
+- Added by fosscourse.org
+
- Change bars. This is difficult or impossible in TeX,
unfortunately. To do it right requires device driver support.
wdiff or ediff may be all we can do. Merely specifying what should be
- cvs add - добавяне на нов файл към хранилището.
cvs add hello.c
- cvs commit - подаване на промените към хранилището, постоянен запис. Всякакви промени, добавени или изтрити файлове са видими в локалното работно копие, те трябва да бъдат изпратени към хранилището, за да станат постоянни.
cvs commit -m "добавен е нов файл" hello.c
- cvs up - обновяване на работното копие
- Премахване на нежелани промени - премахнете файла с промените и обновете работното копие.
rm TODO && cvs up
Subversion
- svn co - изтегляне на работно копие
svn co http://svn.fedorahosted.org/svn/audit
- svn stat - преглед на статуса, показва кои файлове са променени
- svn diff - преглед на промените или създаване на кръпка
svn diff [файл]
- svn add - добавяне на нов файл
- svn commit - запис в хранилището
- svn up - обновяване на локалното копие
- svn revert - отмяна на нежелани промени
svn revert файл
Git
- git clone - изтегляне на работно копие. Нарича се клониране, т.к. Git е разпределена система и всяко работно копие е и хранилище.
git clone http://git.fedorahosted.org/git/pungi.git
- git status - преглед на статуса, показва кои файлове са променени
- git diff - преглед на промените или създаване на кръпка. Т.к. системата е разпределена, най-често се използва като база основното хранилище.
$ git diff origin
diff --git a/ToDo b/ToDo
index 7adbaed..1b2ab4a 100644
--- a/ToDo
+++ b/ToDo
@@ -14,6 +14,8 @@ Working with Kickstart
DONE ^^
+* fosscourse.org
+
* Move to CLI only:
name
version
- git add - добавяне на нов файл или променен файл към множеството, което ще бъде записано в локалното хранилище.
- git commit - запис в локалното хранилище
- git pull - обновяване на локалното копие
- Отмяна на нежелани промени - отново с git checkout
git checkout origin ToDo
Mercurial
- hg clone - клониране на работно копие
hg clone http://hg.fedorahosted.org/hg/pam-redhat
- hg status - преглед на статуса, показва кои файлове са променени
- hg diff - преглед на промените
- hg export - създаване на кръпка
hg export tip > my.patch
- hg add - добавяне на нови файлове
- hg commit - запис в локалното хранилище
- hg pull/update - обновяване на локалното копие
$ hg pull
pulling from http://hg.et.redhat.com/virt/applications/virt-manager--devel
searching for changes
adding changesets
adding manifests
adding file changes
added 35 changesets with 68 changes to 35 files
(run 'hg update' to get a working copy)
$ hg update
35 files updated, 0 files merged, 0 files removed, 0 files unresolved
Bazaar
- bzr branch - изтегляне на локално копие
bzr branch http://bzr.fedorahosted.org/bzr/preupgrade/dev
- bzr status - преглед на статуса, показва кои файлове са променени
- bzr diff - преглед на промените или създаване на кръпка
- bzr add - добавяне на нови файлове
- bzr commit - запис в локалното хранилище
- bzr pull - обновяване на локалното копие
- bzr revert - отмяна на нежелани промени
- Документация за Bazaar - http://bazaar-vcs.org/Documentation
- Olive - графична програма за Bazaar
Добри практики при работа със SCM
За успешна и ползотворна работа със SCM е необходимо да знаете най-често използваните команди. Продължителното използване само на една система естествено води до опознаване на всички останали команди. Важно е да се отбележи, че много проекти имат свои изисквания или установени правила за работа със SCM. Най-често това се отнася по отношение на форматирането на кръпките. Ако нямате права за запис в хранилището, то потърсете или питайте за това в какъв формат е най-добре да изпращате кръпките си. Ако сте начинаещ попитайте и за примерна команда или помощен скрипт, който да върши исканото действие. Използването на общи практики с останалите членове на проекта увеличава шансовете Ви да добиете известност и работата Ви да се приема добре от останалите.