Bằng cách quan sát thông báo log, Tom tìm thấy rằng Jerry thực hiện hoạt động sort. Tom thực
hiện hoạt động search sử dụng thuật toán tìm kiếm nhị phân, nó luôn luôn chắc rằng dữ liệu được
sắp xếp theo thứ tự. Nhưng nếu người sử dụng cung cấp dữ liệu chưa được sắp xếp. Trong tình
huống này, hoạt động search nhị phân sẽ thất bại. Vì thế anh ta quyết định sắp xếp dữ liệu của
Jerry trước khi thực hiện hoạt động search. Do đó anh ta yêu cầu nhập code từ nhánh của Jerry
vào trong thân (trunk).
Bạn đang xem trước 20 trang tài liệu Tài liệu SVN, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ware Foundation, và nó là một phần không thể thiếu của cộng đồng các nhà lập trình
và phát triển web.
Mời các bạn vào trang chủ của Viet Jack để tham khảo thêm các loạt bài online miễn phí khác
Loạt bài hướng dẫn của chúng tôi dựa trên nguồn tài liệu của: Tutorialspoint
Đối với độc giả
Phần hướng dẫn này được thiết kế cho những ai quan tâm về các khái niệm của hệ thống SVN
theo các bước đơn giản và logic. Sau khi kết thúc phần hướng dẫn này, bạn sẽ có sự hiểu biết hơn
về SVN, từ đó có thể nâng cao trình độ của mình.
Điều kiện tiền đề
Trước khi theo tiến trình của phần hướng dẫn này, bạn nên có kiến thức cơ bản về các thuật ngữ
như ngôn ngữ chương trình, mã nguồn, tài liệu. Bởi vì sử dụng SVN để giải quyết tất cả các mức
độ trong các dự án phần mềm trong tổ chức của bạn, nó sẽ là tốt nếu bạn có kiến thức làm việc cơ
bản về phát triển phần mềm và tiến trình kiểm tra phần mềm.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 3
Các khái niệm cơ bản về SVN
Hệ thống quản lý phiên bản (VCS) trong SVN là gì?
Version Control System (VCS) là một phần mềm mà giúp các nhà phát triển phần mềm làm việc
với nhau và duy trì một lịch sử đầy đủ công việc của họ.
Dưới đây là mục tiêu của một Version Control System
Cho phép các nhà phát triển phần mềm làm việc tương tác với nhau;
Không viết đè lên thay đổi của mỗi thành viên tạo ra;
Duy trì lịch sử của mỗi phiên bản.
Một VCS được chia thành hai kiểu
Hệ thống quản lý phiên bản tập trung (CVCS), và
Hệ thống quản lý phiên bản phân phối/phân cấp (DVCS).
Trong phần hướng dẫn này, chúng ta sẽ chỉ tập trung vào hệ thống phiên bản tập trung mà đặc
biệt là Subversion. Subversion sử dụng một máy chủ trung tâm để giữ tất cả các file và cung cấp
quyền hợp tác của team.
Thuật ngữ kiểm soát phiên bản (Version control) trong
SVN
Hãy cùng bàn về một số mục mà chúng ta sử dụng trong phần hướng dẫn này:
Repository (Kho chứa): Một repository là trái tim của bất cứ hệ thống quản lý phiên bản.
Nó là khu vực trung tâm để các nhà phát triển giữ tất cả công việc của họ. Kho lưu không
chỉ lưu các file mà còn lưu giữ cả lịch sử làm việc. Kho lưu được truy cập thông qua mạng,
thực hiện vai trò như một máy chủ và công cụ điều khiển phiên bản là một máy khách. Các
máy khách có thể kết nối với repository và sau đó họ có thể giữ/lấy lại những thay đổi họ
thực hiện tới/từ repository. Bằng cách giữ các thay đổi , một khách tạo các thay đổi này tới
người khác và bằng cách lấy lại những thay đổi, một khách có thể nhận được các thay đổi
được thực hiện bởi người khác như là một bản sao công việc.
Trunk (Thân): Một thân là một thư mục tại đó tất cả các phát triển chính xảy ra và thường
được kiểm tra bởi các nhà phát triển làm việc trên dự án.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 4
Tags (Thẻ): Thư mục các thẻ được sử dụng để giữ các ảnh chụp nhanh (snapshot) được
đặt tên của dự án. Hoạt động thẻ cho phép đặt các tên để mô tả và dễ ghi nhớ cho các
phiên bản cụ thể trong repository.
Ví dụ, LAST_STABLE_CODE_BEFORE_EMAIL_SUPPORT thì dễ ghi nhớ hơn
7ceef8cb-3799-40dd-a067-c216ec2e5247 của repository UUID và
Revision: 13
Branches (Nhánh): Hoạt động nhánh được sử dụng để tạo một tiến trình khác của sự phát
triển. Nó hữu ích khi bạn muốn tiến trình phát triển của bạn phân theo hai hướng khác
nhau. Ví dụ, khi bạn công bố phiên bản 5.0, bạn có thể muốn tạo ra một nhánh để phát
triển các tính năng phiên bản 6.0 mà được giữ riêng rẽ với phiên bản 5.0.
Working copy (Bản sao công việc ): Bản sao công việc là hình chụp nhanh (snapshot)
của repository. Kho lưu được chia sẻ bởi cả team, nhưng người ta không thể sửa nó một
cách trực tiếp. Thay vào đó mỗi nhà lập trình kiểm tra bản sao công việc. Bản sao công
việc là khu vực làm việc riêng, tại đó các nhà lập trình có thể thực hiện công việc của họ
riêng rẽ một mình, cách biệt với phần còn lại của team.
Các thay đổi commit: Commit là tiến trình của việc giữ các thay đổi từ khu vực làm việc
riêng tới máy chủ trung tâm. Sau khi commit, các thay đổi sẵn sàng được sử dụng bởi các
thành viên khác trong team. Các thành viên khác có thể lấy lại các thay đổi này bằng cách
cập nhật bản sao công việc. Commit là một hoạt động nguyên tử (atomic operation) tức là
không thể chia nhỏ hoạt động đó được. Hoặc là nó thành công hoặc là thất bại. Bạn không
bao giờ nhìn thấy một commit hoàn thành giữa chừng.
Cài đặt môi trường SVN
Cài đặt SVN
Subversion là một công cụ quản lý phiên bản mã nguồn mở. Nó có sẵn và miễn phí trên mạng. Nó
đi kèm theo các bản mặc định với các bản phân phối của GNU/Linux, vì thế nó có thể đã được cài
đặt trên máy của bạn. Để kiểm tra có hay không nó đã được cài đặt trên máy, bạn sử dụng lệnh
sau:
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 5
[jerry@CentOS ~]$ svn --version
Nếu bản Subversion client chưa được cài đặt, thì khi đó lệnh sẽ báo lỗi, ngoài ra 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 RPM- trên nền tảng GNU/Linux, thì khi đó bạn sử dụng lệnh yum để cài
đặt. Sau khi cài đặt thành công, chạy lệnh svn--version.
[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
Nếu bạn đang sử dụng Debian- trên nền tảng GNU/Linux, bạn sử dụng lệnh apt để 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
Cài đặt Apache
Chúng ta đã thấy cách để cài đặt Subversion client trên GNU/Linux. Bây giờ hãy xem cách để tạo
một repository mới và cho phép người sử dụng truy cập.
Trên server chúng ta phải cài đặt môđun Apache httpd và công cụ svnadmin.
[jerry@CentOS ~]$ su -
Password:
[root@CentOS ~]# yum install mod_dav_svn subversion
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 6
Gói mod_dav_svn cho phép truy cập tới repository bằng cách sử dụng HTTP, thông qua máy chủ
Apache http và gói subversion cài đặt công cụ svnadmin.
Subversion đọc cấu hình từ tệp /etc/httpd/conf.d/subversion.conf. Sau khi thêm cấu hình,
tệp subversion.conf trông giống như sau:
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
DAV svn
SVNParentPath /var/www/svn
AuthType Basic
AuthName "Authorization Realm"
AuthUserFile /etc/svn-users
Require valid-user
Bây giờ chúng ta tạo các subversion client và cho phép chúng truy cập vào repository.
Lệnhhtpasswd được sử dụng để tạo và cập nhật file thuần văn bản mà được sử dụng để giữ tên
sử dụng (username)và mật khẩu (password) cho sự xác nhận cơ bản của người dùng HTTP. Tùy
chọn „-c‟ tạo file mật khẩu (password), nếu mật khẩu (password) đã tồn tại, nó viết đè lên. Đó là tại
sao chỉ sử dụng tùy chọn „-c‟ vào lần đầu tiên. Tùy chọn „-m‟ cho phép mật mã hóa MD5 cho các
mật khẩu (password).
Cài đặt tài khoản sử dụng trong SVN
Bây giờ chúng ta tạo một tài khoản sử dụng tom.
[root@CentOS ~]# htpasswd -cm /etc/svn-users tom
New password:
Re-type new password:
Adding password for user tom
Bây giờ tạo ra tài khoản jerry
[root@CentOS ~]# htpasswd -m /etc/svn-users jerry
New password:
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 7
Re-type new password:
Adding password for user jerry
[root@CentOS ~]#
Tạo thư mục gốc subversion để giữ tất cả phần công việc (theo dõi ở
/etc/httpd/conf.d/subversion.conf).
[root@CentOS ~]# mkdir /var/www/svn
[root@CentOS ~]# cd /var/www../svn/
Cài đặt repository trong SVN
Tạo repository cho dự án đặt tên là project_repo. Lệnh svnadmin sẽ tạo một repository mới và một
vài thư mục khác bên trong đó để giữ 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
Bây giờ chúng ta thay đổi người sử dụng và sở hữu nhóm của repository.
[root@CentOS svn]# chown -R apache.apache project_repo/
Kiểm tra có hay không SELinux được cho phép hoặc 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
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 8
Đối với server của chúng ta, SELinux được cho phép, vì thế chúng ta phải thay đổi bối cảnh an
toàn SELinux.
[root@CentOS svn]# chcon -R -t httpd_sys_content_t /var/www../svn/project_repo/
Để cho phép các commit qua HTTP, chạy lệnh sau:
[root@CentOS svn]# chcon -R -t httpd_sys_rw_content_t /var/www../svn/project_repo/
Restart máy chủ Apache và chúng ta đã làm xong việc định cấu hình cho server 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 ta đã định cấu hình cho server Apache thành công, bây giờ chúng ta sẽ định cấu hình cho
repository. Để repository cung cấp quyền truy cập tới các người sử dụng xác thực nào đó và để sử
dụng file ủy quyền mặc định, bạn gắn các dòng sau vào tệpproject_repo/conf/svnserve.conf.
anon-access = none
authz-db = authz
Theo quy ước, mỗi dự án subversion có các thư mục thân (trunk), thẻ (tag) và các nhánh
(branches) trực tiếp dưới thư mục gốc của dự án.
Thân trunk là thư mục tại đó tất cả sự tiến triển chính diễn ra và thường được kiểm tra bởi các nhà
lập trình làm việc trên dự án đó.
Thư mục thẻ tags được sử dụng để giữ các ảnh chụp nhanh (snapshot) được đặt tên của dự án.
Khi tạo một công bố sản phẩm, team sẽ ghi thẻ code mà thực hiện trong công bố.
Thư mục nhánh branches được sử dụng khi bạn muốn phân tuyến phát triển.
Bây giờ chúng ta hãy cùng tạo ra cấu trúc thư mục trunk, tags, và branches dưới repository của dự
án.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 9
[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 tới repository.
[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]#
Nó đã được thực hiện. Chúng ta đã thành công tạo ra kho chứa và cho phép Tom và Jerry truy cập
vào. Bắt đầu từ bây giờ, họ có thể thực hiện tất cả các hoạt động được hỗ trợ tới repository.
Vòng đời trong SVN
Vòng đời của hệ thống quản lý phiên bản được bàn luận trong chương này. Trong chương sau
chúng ta sẽ quan sát lệnh của subversion cho mỗi tiến trình.
Tạo repository trong SVN:
Kho lưu là địa điểm trung tâm mà các nhà phát triển giữ tất cả những gì liên quan đến công việc
của họ. Kho lưu khong chỉ giữ file mà còn lưu giữ cả lịch sử về các thay đổi. Điều này có nghĩa là
nó duy trì một lịch sử của các sự thay đổi được thực hiện trong các file.
Tiến trình create được sử dụng để tạo một repository mới. Hầu hết thời gian tiến trình này được
thực hiện chỉ một lần. Khi bạn tạo một repository mới, VCS của bạn sẽ hi vọng bạn nói gì đó để
nhận diện nó, như là nơi bạn muốn được tạo hoặc tên mà bạn muốn đặt cho repository.
Tiến trình Checkout trong SVN
Tiến trình checkout được sử dụng để tạo ra một bản sao làm việc từ repository. Bản sao làm việc
là khu vực làm việc riêng nơi mà các nhà lập trình thực hiện những thay đổi của họ, và sau đó, đệ
trình những thay đổi này tới repository.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 10
Tiến trình Update trong SVN
Như tên gọi đã đề cập, tiến trình update được sử dụng để cập nhật bản sao làm việc. Tiến trình
này đồng bộ khu vực làm việc với repository. Khi repository được chia sẻ thì tất cả các thành viên
trong team có thể commit những thay đổi của họ và bản sao làm việc trở lên cũ đi.
Bây giờ chúng ta giả sử rằng Tom và Jerry là hai nhà lập trình làm việc trên một dự án. Cả hai
kiểm tra phiên bản mới nhất từ repository và bắt đầu làm việc. Tại thời điểm này, bản sao công việc
là đồng bộ hoàn toàn với repository. Jerry hoàn thành công việc của anh ta rất hiệu quả
và commit những thay đổi anh ta thực hiện tới repository.
Bây giờ khu vực làm việc của Tom chưa được cập nhật. Tiến trình update sẽ kéo những thay đổi
mới nhất của Jerry từ repository và sẽ cập nhật khu vực làm việc của Tom.
Thực hiện các thay đổi trong SVN
Sau khi checkout, ai đó có thể thực hiện các tiến trình đa dạng để thực hiện các thay đổi. Chỉnh
sửa là tiến trình thông thường nhất. Người nào đó có thể chỉnh sửa: thêm/gỡ bỏ nội dung file đang
hiện hữu.
Một ai đó có thể thêm các file/thư mục. Nhưng ngay lập tức những file/thư mục này không không
trở thành một phần của repository, trừ khi chúng đã được thêm trong quá trình diễn ra liệt kê thay
đổi và trở thành một phần của repository sau tiến trình commit.
Tương tự, một ai đó có thể xóa file/thư mục. Tiến trình delete này ngay lập tức xóa file từ trong khu
vực làm việc, nhưng sự xóa bỏ thực sự của file là được thêm vào trong quá trình diễn ra liệt kê
thay đổi (pending change-list)và những thay đổi được hoàn thành tới repository sau tiến
trình commit.
Tiến trình rename thay đổi tên của file/thư mục. Tiến trình move được sử dụng để di chuyển
file/thư mục từ một địa điểm tới địa điểm khác trong cây repository.
Duyệt các thay đổi (review) trong SVN
Khi bạn kiểm tra hoặc cập nhật khu vực làm việc, thì khi đó khu vực làm việc của bạn được hoàn
toàn đồng bộ với repository. Nhưng khi bạn thực hiện các thay đổi tới khu vực làm việc, nó trở nên
mới hơn repository. Và nó là thói quen tốt để Review - duyệt lại những thay đổi của bạn trước khi
thực hiện tiến trình commit.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 11
Tiến trình status trong SVN liệt kê các chỉnh sửa mà đã thực hiện tới khu vực làm việc. Như chúng
ta đã đề cập trước đó, bất cứ khi nào bạn gây ra thay đổi trong khu vực làm việc, tất cả những thay
đổi đó trở thành một phần của quá trình diễn ra liệt kê thay đổi. Và tiến trình Status được sử dụng
để quan sát quá trình diễn ra liệt kê thay đổi này.
Tiến trình status chỉ cung cấp một danh sách các thay đổi nhưng không đưa ra những chi tiết về
chúng. Một ai đó có thể sử dụng tiến trình diff để quan sát các chi tiết này của sự chỉnh sửa mà đã
được thực hiện tới khu vực làm việc.
Sửa các lỗi trong SVN
Chúng tôi giả sử rằng một ai đó đã gây ra các thay đổi tới khu vực làm việc của anh ta, nhưng bây
giờ anh ta muốn dỡ bỏ các thay đổi này. Trong tình huống này, tiến trình revertsẽ giúp làm điều
đó.
Tiến trình revert trả lại các chỉnh sửa mà đã thực hiện tới khu vực làm việc. Nó là có thể để trả lại
một hoặc nhiều file/thư mục. Nó cũng có thể trả lại toàn bộ khu vực làm việc. Trong trường hợp
này, tiến trình revert sẽ phá hủy quá trình diễn ra liệt kê thay đổi và sẽ mang khu vực làm việc trở
lại trạng thái ban đầu.
Giải quyết các xung đột trong SVN:
Các xung đột có thể xảy ra tại thời gian của việc sáp nhập. Tiến trình merge tự động thực hiện mọi
thứ mà có thể thực hiện theo một cách an toàn. Mọi thứ khác được cân nhắc là sự xung đột. Ví dụ,
tệp hello.c được chỉnh sửa trong một nhánh và bị xóa trong nhánh khác. Trong tình huống như vậy
cần một người đưa ra quyết định. Tiến trình resolve được sử dụng để giúp người sử dụng tính
toán các thứ và để thông báo cho VCS về cách giải quyết các xung đột.
Ký thác các thay đổi (commit) trong SVN
Tiến trình commit được sử dụng để áp dụng các thay đổi từ khu vực làm việc tới repository. Tiến
trình này chỉnh sửa repository và các nhà lập trình khác có thể quan sát những thay đổi này bằng
cách cập nhật khu vực làm việc.
Trước khi commit, một ai đó phải thêm file/thư mục tới quá trình diễn ra liệt kê thay đổi. Đây là nơi
mà những thay đổi chờ để được commit. Với commit, chúng ta thường cung cấp một thông báo log
để giải thích tại sao ai đó gây ra các thay đổi. Thông báo log này trở thành một phần của lịch sử
của repository. Ký thác là một tiến trình nguyên tử, mà có nghĩa là không thể chia tiến trình này
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 12
được. Hoặc là nó được thực hiện hoặc không. Bạn không thể thấy một tiến trình commit bỏ dở
giữa chừng.
Tiến trình Checkout trong SVN
Subversion cung cấp lệnh checkout để tạo một bản sao thư mục làm việc từ một repository. Lệnh
dưới đây sẽ tạo ra 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
lo lắng về địa chỉ URL repository, khi hầu hết thời gian, nó đã được cung cấp bởi người quản lý
subversion với quyền truy cập thích đáng.
[tom@CentOS ~]$ svn checkout --username=tom
Lệnh trên sẽ tạo ra kết quả sau:
A project_repo/trunk
A project_repo/branches
A project_repo/tags
Checked out revision 1.
Sau khi hoạt động checkout thành công, số hiệu phiên bản sẽ được in. Nếu bạn muốn quan sát
nhiều thông tin hơn về repository, thì khi đó bạn thực hiện lệnh info.
[tom@CentOS trunk]$ pwd
/home/tom/project_repo/trunk
[tom@CentOS trunk]$ svn info
Lệnh trên sẽ tạo ra kết quả sau:
Path: .
URL:
Repository Root:
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)
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 13
[tom@CentOS trunk]$
Thực hiện các thay đổi trong SVN
Jerry kiểm tra phiên bản mới nhất của repository và bắt đầu làm việc trên dự án. Anh ta tạo một
file array.c bên trong thư mục trunk.
[jerry@CentOS ~]$ cd project_repo/trunk/
[jerry@CentOS trunk]$ cat array.c
Lệnh trên sẽ tạo ra kết quả:
#include
#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 code của mình trước khi commit.
[jerry@CentOS trunk]$ make array
cc array.c -o array
[jerry@CentOS trunk]$ ./array
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 14
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 ta biên dịch và kiểm tra code của mình và mọi thứ đang làm việc như mong đợi, bây giờ nó là
thời gian để commit thay đổi.
[jerry@CentOS trunk]$ svn status
? array.c
? array
Subversion đang chỉ dấu “?” trước tên file bởi vì nó không biết những gì đã làm với các file này.
Trước khi commit, Jerry cần thêm file này tới quá trình diễn ra liệt kê thay đổi.
[jerry@CentOS trunk]$ svn add array.c
A array.c
Hãy cùng chúng tôi kiểm tra nó với tiến trình status. Subversion chỉ A trước array.c, nó nghĩa là,
file này đã được thêm thành công vào quá trình diễn ra liệt kê các thay đổi.
[jerry@CentOS trunk]$ svn status
? array
A array.c
Để lưu giữ tệp array.c tới repository, sử dụng lệnh commit với tùy chọn -m theo sau bởi thông báo
commit. Nếu bạn bỏ quên tùy chọn -m, subversion sẽ mang tới bộ soạn văn bản (text editor) mà tại
đó bạn có thể gõ một thông báo 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 thành công tới repository, và số phiên bản được đánh số thêm 1.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 15
Review các thay đổi trong SVN
Jerry đã thêm tệp array.c tới repository. Tom cũng kiểm tra code mới nhất và bắt đầu làm việc.
[tom@CentOS ~]$ svn co --username=tom
Lệnh trên sẽ tạo ra kết quả 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 ta tìm thấy rằng một ai đó đã thêm code. Vì thế anh ta tò mò về người đã làm điều đó
và anh ta kiểm tra thông báo log để quan sát chi tiết hơn bằng cách sử dụng lệnh sau:
[tom@CentOS trunk]$ svn log
Lệnh trên sẽ tạo ra kết quả 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 theo dõi code của Jerry, anh ta lập tức chú ý đến một lỗi (bug) trong đó. Jerry không kiểm
tra về tràn độ dài chuỗi của mảng, mà có thể gây ra các vấn đề nghiêm trọng. Vì thế Tom quyết
định sửa lỗi này. Sau khi chỉnh sửa, array.c sẽ trông giống như sau:
#include
#define MAX 16
int main(void)
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 16
{
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 hoạt động status để quan sát quá trình diễn ra liệt kê các thay đổi.
[tom@CentOS trunk]$ svn status
M array.c
Tệp array.c đã được chỉnh sửa, đó là tại sao subversion chỉ ký tự M trước tên file. Tiếp đó Tom
biên dịch và kiểm tra code của anh ta và nó đang làm việc tốt. Trước khi commit các thay đổi, anh
ta muốn kiểm tra lần hai nó bằng cách duyệt lại các thay đổi mà anh ta đã thực hiện.
[tom@CentOS trunk]$ svn diff
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 17
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 mới vào tệp array.c, đó là tại sao subversion chỉ ký hiệu + trước các
dòng mới. Bây giờ anh ta đã sẵn sàng để commit các thay đổi của mình.
[tom@CentOS trunk]$ svn commit -m "Fix array overflow problem"
Lệnh trên sẽ tạo ra kết quả sau:
Sending trunk/array.c
Transmitting file data .
Committed revision 3.
Các thay đổi của Tom đã được commit thành công tới repository.
Tiến trình Update trong SVN
Jerry đã commit phiên bản đầu tiên của code. Nhưng anh ta nghĩ rằng anh ta nên viết hai chức
năng để chấp nhận dữ liệu đầu vào và để hiển thị nội dung mảng. Sau khi chỉnh sửa,array.c trông
giống như sau:
#include
#define MAX 16
void accept_input(int *arr, int n) {
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 18
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 code của mình và đã sẵn sàng để commit các thay đổi. Trước khi đó,
anh ta muốn duyệt lại các thay đổi bằng cách sử dụng lệnh sau:
[jerry@CentOS trunk]$ svn diff
Lệnh trên sẽ tạo ra kết quả sau:
Index: array.c
===================================================================
--- array.c (revision 2)
+++ array.c (working copy)
@@ -2,6 +2,24 @@
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 19
#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");
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 20
+ display(arr, n);
return 0;
}
Với các dòng mới, subversion chỉ dấu + trước các dòng và với các dòng bị dỡ bỏ nó chỉ dấu -. Bây
giờ Jerry cố gắng để commit các thay đổi bằng cách sử dụ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ẽ tạo ra kết quả 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 commit những thay đổi của Jerry, bởi vì Tom đã thay đổi repository và
khu vực làm việc của Jerry bị lỗi thời. Để tránh việc viết đè lên các thay đổi lẫn nhau, Subversion
quên hành động này. Jerry phải cập nhật khu vực làm việc trước khi commit các thay đổi của anh
ta. Vì thế anh ta sử dụng lệnh update như dưới đây:
[jerry@CentOS trunk]$ svn update
G array.c
Updated to revision 3.
Subversion đang chỉ ký tự G trước tên file, nghĩa là file này đã được sáp nhập.
[jerry@CentOS trunk]$ svn diff
Lệnh trên sẽ tạo ra kết quả sau:
Index: array.c
===================================================================
--- array.c (revision 3)
+++ array.c (working copy)
@@ -2,6 +2,24 @@
#define MAX 16
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 21
+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);
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 22
return 0;
}
Subversion đang chỉ các thay đổi của Jerry, nhưng tệp array.c được sáp nhập. Nếu bạn theo dõi
cẩn thận, subversion bây giờ đang chỉ phiên bản số 3. Trong sản phẩm trước, nó đang chỉ phiên
bản số 2. Hãy quan sát ai đã gây ra những thay đổi trong file 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
------------------------------------------------------------------------
Bây giờ khu vực làm việc của Jerry đã được đồng bộ với repository và anh ta có thể commit các
thay đổi của anh ta 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.
Sửa lỗi trong SVN
Giả sử Jerry tình cờ sửa tệp array.c và anh ta biên dịch lỗi. Bây giờ anh ta muốn dỡ bỏ các thay
đổi. Trong tình huống này, hoạt động revert sẽ giúp làm điều này. Hoạt động revert sẽundo bất cứ
thay đổi nội bộ nào tới một file hoặc thư mục và giải quyết bất cứ trạng thái tranh chấp.
[jerry@CentOS trunk]$ svn status
Lệnh trên sẽ tạo ra kết quả sau:
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 23
M array.c
Bây giờ cố gắng để tạo mảng này như sau:
[jerry@CentOS trunk]$ make array
Lệnh trên sẽ tạo ra kết quả 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 hoạt động revert 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 code trên.
[jerry@CentOS trunk]$ make array
cc array.c -o array
Sau khi thực hiện hoạt động trả lại (revert), khu vực làm việc của anh ta được trả lại trạng thái ban
đầu. Hoạt động này có thể trả lại một file đơn cũng như một thư mục đầy đủ. Để trả lại một thư
mục, sử dụng tùy chọn -R như dưới đây.
[jerry@CentOS project_repo]$ pwd
/home/jerry/project_repo
[jerry@CentOS project_repo]$ svn revert -R trunk
Tới bây giờ, chúng ta đã thấy cách để trả lại các thay đổi, mà đã được thực hiện với khu vực làm
việc. Nhưng điều gì xảy ra nếu bạn trả lại một phiên bản đã commit. Công cụ VCS không cho phép
xóa lịch sử từ repository. Chúng ta chỉ có thể gán lịch sử. Nó sẽ xảy ra ngay cả khi bạn xóa các file
từ trong kho chứa. Để undo một phiên bản cũ, chúng ta phải trả lại những gì đã thay đổi trong
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 24
phiên bản cũ và sau đó commit một phiên bản mới. Điều này được gọi là sáp nhập trả lại (revert
merge).
Bây giờ chúng ta giả sử rằng Jerry thêm một code cho hoạt động linear search. Sau khi thẩm tra
anh ta commit 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ì thế anh ta kiểm tra các thông báo log.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 25
[jerry@CentOS trunk]$ svn log
Lệnh trên sẽ tạo ra kết quả 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 quan sát các thông báo log, Jerry nhận ra rằng anh ta đã thực hiện một lỗi nghiêm trọng.
Bởi vì Tom đã chạy hoạt động binary search, mà là tốt hơn lệnh linear search; code của anh ta là
thừa, và bây giờ Jerry phải trả lại (revert) những thay đổi tới phiên bản trước. Vì thế, điều đầu tiên
tìm kiếm phiên bản hiện tại của repository. Hiện tại, phiên bản của repository là 22 và chúng ta phải
revert nó về phiên bản trước, là phiên bản 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.
Xử lý các xung đột (Conflict) trong SVN
Tom quyết định thêm một tệp README vào dự án của họ. Vì thế anh ta tạo ra tệp REAME và
thêm danh sách TODO vào trong đó. Sau khi thêm, repository là phiên bản thứ 6.
[tom@CentOS trunk]$ cat README
/* TODO: Add contents in README file */
[tom@CentOS trunk]$ svn status
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 26
? 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 code mới nhất mà ở phiên bản 6. Và ngay lập tức anh ta bắt đầu làm việc. Sau một
vài giờ, Tom cập nhật tệp README và commit những thay đổi của anh ta. Tệp README sẽ trông
như sau:
[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ờ, repository tại phiên bản 7 và khu vực làm việc của Jerry đang bị lỗi thời. Jerry cũng cập
nhật tệp README và cố gắng để commit những thay đổi của anh ta.
Tệp README của Jerry trông như sau:
[jerry@CentOS trunk]$ cat README
* File list
1) array.c Implementation of array operation.
2) README Instructions for user.
[jerry@CentOS trunk]$ svn status
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 27
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: Kiểm tra xung đột
Subversion đã tìm ra rằng tệp README đã thay đổi từ khi lần cuối được cập nhật. Vì thế, Jerry
phải cập nhật khu vực làm việc của anh ta.
[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ó một xung đột xảy ra với tệp README, và Subversion không
biết cách để giải quyết điều này. Vì thế Jerry chọn chức năng df để duyệt sự xung đột này.
[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
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 28
+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: Trì hoãn các xung đột
Tiếp đó, Jerry chọn chức năng postpone(p) để mà anh ta có thể giải quyết sự 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ở tệp README trong bộ biên soạn văn bản (text editor), anh ta nhận ra rằng subversion
đã bao cả code của Tom và của anh ta với vật ghi xung đột (conflict maker).
[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ì thế anh ta dỡ bỏ các dòng trong vật
ghi xung đột.
Vì thế, tệp README trông như sau:
[jerry@CentOS trunk]$ cat README
* File list
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 29
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 cố gắng commit lại.
[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 phần commit trên, ký tự C chỉ rằng có một xung đột trong tệp README. Jerry đã giải quyết
xung đột nhưng không báo với subversion rằng anh ta đã giải quyết xung đột đó. Anh ta sử dụng
lệnh resolve để thông báo cho subversion về việc 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.
Hoạt động Tag trong SVN
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 30
VCS hỗ trợ hoạt động tag, bằng cách sử dụng khái niệm này, một ai đó có thể đặt tên ý nghĩa cho
một phiên bản cụ thể của code. Các thẻ cho phép cung cấp một tên khái quát và dễ ghi nhớ tới
phiên bản cụ thể của code. Ví dụ, tên BASIC_ARRAY_OPERATIONS thì dễ ghi nhớ hơn
là revision 4.
Hãy cùng chúng tôi quan sát hoạt động tag qua một ví dụ. Tom quyết định tạo một thẻ để mà anh
ta có thể truy cập vào code dễ dàng hơn.
[tom@CentOS project_repo]$ svn copy --revision=4 trunk/ tags/basic_array_operations
Lệnh trên tạo ra kết quả sau:
A tags/basic_array_operations/array.c
Updated to revision 4.
A tags/basic_array_operations
Thao tác trên thực hiện thành công, một thư mục mới sẽ được tạo ra bên trong thư mụctags.
[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 nó lần thứ 2 trước khi commit. Hoạt động status đang chỉ rằng hoạt động tag
thực hiện thành công, vì thế anh ta có thể commit những thay đổi của anh ta 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.
Chia nhánh trong SVN
Hoạt động branch trong SVN tạo tuyến của sự phát triển. Nó là hữu ích khi ai đó muốn tiến trình
phát triển phân theo hai hướng khác nhau. Chúng tôi giả sử rằng bạn đã công bố sản phẩm phiên
bản 1.0, bạn có thể muốn tạo ra nhánh mới để phát triển phiên bản 2.0 mà được giữ riêng rẽ với
phiên bản 1.0 để sửa các bug của nó.
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 31
Trong tình huống này, chúng ta sẽ theo dõi cách để tạo ra hoặc sáp nhập nhánh. Jerry không vui
mừng vì sự xuất hiện xung đột (conflict) trong phiên bản trước, vì thế anh ta quyết định tạo một
nhánh riêng của mình.
[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 trên nhánh riêng của mình. Anh ta thêm hoạt động sort cho mảng
(array). Khi đó, code đã được chỉnh sửa của Jerry trông giống như sau:
[jerry@CentOS project_repo]$ cd branches/jerry_branch/
[jerry@CentOS jerry_branch]$ cat array.c
Lệnh trên sẽ tạo ra kết quả sau:
#include
#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) {
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 32
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: ");
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 33
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 code của anh ta và sẵn sàng để commit những 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ẽ tạo ra kết quả sau:
Enter the total number of elements: 5
Enter the elements
10
-4
2
7
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 34
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 đó, trên thân (trunk), Tom quyết định thực hiện hoạt động search. Tom thêm code cho
hoạt động search và code của anh ta bây giờ trông như sau:
[tom@CentOS trunk]$ svn diff
Lệnh trên sẽ tạo ra kết quả 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)
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 35
+ 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);
+
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 36
return 0;
}
Sau khi duyệt, anh ta commit 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 nhánh riêng của cậu ta:
[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 quan sát thông báo log, Tom tìm thấy rằng Jerry thực hiện hoạt động sort. Tom thực
hiện hoạt động search sử dụng thuật toán tìm kiếm nhị phân, nó luôn luôn chắc rằng dữ liệu được
sắp xếp theo thứ tự. Nhưng nếu người sử dụng cung cấp dữ liệu chưa được sắp xếp. Trong tình
huống này, hoạt động search nhị phân sẽ thất bại. Vì thế anh ta quyết định sắp xếp dữ liệu của
Jerry trước khi thực hiện hoạt động search. Do đó anh ta yêu cầu nhập code từ nhánh của Jerry
vào trong thân (trunk).
[tom@CentOS trunk]$ pwd
/home/tom/project_repo/trunk
[tom@CentOS trunk]$ svn merge ../branches/jerry_branch/
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 37
--- Merging r9 through r11 into '.':
U array.c
Sau khi sáp nhập, array.c sẽ trông giống như sau:
[tom@CentOS trunk]$ cat array.c
Lệnh trên sẽ tạo ra kết quả sau:
#include
#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;
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 38
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];
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 39
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;
}
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 40
Sau khi biên dịch và kiểm tra, Tom commit những thay đổi của anh ta tới repository.
[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]$
Tài liệu tham khảo SVN
Các nguồn sau chứa tài liệu hữu ích về SVN. Mong bạn tham khảo chúng để hiểu sâu hơn những
gì chúng tôi đã đề cập trong loạt bài này.
Các đường link hữu ích về SVN
Tutorialspoint − Loạt bài hướng dẫn của chúng tôi xây dựng dựa trên nguồn này.
Apache Subversion - Nó là hệ thống quản lý phiên bản được phân phối miễn phí dưới
Apache License
Copyright © vietjack.com
Trang chia sẻ các bài học online miễn phí Page 41
Apache Subversion at Wikipedia - Là Apache Subversion tại Wikipedia
Free Book - Nó là sách miễn phí về hệ thống điều khiển phiên bản Apache Subversion.
Former Website for subversion.apache.org - Đây là Website trước của dự án phần mềm
Subversion, mà bây giờ Homepage là subversion.apache.org
Các file đính kèm theo tài liệu này:
- tai_lieu_svn_tieng_viet_8641.pdf