SVN - Hướng dẫn nhanh
Hệ thống kiểm soát phiên bản là gì?
Version Control System (VCS) là một phần mềm giúp các nhà phát triển phần mềm làm việc cùng nhau và duy trì một lịch sử hoàn chỉnh về công việc của họ.
Following are the goals of a Version Control System.
- Cho phép các nhà phát triển làm việc đồng thời.
- Không ghi đè các thay đổi của nhau.
- Duy trì lịch sử của mọi phiên bản của mọi thứ.
A VCS is divided into two categories.
- Hệ thống kiểm soát phiên bản tập trung (CVCS) và
- Hệ thống kiểm soát phiên bản phân tán / phi tập trung (DVCS).
Trong hướng dẫn này, chúng tôi sẽ chỉ tập trung vào Hệ thống kiểm soát phiên bản tập trung và đặc biệt Subversion. Subversion thuộc hệ thống kiểm soát phiên bản tập trung, có nghĩa là nó sử dụng máy chủ trung tâm để lưu trữ tất cả các tệp và cho phép cộng tác nhóm.
Các thuật ngữ kiểm soát phiên bản
Chúng ta hãy bắt đầu bằng cách thảo luận về một số thuật ngữ mà chúng tôi sẽ sử dụng trong hướng dẫn này.
Repository:Kho lưu trữ là trái tim của bất kỳ hệ thống kiểm soát phiên bản nào. Nó là nơi trung tâm, nơi các nhà phát triển lưu trữ tất cả công việc của họ. Kho lưu trữ không chỉ lưu trữ các tệp mà còn cả lịch sử. Kho lưu trữ được truy cập qua mạng, hoạt động như một máy chủ và công cụ kiểm soát phiên bản hoạt động như một máy khách. Khách hàng có thể kết nối với kho lưu trữ và sau đó họ có thể lưu trữ / truy xuất các thay đổi của họ đến / từ kho lưu trữ. Bằng cách lưu trữ các thay đổi, một ứng dụng khách làm cho những thay đổi này có sẵn cho những người khác và bằng cách truy xuất các thay đổi, một ứng dụng sẽ lấy các thay đổi của người khác làm bản sao làm việc.
Trunk: Thân cây là một thư mục nơi tất cả các quá trình phát triển chính xảy ra và thường được các nhà phát triển kiểm tra để làm việc trong dự án.
Tags: Thư mục thẻ được sử dụng để lưu trữ các ảnh chụp nhanh có tên của dự án. Thao tác thẻ cho phép đặt tên mô tả và dễ nhớ cho phiên bản cụ thể trong kho lưu trữ.
Ví dụ: LAST_STABLE_CODE_BEFORE_EMAIL_SUPPORT đáng nhớ hơn
UUID kho: 7ceef8cb-3799-40dd-a067-c216ec2e5247 và
Bản sửa đổi: 13
Branches:Hoạt động nhánh được sử dụng để tạo ra một dòng phát triển khác. Nó rất hữu ích khi bạn muốn quá trình phát triển của mình rẽ sang hai hướng khác nhau. Ví dụ: khi bạn phát hành phiên bản 5.0, bạn có thể muốn tạo một nhánh để việc phát triển các tính năng của 6.0 có thể tách biệt với các bản sửa lỗi 5.0.
Working copy:Bản sao làm việc là một bản chụp nhanh của kho lưu trữ. Kho lưu trữ được chia sẻ bởi tất cả các nhóm, nhưng mọi người không trực tiếp sửa đổi nó. Thay vào đó, mỗi nhà phát triển sẽ kiểm tra bản sao hoạt động. Bản sao làm việc là một nơi làm việc riêng tư, nơi các nhà phát triển có thể thực hiện công việc của họ còn cách biệt với phần còn lại của nhóm.
Commit changes:Cam kết là một quá trình lưu trữ các thay đổi từ nơi làm việc riêng sang máy chủ trung tâm. Sau khi cam kết, các thay đổi được thực hiện cho tất cả nhóm. Các nhà phát triển khác có thể truy xuất những thay đổi này bằng cách cập nhật bản sao làm việc của họ. Cam kết là một hoạt động nguyên tử. Toàn bộ cam kết thành công hoặc bị lùi lại. Người dùng không bao giờ thấy một nửa cam kết đã hoàn thành.
Cài đặt SVN
Subversion là một công cụ kiểm soát phiên bản nguồn mở phổ biến. Nó là mã nguồn mở và có sẵn miễn phí trên internet. Theo mặc định, nó đi kèm với hầu hết các bản phân phối GNU / Linux, vì vậy nó có thể đã được cài đặt trên hệ thống của bạn. Để kiểm tra xem nó đã được cài đặt hay chưa, hãy sử dụng lệnh sau.
[jerry@CentOS ~]$ svn --version
Nếu máy khách Subversion không được cài đặt, thì lệnh sẽ báo lỗi, nếu không nó sẽ hiển thị phiên bản của phần mềm đã cài đặt.
[jerry@CentOS ~]$ svn --version
-bash: svn: command not found
Nếu bạn đang sử dụng GNU / Linux dựa trên RPM, thì hãy sử dụng yumlệnh để cài đặt. Sau khi cài đặt thành công, hãy thực hiệnsvn --version chỉ huy.
[jerry@CentOS ~]$ su - Password: [root@CentOS ~]# yum install subversion [jerry@CentOS ~]$ svn --version
svn, version 1.6.11 (r934486)
compiled Jun 23 2012, 00:44:03
Và nếu bạn đang sử dụng GNU / Linux dựa trên Debian, thì hãy sử dụng apt lệnh để cài đặt.
[jerry@Ubuntu]$ sudo apt-get update [sudo] password for jerry: [jerry@Ubuntu]$ sudo apt-get install subversion
[jerry@Ubuntu]$ svn --version
svn, version 1.7.5 (r1336830)
compiled Jun 21 2013, 22:11:49
Thiết lập Apache
Chúng ta đã thấy cách cài đặt ứng dụng khách Subversion trên GNU / Linux. Hãy để chúng tôi xem cách tạo một kho lưu trữ mới và cho phép người dùng truy cập.
Trên máy chủ, chúng tôi phải cài đặt Apache httpd mô-đun và svnadmin dụng cụ.
[jerry@CentOS ~]$ su -
Password:
[root@CentOS ~]# yum install mod_dav_svn subversion
Các mod_dav_svn gói cho phép truy cập vào kho lưu trữ bằng HTTP, thông qua máy chủ Apache httpd và subversion gói cài đặt công cụ svnadmin.
Subversion đọc cấu hình của nó từ /etc/httpd/conf.d/subversion.conftập tin. Sau khi thêm cấu hình,subversion.conf tệp trông như sau:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
<Location /svn>
DAV svn
SVNParentPath /var/www/svn
AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /etc/svn-users
Require valid-user
</Location>
Hãy để chúng tôi tạo người dùng Subversion và cấp cho họ quyền truy cập vào kho lưu trữ. Lệnh htpasswd được sử dụng để tạo và cập nhật các tệp văn bản thuần túy được sử dụng để lưu trữ tên người dùng và mật khẩu để xác thực cơ bản của người dùng HTTP. Tùy chọn '-c' tạo tệp mật khẩu , nếu tệp mật khẩu đã tồn tại, nó sẽ bị ghi đè. Đó là lý do tại sao chỉ sử dụng tùy chọn '-c' trong lần đầu tiên. Tùy chọn '-m' cho phép mã hóa MD5 cho mật khẩu.
Thiết lập người dùng
Hãy để chúng tôi tạo người dùng tom.
[root@CentOS ~]# htpasswd -cm /etc/svn-users tom
New password:
Re-type new password:
Adding password for user tom
Hãy để chúng tôi tạo người dùng jerry
[root@CentOS ~]# htpasswd -m /etc/svn-users jerry
New password:
Re-type new password:
Adding password for user jerry
[root@CentOS ~]#
Tạo thư mục mẹ Subversion để lưu trữ tất cả công việc (xem /etc/httpd/conf.d/subversion.conf ).
[root@CentOS ~]# mkdir /var/www/svn
[root@CentOS ~]# cd /var/www/svn/
Thiết lập kho lưu trữ
Tạo một kho lưu trữ dự án có tên là project_repo . lệnh svnadmin sẽ tạo một kho lưu trữ mới và một vài thư mục khác bên trong đó để lưu trữ siêu dữ liệu.
[root@CentOS svn]# svnadmin create project_repo
[root@CentOS svn]# ls -l project_repo
total 24
drwxr-xr-x. 2 root root 4096 Aug 4 22:30 conf
drwxr-sr-x. 6 root root 4096 Aug 4 22:30 db
-r--r--r--. 1 root root 2 Aug 4 22:30 format
drwxr-xr-x. 2 root root 4096 Aug 4 22:30 hooks
drwxr-xr-x. 2 root root 4096 Aug 4 22:30 locks
-rw-r--r--. 1 root root 229 Aug 4 22:30 README.txt
Hãy để chúng tôi thay đổi người dùng và quyền sở hữu nhóm của kho lưu trữ.
[root@CentOS svn]# chown -R apache.apache project_repo/
Kiểm tra xem SELinux có được bật hay không bằng cách sử dụng công cụ trạng thái SELinux.
[root@CentOS svn]# sestatus
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
Đối với máy chủ của chúng tôi, SELinux đã được bật, vì vậy chúng tôi phải thay đổi bối cảnh bảo mật của SELinux.
[root@CentOS svn]# chcon -R -t httpd_sys_content_t /var/www/svn/project_repo/
Để cho phép các cam kết qua HTTP, hãy thực hiện lệnh sau.
[root@CentOS svn]# chcon -R -t httpd_sys_rw_content_t /var/www/svn/project_repo/
Khởi động lại máy chủ Apache và chúng ta đã hoàn tất việc cấu hình máy chủ Apache.
[root@CentOS svn]# service httpd restart
Stopping httpd: [FAILED]
Starting httpd: httpd: apr_sockaddr_info_get() failed for CentOS
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
[ OK ]
[root@CentOS svn]# service httpd status
httpd (pid 1372) is running...
[root@CentOS svn]#
Chúng tôi đã cấu hình máy chủ Apache thành công, bây giờ chúng tôi sẽ cấu hình kho lưu trữ. Để cung cấp quyền truy cập vào kho lưu trữ chỉ cho người dùng đích thực và sử dụng tệp ủy quyền mặc định; nối các dòng sau vào tệp project_repo / conf / svnserve.conf .
anon-access = none
authz-db = authz
Thông thường, mọi dự án Subversion đều có trunk, tags, và branches thư mục trực tiếp dưới thư mục gốc của dự án.
Các thân cây là một thư mục nơi mà tất cả sự phát triển chính xảy ra và thường được kiểm tra ra bởi các nhà phát triển để làm việc trên dự án.
Thư mục thẻ được sử dụng để lưu trữ các ảnh chụp nhanh có tên của dự án. Khi tạo bản phát hành sản xuất, nhóm sẽ gắn thẻ mã đi vào bản phát hành.
Thư mục các nhánh được sử dụng khi bạn muốn theo đuổi các dòng phát triển khác nhau.
Hãy để chúng tôi tạo cấu trúc thư mục thân, thẻ và chi nhánh trong kho dự án.
[root@CentOS svn]# mkdir /tmp/svn-template
[root@CentOS svn]# mkdir /tmp/svn-template/trunk
[root@CentOS svn]# mkdir /tmp/svn-template/branches
[root@CentOS svn]# mkdir /tmp/svn-template/tags
Bây giờ nhập các thư mục từ /tmp/svn-template vào kho lưu trữ.
[root@CentOS svn]# svn import -m 'Create trunk, branches, tags directory structure' /tmp/svn-template/
Adding /tmp/svn-template/trunk
Adding /tmp/svn-template/branches
Adding /tmp/svn-template/tags
Committed revision 1.
[root@CentOS svn]#
Xong rồi! Chúng tôi đã tạo thành công kho lưu trữ và cho phép truy cập vàoTom và Jerry. Từ bây giờ, họ có thể thực hiện tất cả các hoạt động được hỗ trợ đối với kho lưu trữ.
Vòng đời của Hệ thống Kiểm soát Phiên bản được thảo luận trong chương này. Trong các chương sau, chúng ta sẽ thấy lệnh Subversion cho mỗi thao tác.
Tạo kho lưu trữ:
Kho lưu trữ là nơi trung tâm, nơi các nhà phát triển lưu trữ tất cả công việc của họ. Kho lưu trữ không chỉ lưu trữ các tệp mà còn cả lịch sử về các thay đổi. Có nghĩa là nó duy trì lịch sử các thay đổi được thực hiện trong các tệp.
Thao tác 'tạo' được sử dụng để tạo một kho lưu trữ mới. Hầu hết các lần thao tác này chỉ được thực hiện một lần. Khi bạn tạo một kho lưu trữ mới, VCS của bạn sẽ yêu cầu bạn nói điều gì đó để xác định nó, chẳng hạn như nơi bạn muốn nó được tạo hoặc tên nào nên được đặt cho kho lưu trữ.
Thủ tục thanh toán
Thao tác 'Checkout' được sử dụng để tạo bản sao hoạt động từ kho lưu trữ. Bản sao làm việc là một nơi làm việc riêng tư, nơi các nhà phát triển thực hiện các thay đổi của họ và sau đó, gửi những thay đổi này đến kho lưu trữ.
Cập nhật
Như tên cho thấy, hoạt động 'cập nhật' được sử dụng để cập nhật bản sao làm việc. Thao tác này đồng bộ hóa bản sao làm việc với kho lưu trữ. Vì kho lưu trữ được chia sẻ bởi tất cả các nhóm, các nhà phát triển khác có thể cam kết các thay đổi của họ và bản sao làm việc của bạn trở nên cũ hơn.
Giả sử Tom và Jerry là hai nhà phát triển làm việc trong một dự án. Cả hai đều kiểm tra phiên bản mới nhất từ kho lưu trữ và bắt đầu hoạt động. Tại thời điểm này, các bản sao làm việc của chúng đã được đồng bộ hóa hoàn toàn với kho lưu trữ. Jerry hoàn thành công việc của mình rất hiệu quả và cam kết những thay đổi của anh ấy đối với kho lưu trữ.
Bây giờ bản sao làm việc của Tom đã lỗi thời. Thao tác cập nhật sẽ kéo các thay đổi mới nhất của Jerry từ kho lưu trữ và sẽ cập nhật bản sao làm việc của Tom .
Thực hiện các thay đổi
Sau khi thanh toán, người ta có thể thực hiện các thao tác khác nhau để thực hiện các thay đổi. Chỉnh sửa là thao tác phổ biến nhất. Người ta có thể chỉnh sửa tệp hiện có để thêm / bớt nội dung khỏi tệp.
Người ta có thể thêm tệp / thư mục. Nhưng ngay lập tức các tệp / thư mục này không trở thành một phần của kho lưu trữ, thay vào đó chúng được thêm vào danh sách thay đổi đang chờ xử lý và trở thành một phần của kho lưu trữ sau hoạt động cam kết.
Tương tự, người ta có thể xóa các tệp / thư mục. Thao tác xóa ngay lập tức xóa tệp khỏi bản sao đang làm việc, nhưng việc xóa tệp thực sự được thêm vào danh sách thay đổi đang chờ xử lý và các thay đổi được thực hiện đối với kho lưu trữ sau hoạt động cam kết.
Thao tác 'Đổi tên' thay đổi tên của tệp / thư mục. Thao tác 'Move' được sử dụng để di chuyển tệp / thư mục từ nơi này sang nơi khác trong cây kho lưu trữ.
Xem lại các thay đổi
Khi bạn kiểm tra bản sao làm việc hoặc cập nhật bản sao làm việc, thì bản sao làm việc của bạn được đồng bộ hóa hoàn toàn với kho lưu trữ. Nhưng khi bạn thực hiện các thay đổi đối với bản sao làm việc của mình, bản sao đó sẽ trở nên mới hơn so với kho lưu trữ. Và bạn nên xem lại các thay đổi của mình trước khi thực hiện thao tác 'cam kết'.
Thao tác 'Trạng thái' liệt kê các sửa đổi đã được thực hiện đối với bản sao làm việc. Như chúng tôi đã đề cập trước đây, bất cứ khi nào bạn thực hiện thay đổi trong bản sao hoạt động, tất cả những thay đổi này sẽ trở thành một phần của danh sách thay đổi đang chờ xử lý. Và thao tác 'trạng thái' được sử dụng để xem danh sách thay đổi đang chờ xử lý.
Thao tác 'Trạng thái' chỉ cung cấp danh sách các thay đổi nhưng không cung cấp thông tin chi tiết về chúng. Người ta có thể sử dụng thao tác khác để xem chi tiết các sửa đổi đã được thực hiện đối với bản sao làm việc.
Sửa lỗi
Giả sử một người đã thực hiện các thay đổi đối với bản sao làm việc của mình, nhưng bây giờ, anh ta muốn loại bỏ những thay đổi này. Trong tình huống này, thao tác 'hoàn nguyên' sẽ hữu ích.
Thao tác hoàn nguyên hoàn nguyên các sửa đổi đã được thực hiện đối với bản sao làm việc. Có thể hoàn nguyên một hoặc nhiều tệp / thư mục. Ngoài ra, có thể hoàn nguyên toàn bộ bản sao làm việc. Trong trường hợp này, thao tác 'hoàn nguyên' sẽ phá hủy danh sách thay đổi đang chờ xử lý và đưa bản sao hoạt động trở lại trạng thái ban đầu.
Giải quyết xung đột:
Xung đột có thể xảy ra tại thời điểm hợp nhất. Thao tác 'Hợp nhất' tự động xử lý mọi thứ có thể được thực hiện một cách an toàn. Mọi thứ khác được coi là xung đột. Ví dụ: tệp "hello.c" đã được sửa đổi trong nhánh và bị xóa trong nhánh khác. Tình huống như vậy cần một người đưa ra quyết định. Thao tác 'giải quyết' được sử dụng để giúp người dùng tìm ra mọi thứ và thông báo cho VCS về các cách xử lý xung đột.
Cam kết thay đổi
Thao tác 'cam kết' được sử dụng để áp dụng các thay đổi từ bản sao làm việc cho kho lưu trữ. Thao tác này sửa đổi kho lưu trữ và các nhà phát triển khác có thể thấy những thay đổi này bằng cách cập nhật bản sao làm việc của họ.
Trước khi commit, người ta phải thêm tệp / thư mục vào danh sách thay đổi đang chờ xử lý. Đây là nơi mà các thay đổi chờ đợi được cam kết. Với cam kết, chúng tôi thường cung cấp thông báo nhật ký để giải thích lý do tại sao ai đó thực hiện thay đổi. Thông báo nhật ký này trở thành một phần của lịch sử của kho lưu trữ. Cam kết là một hoạt động nguyên tử, có nghĩa là toàn bộ cam kết thành công hoặc nó được khôi phục lại. Người dùng không bao giờ thấy cam kết đã hoàn thành một nửa.
Subversion cung cấp thanh toán lệnh để kiểm tra một bản sao làm việc kể từ một kho lưu trữ. Lệnh dưới đây sẽ tạo một thư mục mới trong thư mục làm việc hiện tại với tên là project_repo . Đừng bận tâm về URL của kho lưu trữ, vì hầu hết thời gian, nó đã được cung cấp bởi quản trị viên lật đổ với quyền truy cập thích hợp.
[tom@CentOS ~]$ svn checkout http://svn.server.com/svn/project_repo --username=tom
Lệnh trên sẽ cho kết quả như sau.
A project_repo/trunk
A project_repo/branches
A project_repo/tags
Checked out revision 1.
Sau mỗi thao tác thanh toán thành công, số sửa đổi sẽ được in. Nếu bạn muốn xem thêm thông tin về kho lưu trữ, hãy thực hiện lệnh thông tin .
[tom@CentOS trunk]$ pwd
/home/tom/project_repo/trunk
[tom@CentOS trunk]$ svn info
Lệnh trên sẽ cho kết quả như sau.
Path: .
URL: http://svn.server.com/svn/project_repo/trunk
Repository Root: http://svn.server.com/svn/project_repo
Repository UUID: 7ceef8cb-3799-40dd-a067-c216ec2e5247
Revision: 1
Node Kind: directory
Schedule: normal
Last Changed Author: jerry
Last Changed Rev: 0
Last Changed Date: 2013-08-24 18:15:52 +0530 (Sat, 24 Aug 2013)
[tom@CentOS trunk]$
Jerry kiểm tra phiên bản mới nhất của kho lưu trữ và bắt đầu làm việc với một dự án. Anh ta tạo tệp array.c bên trong thư mục thân cây.
[jerry@CentOS ~]$ cd project_repo/trunk/ [jerry@CentOS trunk]$ cat array.c
Lệnh trên sẽ cho kết quả như sau.
#include <stdio.h>
#define MAX 16
int main(void) {
int i, n, arr[MAX];
printf("Enter the total number of elements: ");
scanf("%d", &n);
printf("Enter the elements\n");
for (i = 0; i < n; ++i) scanf("%d", &arr[i]);
printf("Array has following elements\n");
for (i = 0; i < n; ++i) printf("|%d| ", arr[i]);
printf("\n");
return 0;
}
Anh ta muốn kiểm tra mã của mình trước khi cam kết.
[jerry@CentOS trunk]$ make array cc array.c -o array [jerry@CentOS trunk]$ ./array
Enter the total number of elements: 5
Enter the elements
1
2
3
4
5
Array has following elements
|1| |2| |3| |4| |5|
Anh ấy đã biên dịch và thử nghiệm mã của mình và mọi thứ đang hoạt động như mong đợi, bây giờ đã đến lúc thực hiện các thay đổi.
[jerry@CentOS trunk]$ svn status
? array.c
? array
Subversion đang hiển thị '?' trước tên tệp vì nó không biết phải làm gì với những tệp này.
Trước khi commit, Jerry cần thêm tệp này vào danh sách thay đổi đang chờ xử lý.
[jerry@CentOS trunk]$ svn add array.c
A array.c
Hãy để chúng tôi kiểm tra nó với hoạt động 'trạng thái'. Các chương trình lật đổAtrước array.c , điều đó có nghĩa là tệp đã được thêm thành công vào danh sách thay đổi đang chờ xử lý.
[jerry@CentOS trunk]$ svn status
? array
A array.c
Để lưu trữ tệp array.c vào kho lưu trữ, hãy sử dụng lệnh cam kết với tùy chọn -m theo sau là thông báo cam kết. Nếu bạn bỏ qua -m tùy chọn Subversion sẽ hiển thị trình soạn thảo văn bản, nơi bạn có thể nhập một tin nhắn nhiều dòng.
[jerry@CentOS trunk]$ svn commit -m "Initial commit"
Adding trunk/array.c
Transmitting file data .
Committed revision 2.
Bây giờ tệp array.c đã được thêm vào kho lưu trữ thành công và số bản sửa đổi được tăng thêm một.
Jerry đã thêm tệp array.c vào kho lưu trữ. Tom cũng kiểm tra mã mới nhất và bắt đầu hoạt động.
[tom@CentOS ~]$ svn co http://svn.server.com/svn/project_repo --username=tom
Lệnh trên sẽ cho kết quả như sau.
A project_repo/trunk
A project_repo/trunk/array.c
A project_repo/branches
A project_repo/tags
Checked out revision 2.
Nhưng, anh ấy phát hiện ra rằng ai đó đã thêm mã. Vì vậy, anh ấy tò mò về việc ai đã làm điều đó và anh ấy kiểm tra thông báo nhật ký để xem thêm chi tiết bằng lệnh sau:
[tom@CentOS trunk]$ svn log
Lệnh trên sẽ cho kết quả như sau.
------------------------------------------------------------------------
r2 | jerry | 2013-08-17 20:40:43 +0530 (Sat, 17 Aug 2013) | 1 line
Initial commit
------------------------------------------------------------------------
r1 | jerry | 2013-08-04 23:43:08 +0530 (Sun, 04 Aug 2013) | 1 line
Create trunk, branches, tags directory structure
------------------------------------------------------------------------
Khi Tom quan sát mã của Jerry , anh ấy ngay lập tức nhận thấy một lỗi trong đó. Jerry đã không kiểm tra tràn mảng, điều này có thể gây ra sự cố nghiêm trọng. Vì vậy, Tom quyết định khắc phục sự cố này. Sau khi sửa đổi, array.c sẽ như thế này.
#include <stdio.h>
#define MAX 16
int main(void)
{
int i, n, arr[MAX];
printf("Enter the total number of elements: ");
scanf("%d", &n);
/* handle array overflow condition */
if (n > MAX) {
fprintf(stderr, "Number of elements must be less than %d\n", MAX);
return 1;
}
printf("Enter the elements\n");
for (i = 0; i < n; ++i)
scanf("%d", &arr[i]);
printf("Array has following elements\n");
for (i = 0; i < n; ++i)
printf("|%d| ", arr[i]);
printf("\n");
return 0;
}
Tom muốn sử dụng thao tác trạng thái để xem danh sách thay đổi đang chờ xử lý.
[tom@CentOS trunk]$ svn status
M array.c
Tệp array.c được sửa đổi, đó là lý do Subversion hiển thịMchữ cái trước tên tệp. Tiếp theo Tom biên dịch và kiểm tra mã của mình và nó đang hoạt động tốt. Trước khi thực hiện các thay đổi, anh ấy muốn kiểm tra kỹ nó bằng cách xem lại các thay đổi mà anh ấy đã thực hiện.
[tom@CentOS trunk]$ svn diff
Index: array.c
===================================================================
--- array.c (revision 2)
+++ array.c (working copy)
@@ -9,6 +9,11 @@
printf("Enter the total number of elements: ");
scanf("%d", &n);
+ if (n > MAX) {
+ fprintf(stderr, "Number of elements must be less than %d\n", MAX);
+ return 1;
+ }
+
printf("Enter the elements\n");
for (i = 0; i < n; ++i)
Tom đã thêm một vài dòng trong tệp array.c , đó là lý do tại sao Subversion hiển thị + ký trước dòng mới. Bây giờ anh ấy đã sẵn sàng để thực hiện những thay đổi của mình.
[tom@CentOS trunk]$ svn commit -m "Fix array overflow problem"
Lệnh trên sẽ cho kết quả như sau.
Sending trunk/array.c
Transmitting file data .
Committed revision 3.
Các thay đổi của Tom được cam kết thành công vào kho lưu trữ.
Jerry đã sử dụng phiên bản đầu tiên của mã. Nhưng anh ấy nghĩ rằng anh ấy nên viết hai hàm để chấp nhận đầu vào và hiển thị nội dung mảng. Sau khi sửa đổi, array.c trông như sau.
#include <stdio.h>
#define MAX 16
void accept_input(int *arr, int n) {
int i;
for (i = 0; i < n; ++i)
scanf("%d", &arr[i]);
}
void display(int *arr, int n) {
int i;
for (i = 0; i < n; ++i)
printf("|%d| ", arr[i]);
printf("\n");
}
int main(void) {
int i, n, arr[MAX];
printf("Enter the total number of elements: ");
scanf("%d", &n);
printf("Enter the elements\n");
accept_input(arr, n);
printf("Array has following elements\n");
display(arr, n);
return 0;
}
Jerry biên dịch và kiểm tra mã của mình và sẵn sàng thực hiện các thay đổi. Trước đó, anh ta muốn xem lại các thay đổi bằng lệnh sau.
[jerry@CentOS trunk]$ svn diff
Lệnh trên sẽ cho kết quả như sau.
Index: array.c
===================================================================
--- array.c (revision 2)
+++ array.c (working copy)
@@ -2,6 +2,24 @@
#define MAX 16
+void accept_input(int *arr, int n)
+{
+ int i;
+
+ for (i = 0; i & n; ++i)
+ scanf("%d", &arr[i]);
+}
+
+void display(int *arr, int n)
+{
+ int i;
+
+ for (i = 0; i < n; ++i)
+ printf("|%d| ", arr[i]);
+
+ printf("\n");
+}
+
int main(void)
{
int i, n, arr[MAX];
@@ -10,15 +28,10 @@
scanf("%d", &n);
printf("Enter the elements\n");
+ accept_input(arr, n);
- for (i = 0; i < n; ++i)
- scanf("%d", &arr[i]);
-
printf("Array has following elements\n");
- for (i = 0; i < n; ++i)
- printf("|%d| ", arr[i]);
-
- printf("\n");
+ display(arr, n);
return 0;
}
Đối với các dòng mới được thêm vào, Subversion hiển thị + ký trước dòng và đối với dòng đã xóa nó sẽ hiển thị -ký tên. Bây giờ, Jerry cố gắng thực hiện các thay đổi bằng lệnh sau:
[jerry@CentOS trunk]$ svn commit -m "Add function to accept input and to display array contents"
Lệnh trên sẽ cho kết quả như sau.
Sending trunk/array.c
svn: Commit failed (details follow):
svn: File or directory 'array.c' is out of date; try updating
svn: resource out of date; try updating
Subversion không cho phép thực hiện các thay đổi của Jerry , vì Tom đã sửa đổi kho lưu trữ và bản sao làm việc của Jerry đã lỗi thời. Để tránh ghi đè các thay đổi của nhau, Subversion không thực hiện được thao tác này. Jerry phải cập nhật bản sao làm việc trước khi thực hiện các thay đổi của mình. Vì vậy, anh ta sử dụng lệnh cập nhật như hình dưới đây.
[jerry@CentOS trunk]$ svn update
G array.c
Updated to revision 3.
Subversion đang hiển thị bức thư G trước tên tệp, có nghĩa là tệp này đã được hợp nhất.
[jerry@CentOS trunk]$ svn diff
Lệnh trên sẽ cho kết quả như sau.
Index: array.c
===================================================================
--- array.c (revision 3)
+++ array.c (working copy)
@@ -2,6 +2,24 @@
#define MAX 16
+void accept_input(int *arr, int n)
+{
+ int i;
+
+ for (i = 0; i < n; ++i)
+ scanf("%d", &arr[i]);
+}
+
+void display(int *arr, int n)
+{
+ int i;
+
+ for (i = 0; i < n; ++i)
+ printf("|%d| ", arr[i]);
+
+ printf("\n");
+}
+
int main(void)
{
int i, n, arr[MAX];
@@ -15,15 +33,10 @@
}
printf("Enter the elements\n");
+ accept_input(arr, n);
- for (i = 0; i < n; ++i)
- scanf("%d", &arr[i]);
-
printf("Array has following elements\n");
- for (i = 0; i < n; ++i)
- printf("|%d| ", arr[i]);
-
- printf("\n");
+ display(arr, n);
return 0;
}
Subversion chỉ hiển thị các thay đổi của Jerry , nhưng tệp array.c đã được hợp nhất. Nếu bạn quan sát kỹ, Subversion hiện đang hiển thị bản sửa đổi số 3. Trong đầu ra trước đó, nó đang hiển thị bản sửa đổi số 2. Chỉ cần xem lại ai đã thực hiện thay đổi trong tệp và cho mục đích gì.
jerry@CentOS trunk]$ svn log
------------------------------------------------------------------------
r3 | tom | 2013-08-18 20:21:50 +0530 (Sun, 18 Aug 2013) | 1 line
Fix array overflow problem
------------------------------------------------------------------------
r2 | jerry | 2013-08-17 20:40:43 +0530 (Sat, 17 Aug 2013) | 1 line
Initial commit
------------------------------------------------------------------------
r1 | jerry | 2013-08-04 23:43:08 +0530 (Sun, 04 Aug 2013) | 1 line
Create trunk, branches, tags directory structure
------------------------------------------------------------------------
Giờ đây , bản sao làm việc của Jerry đã được đồng bộ hóa với kho lưu trữ và anh ấy có thể cam kết các thay đổi của mình một cách an toàn.
[jerry@CentOS trunk]$ svn commit -m "Add function to accept input and to display array contents"
Sending trunk/array.c
Transmitting file data .
Committed revision 4.
Giả sử Jerry vô tình sửa đổi tệp array.c và anh ta đang gặp lỗi biên dịch. Bây giờ anh ấy muốn vứt bỏ những thay đổi. Trong tình huống này, thao tác 'hoàn nguyên' sẽ hữu ích. Thao tác hoàn nguyên sẽ hoàn tác mọi thay đổi cục bộ đối với tệp hoặc thư mục và giải quyết mọi trạng thái xung đột.
[jerry@CentOS trunk]$ svn status
Lệnh trên sẽ cho kết quả như sau.
M array.c
Hãy thử tạo mảng như sau:
[jerry@CentOS trunk]$ make array
Lệnh trên sẽ cho kết quả như sau.
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
Jerry thực hiện thao tác 'hoàn nguyên' trên tệp array.c .
[jerry@CentOS trunk]$ svn revert array.c
Reverted 'array.c'
[jerry@CentOS trunk]$ svn status [jerry@CentOS trunk]$
Bây giờ biên dịch mã.
[jerry@CentOS trunk]$ make array
cc array.c -o array
Sau khi hoạt động hoàn nguyên, bản sao làm việc của anh ta trở lại trạng thái ban đầu. Thao tác hoàn nguyên có thể hoàn nguyên một tệp cũng như một thư mục hoàn chỉnh. Để hoàn nguyên một thư mục, hãy sử dụng tùy chọn -R như hình dưới đây.
[jerry@CentOS project_repo]$ pwd
/home/jerry/project_repo
[jerry@CentOS project_repo]$ svn revert -R trunk
Cho đến bây giờ, chúng ta đã thấy cách hoàn nguyên các thay đổi đã được tạo thành bản sao đang hoạt động. Nhưng nếu bạn muốn hoàn nguyên một bản sửa đổi đã cam kết! Công cụ Hệ thống Kiểm soát Phiên bản không cho phép xóa lịch sử khỏi kho lưu trữ. Chúng tôi chỉ có thể thêm lịch sử. Nó sẽ xảy ra ngay cả khi bạn xóa tệp khỏi kho lưu trữ. Để hoàn tác một bản sửa đổi cũ, chúng tôi phải đảo ngược bất kỳ thay đổi nào đã được thực hiện trong bản sửa đổi cũ và sau đó thực hiện một bản sửa đổi mới. Đây được gọi là hợp nhất ngược.
Giả sử Jerry thêm mã cho hoạt động tìm kiếm tuyến tính. Sau khi xác minh, anh ta cam kết những thay đổi của mình.
[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.
Jerry tò mò về những gì Tom đang làm. Vì vậy, anh ta kiểm tra các thông báo nhật ký Subversion.
[jerry@CentOS trunk]$ svn log
Lệnh trên sẽ cho kết quả như sau.
------------------------------------------------------------------------
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
Sau khi xem các tin nhắn nhật ký, Jerry nhận ra rằng mình đã phạm một sai lầm nghiêm trọng. Bởi vì Tom đã triển khai hoạt động tìm kiếm nhị phân, tốt hơn so với tìm kiếm tuyến tính; mã của anh ta là thừa, và bây giờ Jerry phải hoàn nguyên các thay đổi của mình về bản sửa đổi trước đó. Vì vậy, trước tiên hãy tìm bản sửa đổi hiện tại của kho lưu trữ. Hiện tại, kho lưu trữ đang ở bản sửa đổi 22 và chúng tôi phải hoàn nguyên nó về bản sửa đổi trước đó, tức là bản sửa đổi 21.
[jerry@CentOS trunk]$ svn up
At revision 22.
[jerry@CentOS trunk]$ svn merge -r 22:21 array.c --- Reverse-merging r22 into 'array.c': U array.c [jerry@CentOS trunk]$ svn commit -m "Reverted to revision 21"
Sending trunk/array.c
Transmitting file data .
Committed revision 23.
Tom quyết định thêm tệp README cho dự án của họ. Vì vậy, anh ta tạo tệp README và thêm danh sách VIỆC LÀM vào đó. Sau khi thêm điều này, kho lưu trữ tệp ở phiên bản 6.
[tom@CentOS trunk]$ cat README /* TODO: Add contents in README file */ [tom@CentOS trunk]$ svn status
? README
[tom@CentOS trunk]$ svn add README A README [tom@CentOS trunk]$ svn commit -m "Added README file. Will update it's content in future."
Adding trunk/README
Transmitting file data .
Committed revision 6.
Jerry kiểm tra mã mới nhất ở phiên bản 6. Và ngay lập tức anh ấy bắt đầu làm việc. Sau một vài giờ, Tom cập nhật tệp README và cam kết các thay đổi của mình. README đã sửa đổi sẽ trông như thế này.
[tom@CentOS trunk]$ cat README * Supported operations: 1) Accept input 2) Display array elements [tom@CentOS trunk]$ svn status
M README
[tom@CentOS trunk]$ svn commit -m "Added supported operation in README"
Sending trunk/README
Transmitting file data .
Committed revision 7.
Bây giờ, kho lưu trữ đang ở bản sửa đổi 7 và bản sao làm việc của Jerry đã lỗi thời. Jerry cũng cập nhật tệp README và cố gắng thực hiện các thay đổi của mình.
Tệp README của Jerry trông như thế này.
[jerry@CentOS trunk]$ cat README
* File list
1) array.c Implementation of array operation.
2) README Instructions for user.
[jerry@CentOS trunk]$ svn status M README [jerry@CentOS trunk]$ svn commit -m "Updated README"
Sending trunk/README
svn: Commit failed (details follow):
svn: File or directory 'README' is out of date; try updating
svn: resource out of date; try updating
Bước 1: Xem xung đột
Subversion đã phát hiện ra rằng tệp README đã thay đổi kể từ lần cập nhật cuối cùng. Vì vậy, Jerry phải cập nhật bản sao làm việc của mình.
[jerry@CentOS trunk]$ svn up
Conflict discovered in 'README'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options:
Subversion đang phàn nàn rằng có xung đột với tệp README và Subversion không biết cách giải quyết vấn đề này. Vì vậy, Jerry chọn tùy chọn df để xem xét xung đột.
[jerry@CentOS trunk]$ svn up
Conflict discovered in 'README'.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: df
--- .svn/text-base/README.svn-base Sat Aug 24 18:07:13 2013
+++ .svn/tmp/README.tmp Sat Aug 24 18:13:03 2013
@@ -1 +1,11 @@
-/* TODO: Add contents in README file */
+<<<<<<< .mine
+* File list
+
+1) array.c Implementation of array operation.
+2) README Instructions for user.
+=======
+* Supported operations:
+
+1) Accept input
+2) Display array elements
+>>>>>>> .r7
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options:
Bước 2: Hoãn xung đột
Tiếp theo Jerry chọn các tùy chọn hoãn (p) để anh ta có thể giải quyết xung đột.
Select: (p) postpone, (df) diff-full, (e) edit, (r) resolved,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options: p
C README
Updated to revision 7.
Summary of conflicts:
Text conflicts: 1
Sau khi mở README trong trình soạn thảo văn bản, anh ta nhận ra rằng Subversion đã bao gồm cả mã của Tom và mã của anh ta với các dấu xung đột.
[jerry@CentOS trunk]$ cat README
<<<<<<< .min
* File list
1) array.c Implementation of array operation.
2) README Instructions for user.
=======
* Supported operations:
1) Accept input
2) Display array elements
>>>>>>> .r7
Jerry muốn những thay đổi của Tom cũng như của anh ta, vì vậy anh ta chỉ cần loại bỏ các dòng có chứa các dấu hiệu xung đột.
Vì vậy, README đã sửa đổi sẽ trông như thế này.
[jerry@CentOS trunk]$ cat README
* File list
1) array.c Implementation of array operation.
2) README Instructions for user.
* Supported operations:
1) Accept input
2) Display array elements
Jerry giải quyết xung đột và anh ta thử lại cam kết.
[jerry@CentOS trunk]$ svn commit -m "Updated README" svn: Commit failed (details follow): svn: Aborting commit: '/home/jerry/project_repo/trunk/README' remains in conflict [jerry@CentOS trunk]$ svn status
? README.r6
? README.r7
? README.mine
C README
Bước 3: Giải quyết xung đột
Trong cam kết trên, thư Cchỉ ra rằng có xung đột trong tệp README. Jerry giải quyết xung đột nhưng không nói với Subversion rằng anh đã giải quyết xong xung đột. Anh ta sử dụng lệnh giải quyết để thông báo cho Subversion về cách giải quyết xung đột.
[jerry@CentOS trunk]$ svn resolve --accept=working README Resolved conflicted state of 'README' [jerry@CentOS trunk]$ svn status
M README
[jerry@CentOS trunk]$ svn commit -m "Updated README"
Sending trunk/README
Transmitting file data .
Committed revision 8.
Hệ thống kiểm soát phiên bản hỗ trợ hoạt động thẻ bằng cách sử dụng khái niệm đó mà người ta có thể đặt tên có ý nghĩa cho một phiên bản cụ thể của mã. Thẻ cho phép đặt tên mô tả và dễ nhớ cho phiên bản mã cụ thể. Ví dụBASIC_ARRAY_OPERATIONS đáng nhớ hơn revision 4.
Hãy để chúng tôi xem hoạt động thẻ với một ví dụ. Tom quyết định tạo một thẻ để anh ta có thể truy cập mã dễ dàng hơn.
[tom@CentOS project_repo]$ svn copy --revision=4 trunk/ tags/basic_array_operations
Lệnh trên sẽ cho kết quả như sau.
A tags/basic_array_operations/array.c
Updated to revision 4.
A tags/basic_array_operations
Sau khi hoàn thành thành công, thư mục mới sẽ được tạo bên trong thư mục thẻ .
[tom@CentOS project_repo]$ ls -l tags/
total 4
drwxrwxr-x. 3 tom tom 4096 Aug 24 18:18 basic_array_operations
Tom muốn kiểm tra kỹ nó trước khi commit. Hoạt động trạng thái cho thấy rằng hoạt động thẻ thành công, vì vậy anh ta có thể thực hiện các thay đổi của mình một cách an toàn.
[tom@CentOS project_repo]$ svn status
A + tags/basic_array_operations
[tom@CentOS project_repo]$ svn commit -m "Created tag for basic array operations"
Adding tags/basic_array_operations
Committed revision 5.
Hoạt động của chi nhánh tạo ra một dòng phát triển khác. Nó rất hữu ích khi ai đó muốn quá trình phát triển rẽ sang hai hướng khác nhau. Giả sử bạn đã phát hành sản phẩm phiên bản 1.0, bạn có thể muốn tạo nhánh mới để quá trình phát triển 2.0 có thể tách biệt với các bản sửa lỗi 1.0.
Trong phần này, chúng ta sẽ xem cách tạo, duyệt và hợp nhất nhánh. Jerry không hài lòng vì xung đột nên quyết định thành lập một chi nhánh riêng mới.
[jerry@CentOS project_repo]$ ls
branches tags trunk
[jerry@CentOS project_repo]$ svn copy trunk branches/jerry_branch A branches/jerry_branch [jerry@CentOS project_repo]$ svn status
A + branches/jerry_branch
[jerry@CentOS project_repo]$ svn commit -m "Jerry's private branch" Adding branches/jerry_branch Adding branches/jerry_branch/README Committed revision 9. [jerry@CentOS project_repo]$
Bây giờ Jerry đang làm việc trong chi nhánh tư nhân của mình. Anh ta thêm thao tác sắp xếp cho mảng. Mã sửa đổi của Jerry trông như thế này.
[jerry@CentOS project_repo]$ cd branches/jerry_branch/ [jerry@CentOS jerry_branch]$ cat array.c
Lệnh trên sẽ cho kết quả như sau.
#include <stdio.h>
#define MAX 16
void bubble_sort(int *arr, int n)
{
int i, j, temp, flag = 1;
for (i = 1; i < n && flag == 1; ++i) {
flag = 0;
for (j = 0; j < n - i; ++j) {
if (arr[j] > arr[j + 1]) {
flag = 1;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
void accept_input(int *arr, int n)
{
int i;
for (i = 0; i < n; ++i)
scanf("%d", &arr[i]);
}
void display(int *arr, int n)
{
int i;
for (i = 0; i < n; ++i)
printf("|%d| ", arr[i]);
printf("\n");
}
int main(void)
{
int i, n, key, ret, arr[MAX];
printf("Enter the total number of elements: ");
scanf("%d", &n);
/* Error handling for array overflow */
if (n >MAX) {
fprintf(stderr, "Number of elements must be less than %d\n", MAX);
return 1;
}
printf("Enter the elements\n");
accept_input(arr, n);
printf("Array has following elements\n");
display(arr, n);
printf("Sorted data is\n");
bubble_sort(arr, n);
display(arr, n);
return 0;
}
Jerry biên dịch và kiểm tra mã của mình và sẵn sàng thực hiện các thay đổi của mình.
[jerry@CentOS jerry_branch]$ make array cc array.c -o array [jerry@CentOS jerry_branch]$ ./array
Lệnh trên sẽ cho kết quả như sau.
Enter the total number of elements: 5
Enter the elements
10
-4
2
7
9
Array has following elements
|10| |-4| |2| |7| |9|
Sorted data is
|-4| |2| |7| |9| |10|
[jerry@CentOS jerry_branch]$ svn status ? array M array.c [jerry@CentOS jerry_branch]$ svn commit -m "Added sort operation"
Sending jerry_branch/array.c
Transmitting file data .
Committed revision 10.
Trong khi đó, ở trong thùng xe, Tom quyết định thực hiện hoạt động tìm kiếm. Tom thêm mã cho hoạt động tìm kiếm và mã của anh ấy trông như thế này.
[tom@CentOS trunk]$ svn diff
Lệnh trên sẽ cho kết quả như sau.
Index: array.c
===================================================================
--- array.c (revision 10)
+++ array.c (working copy)
@@ -2,6 +2,27 @@
#define MAX 16
+int bin_search(int *arr, int n, int key)
+{
+ int low, high, mid;
+
+ low = 0;
+ high = n - 1;
+ mid = low + (high - low) / 2;
+
+ while (low <= high) {
+ if (arr[mid] == key)
+ return mid;
+ if (arr[mid] > key)
+ high = mid - 1;
+ else
+ low = mid + 1;
+ mid = low + (high - low) / 2;
+ }
+
+ return -1;
+}
+
void accept_input(int *arr, int n)
{
int i;
@@ -22,7 +43,7 @@
int main(void)
{
- int i, n, arr[MAX];
+ int i, n, ret, key, arr[MAX];
printf("Enter the total number of elements: ");
scanf("%d", &n);
@@ -39,5 +60,16 @@
printf("Array has following elements\n");
display(arr, n);
+ printf("Enter the element to be searched: ");
+ scanf("%d", &key);
+
+ ret = bin_search(arr, n, key);
+ if (ret < 0) {
+ fprintf(stderr, "%d element not present in array\n", key);
+ return 1;
+ }
+
+ printf("%d element found at location %d\n", key, ret + 1);
+
return 0;
}
Sau khi xem xét, anh ấy cam kết những thay đổi của mình.
[tom@CentOS trunk]$ svn status
? array
M array.c
[tom@CentOS trunk]$ svn commit -m "Added search operation"
Sending trunk/array.c
Transmitting file data .
Committed revision 11.
Nhưng Tom tò mò về những gì Jerry đã làm trong chi nhánh tư nhân của mình.
[tom@CentOS trunk]$ cd ../branches/
[tom@CentOS branches]$ svn up A jerry_branch A jerry_branch/array.c A jerry_branch/README [tom@CentOS branches]$ svn log
------------------------------------------------------------------------
r9 | jerry | 2013-08-27 21:56:51 +0530 (Tue, 27 Aug 2013) | 1 line
Added sort operation
------------------------------------------------------------------------
Bằng cách xem thông báo nhật ký của Subversion, Tom thấy rằng Jerry đã thực hiện thao tác 'sắp xếp'. Tom đã triển khai hoạt động tìm kiếm bằng thuật toán tìm kiếm nhị phân, nó luôn mong đợi dữ liệu theo thứ tự được sắp xếp. Nhưng nếu người dùng cung cấp dữ liệu theo thứ tự không được sắp xếp thì sao? Trong tình huống đó, hoạt động tìm kiếm nhị phân sẽ không thành công. Vì vậy, anh quyết định lấy mã của Jerry để sắp xếp dữ liệu trước khi thao tác tìm kiếm. Vì vậy, anh ta yêu cầu Subversion hợp nhất mã từ nhánh của Jerry vào thân cây.
[tom@CentOS trunk]$ pwd /home/tom/project_repo/trunk [tom@CentOS trunk]$ svn merge ../branches/jerry_branch/
--- Merging r9 through r11 into '.':
U array.c
Sau khi hợp nhất, array.c sẽ như thế này.
[tom@CentOS trunk]$ cat array.c
Lệnh trên sẽ cho kết quả như sau.
#include <stdio.h>
#define MAX 16
void bubble_sort(int *arr, int n)
{
int i, j, temp, flag = 1;
for (i = 1; i < n && flag == 1; ++i) {
flag = 0;
for (j = 0; j < n - i; ++j) {
if (arr[j] > arr[j + 1]) {
flag = 1;
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int bin_search(int *arr, int n, int key)
{
int low, high, mid;
low = 0;
high = n - 1;
mid = low + (high - low) / 2;
while (low <= high) {
if (arr[mid] == key)
return mid;
if (arr[mid] > key)
high = mid - 1;
else
low = mid + 1;
mid = low + (high - low) / 2;
}
return -1;
}
void accept_input(int *arr, int n)
{
int i;
for (i = 0; i < n; ++i)
scanf("%d", &arr[i]);
}
void display(int *arr, int n)
{
int i;
for (i = 0; i < n; ++i)
printf("|%d| ", arr[i]);
printf("\n");
}
int main(void)
{
int i, n, ret, key, arr[MAX];
printf("Enter the total number of elements: ");
scanf("%d", &n);
/* Error handling for array overflow */
if (n > MAX) {
fprintf(stderr, "Number of elements must be less than %d\n", MAX);
return 1;
}
printf("Enter the elements\n");
accept_input(arr, n);
printf("Array has following elements\n");
display(arr, n);
printf("Sorted data is\n");
bubble_sort(arr, n);
display(arr, n);
printf("Enter the element to be searched: ");
scanf("%d", &key);
ret = bin_search(arr, n, key);
if (ret < 0) {
fprintf(stderr, "%d element not present in array\n", key);
return 1;
}
printf("%d element found at location %d\n", key, ret + 1);
return 0;
}
Sau khi biên dịch và thử nghiệm, Tom cam kết các thay đổi của mình đối với kho lưu trữ.
[tom@CentOS trunk]$ make array
cc array.c -o array
[tom@CentOS trunk]$ ./array Enter the total number of elements: 5 Enter the elements 10 -2 8 15 3 Array has following elements |10| |-2| |8| |15| |3| Sorted data is |-2| |3| |8| |10| |15| Enter the element to be searched: -2 -2 element found at location 1 [tom@CentOS trunk]$ svn commit -m "Merge changes from Jerry's code"
Sending trunk
Sending trunk/array.c
Transmitting file data .
Committed revision 12.
[tom@CentOS trunk]$