Учебники

SVN — исправить ошибки

Предположим, что Джерри случайно изменил файл array.c и получил ошибки компиляции. Теперь он хочет выбросить изменения. В этой ситуации поможет операция «возврат». Операция возврата отменит все локальные изменения в файле или каталоге и разрешит все конфликтующие состояния.

[jerry@CentOS trunk]$ svn status

Выше команда даст следующий результат.

M       array.c

Попробуем сделать массив следующим образом:

[jerry@CentOS trunk]$ make array

Выше команда даст следующий результат.

cc     array.c   -o array
array.c: In function ‘main’:
array.c:26: error: ‘n’ undeclared (first use in this function)
array.c:26: error: (Each undeclared identifier is reported only once
array.c:26: error: for each function it appears in.)
array.c:34: error: ‘arr’ undeclared (first use in this function)
make: *** [array] Error 1

Джерри выполняет операцию возврата к файлу array.c .

[jerry@CentOS trunk]$ svn revert array.c 
Reverted 'array.c'

[jerry@CentOS trunk]$ svn status
[jerry@CentOS trunk]$

Теперь скомпилируйте код.

[jerry@CentOS trunk]$ make array
cc     array.c   -o array

После операции возврата его рабочая копия возвращается в исходное состояние. Операция возврата может вернуть как отдельный файл, так и полный каталог. Чтобы восстановить каталог, используйте параметр -R, как показано ниже.

[jerry@CentOS project_repo]$ pwd
/home/jerry/project_repo

[jerry@CentOS project_repo]$ svn revert -R trunk

До сих пор мы видели, как отменить изменения, внесенные в рабочую копию. Но что, если вы хотите отменить исправленную ревизию! Инструмент Системы контроля версий не позволяет удалять историю из хранилища. Мы можем только добавить историю. Это произойдет, даже если вы удалите файлы из хранилища. Чтобы отменить старую ревизию, мы должны отменить все изменения, внесенные в старую ревизию, и затем зафиксировать новую ревизию. Это называется обратным слиянием.

Допустим, Джерри добавляет код для операции линейного поиска. После проверки он фиксирует свои изменения.

[jerry@CentOS trunk]$ svn diff
Index: array.c
===================================================================
--- array.c   (revision 21)
+++ array.c   (working copy)
@@ -2,6 +2,16 @@
 
 #define MAX 16
 
+int linear_search(int *arr, int n, int key)
+{
+   int i;
+
+   for (i = 0; i < n; ++i)
+      if (arr[i] == key)
+         return i;
+   return -1;
+}
+
 void bubble_sort(int *arr, int n)
 {
    int i, j, temp, flag = 1;

[jerry@CentOS trunk]$ svn status
?       array
M       array.c

[jerry@CentOS trunk]$ svn commit -m "Added code for linear search"
Sending        trunk/array.c
Transmitting file data .
Committed revision 22.

Джерри любопытно, что делает Том. Поэтому он проверяет сообщения журнала Subversion.

[jerry@CentOS trunk]$ svn log

Приведенная выше команда даст следующий результат.

------------------------------------------------------------------------
r5 | tom   | 2013-08-24 17:15:28 +0530 (Sat, 24 Aug 2013) | 1 line

Add binary search operation
------------------------------------------------------------------------
r4 | jerry | 2013-08-18 20:43:25 +0530 (Sun, 18 Aug 2013) | 1 line

Add function to accept input and to display array contents

Просматривая сообщения журнала, Джерри понимает, что совершил серьезную ошибку. Потому что Том уже реализовал операцию двоичного поиска, которая лучше, чем линейный поиск; его код избыточен, и теперь Джерри должен вернуть свои изменения в предыдущую версию. Итак, сначала найдите текущую ревизию хранилища. В настоящее время репозиторий находится в редакции 22, и мы должны вернуть его к предыдущей редакции, то есть редакции 21.