Tài liệu SVN

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).

pdf41 trang | Chia sẻ: truongthinh92 | Lượt xem: 2282 | Lượt tải: 0download
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:

  • pdftai_lieu_svn_tieng_viet_8641.pdf
Tài liệu liên quan