tài liệu svn tiếng việt

41
http://vietjack.com/svn/index.jsp Copyright © vietjack.com http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1 Mục lục Giới thiệu về SVN ................................................................................................................. 2 Đố i v ới độ c gi ...................................................................................................................... 2 Điề u ki n ti ền đề ................................................................................................................... 2 Các khái ni ệm cơ bả n v SVN.............................................................................................. 3 Hth ng qu n lý phiên b n (VCS) trong SVN là gì? ......................................................... 3 Thu t ng ki m soát phiên b n (Version control) trong SVN............................................. 3 Cài đặt môi trườ ng SVN ....................................................................................................... 4 Cài đặ t SVN...................................................................................................................... 4 Cài đặ t Apache ................................................................................................................. 5 Cài đặ t tài kho n s d ng trong SVN................................................................................ 6 Cài đặ t repository trong SVN............................................................................................. 7 Vòng đờ i trong SVN.............................................................................................................. 9 To repository trong SVN:................................................................................................. 9 Ti ế n trình Checkout trong SVN ......................................................................................... 9 Ti ế n trình Update trong SVN........................................................................................... 10 Th c hi ện các thay đổ i trong SVN .................................................................................. 10 Duy ệt các thay đổ i (review) trong SVN............................................................................ 10 S a các l i trong SVN .................................................................................................... 11 Gi i quy ết các xung độ t trong SVN: ................................................................................. 11 Ký thác các thay đổ i (commit) trong SVN ........................................................................ 11 Ti ế n trình Checkout trong SVN ........................................................................................... 12 Th c hi ện các thay đổ i trong SVN ...................................................................................... 13 Review các thay đổ i trong SVN........................................................................................... 15 Ti ế n trình Update trong SVN............................................................................................... 17 S a l i trong SVN............................................................................................................... 22 X lý các xung độ t (Conflict) trong SVN .............................................................................. 25 Bướ c 1: Ki ểm tra xung độ t .............................................................................................. 27

Upload: nguyen-thanh-tuyen

Post on 12-Dec-2015

43 views

Category:

Documents


1 download

DESCRIPTION

Tài liệu SVN bằng tiếng Việt, học SVN online từ cơ bản đến nâng cao

TRANSCRIPT

Page 1: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 1

Mục lục Giới thiệu về SVN ................................................................................................................. 2

Đối với độc giả ...................................................................................................................... 2

Điều kiện tiền đề ................................................................................................................... 2

Các khái niệm cơ bản về SVN .............................................................................................. 3

Hệ thống quản lý phiên bản (VCS) trong SVN là gì? ......................................................... 3

Thuật ngữ kiểm soát phiên bản (Version control) trong SVN ............................................. 3

Cài đặt môi trường SVN ....................................................................................................... 4

Cài đặt SVN ...................................................................................................................... 4

Cài đặt Apache ................................................................................................................. 5

Cài đặt tài khoản sử dụng trong SVN ................................................................................ 6

Cài đặt repository trong SVN ............................................................................................. 7

Vòng đời trong SVN .............................................................................................................. 9

Tạo repository trong SVN: ................................................................................................. 9

Tiến trình Checkout trong SVN ......................................................................................... 9

Tiến trình Update trong SVN ........................................................................................... 10

Thực hiện các thay đổi trong SVN .................................................................................. 10

Duyệt các thay đổi (review) trong SVN ............................................................................ 10

Sửa các lỗi trong SVN .................................................................................................... 11

Giải quyết các xung đột trong SVN:................................................................................. 11

Ký thác các thay đổi (commit) trong SVN ........................................................................ 11

Tiến trình Checkout trong SVN ........................................................................................... 12

Thực hiện các thay đổi trong SVN ...................................................................................... 13

Review các thay đổi trong SVN ........................................................................................... 15

Tiến trình Update trong SVN ............................................................................................... 17

Sửa lỗi trong SVN ............................................................................................................... 22

Xử lý các xung đột (Conflict) trong SVN .............................................................................. 25

Bước 1: Kiểm tra xung đột .............................................................................................. 27

Page 2: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://vietjack.com/ Trang chia sẻ các bài học online miễn phí Page 2

Bước 2: Trì hoãn các xung đột ........................................................................................ 28

Bước 3: Giải quyết xung đột ........................................................................................... 29

Hoạt động Tag trong SVN .................................................................................................. 29

Chia nhánh trong SVN ........................................................................................................ 30

Tài liệu tham khảo SVN ...................................................................................................... 40

Các đường link hữu ích về SVN ..................................................................................... 40

Giới thiệu về SVN

Apache Subversion thường được viết tắt là SVN, là một phần mềm mã nguồn mở dùng để quản

lý và kiểm tra các phiên bản mã nguồn khác nhau trong quá trình phát triển phần mềm. Subversion

được tạo bởi CollabNet Inc trong năm 2000, nhưng bây giờ nó được phát triển bởi một dự án của

Apache Software 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.

Page 3: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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.

Page 4: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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:

Page 5: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 6: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

<Location /svn>

DAV svn

SVNParentPath /var/www/svn

AuthType Basic

AuthName "Authorization Realm"

AuthUserFile /etc/svn-users

Require valid-user

</Location>

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:

Page 7: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 8: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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.

Page 9: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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.

Page 10: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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.

Page 11: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 12: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 http://svn.server.com../svn/project_repo --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: 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)

Page 13: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 <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 code của mình trước khi commit.

[jerry@CentOS trunk]$ make array

cc array.c -o array

[jerry@CentOS trunk]$ ./array

Page 14: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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.

Page 15: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 http://svn.server.com../svn/project_repo --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 <stdio.h>

#define MAX 16

int main(void)

Page 16: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 17: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 <stdio.h>

#define MAX 16

void accept_input(int *arr, int n) {

Page 18: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 @@

Page 19: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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");

Page 20: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 21: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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);

Page 22: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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:

Page 23: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 24: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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.

Page 25: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 26: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 27: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 28: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 29: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 30: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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ó.

Page 31: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 <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) {

Page 32: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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: ");

Page 33: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 34: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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)

Page 35: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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);

+

Page 36: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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/

Page 37: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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 <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;

Page 38: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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];

Page 39: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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;

}

Page 40: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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

Page 41: Tài Liệu SVN Tiếng Việt

http://vietjack.com/svn/index.jsp Copyright © vietjack.com

http://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