Cách sử dụng SVN, Chi nhánh? Nhãn? Thân cây?


163

Tôi đã loay hoay một chút và không thể tìm thấy một hướng dẫn "người mới bắt đầu" tốt cho SVN , không phải theo nghĩa "làm thế nào để tôi sử dụng các lệnh"; Làm cách nào để kiểm soát mã nguồn của tôi?

Những gì tôi muốn làm rõ là các chủ đề sau:

  • Bạn có thường xuyên cam kết không? Thường xuyên như người ta sẽ nhấn Ctrl+ s?
  • Chi nhánh là gì và Thẻ là gì và làm thế nào để bạn kiểm soát chúng?
  • Điều gì đi vào SVN? Chỉ Mã nguồn hoặc bạn có chia sẻ các tệp khác ở đây không? (Không được xem xét các tệp phiên bản ..)

Tôi không có ý tưởng gì về chi nhánh và thẻ là gì vì vậy tôi không biết mục đích, nhưng suy đoán hoang dã của tôi là bạn tải nội dung lên thân cây và khi bạn thực hiện một bản dựng chính, bạn có di chuyển nó đến chi nhánh không? Vì vậy, những gì được coi là một bản dựng chính trong trường hợp này?


Một cách tốt để xác định một "tần số" cam kết là đến với nó từ quan điểm hợp nhất. Nếu bạn có một nhánh bạn cần để hợp nhất các thay đổi từ thân cây vào, việc chọn ra một số phiên bản Vs 1000 sẽ sớm giúp bạn kết thúc theo một cách tiếp cận hợp lý.
Phil Cooper

Câu trả lời:



86

Tôi đã tự hỏi mình những câu hỏi tương tự khi chúng tôi thực hiện Subversion tại đây - khoảng 20 nhà phát triển trải rộng trên 4 - 6 dự án. Tôi đã không tìm thấy bất kỳ nguồn tốt nào với '' câu trả lời ''. Dưới đây là một số phần về cách câu trả lời của chúng tôi đã phát triển trong 3 năm qua:

- cam kết thường xuyên như là hữu ích; quy tắc ngón tay cái của chúng tôi là cam kết bất cứ khi nào bạn đã thực hiện đủ công việc rằng đó sẽ là một vấn đề phải làm lại nếu sửa đổi bị mất; đôi khi tôi cam kết cứ sau 15 phút hoặc lâu hơn, những lần khác có thể là vài ngày (vâng, đôi khi tôi phải mất một ngày để viết 1 dòng mã)

- chúng tôi sử dụng các nhánh, như một trong những câu trả lời trước đó của bạn được đề xuất, cho các đường phát triển khác nhau; ngay bây giờ cho một trong các chương trình của chúng tôi, chúng tôi có 3 nhánh hoạt động: 1 cho sự phát triển chính, 1 cho nỗ lực chưa hoàn thành để song song chương trình và 1 cho nỗ lực sửa đổi để sử dụng các tệp đầu vào và đầu ra XML;

- chúng tôi hiếm khi sử dụng thẻ, mặc dù chúng tôi nghĩ rằng chúng tôi nên sử dụng chúng để xác định các bản phát hành cho sản xuất;

Hãy nghĩ về sự phát triển tiến hành dọc theo một con đường duy nhất. Tại một số thời điểm hoặc trạng thái tiếp thị phát triển quyết định phát hành phiên bản đầu tiên của sản phẩm, do đó bạn cắm cờ trong đường dẫn có nhãn '1' (hoặc '1.0' hoặc những gì có bạn). Tại một số thời điểm khác, một số tia sáng sáng quyết định song song chương trình, nhưng quyết định rằng sẽ mất vài tuần và mọi người muốn tiếp tục đi xuống con đường chính trong thời gian đó. Vì vậy, bạn xây dựng một ngã ba trên con đường và những người khác nhau đi lang thang xuống các nhánh khác nhau.

Các cờ trên đường được gọi là 'thẻ' và các nhánh trên đường là nơi phân chia 'nhánh'. Thỉnh thoảng, cũng, các chi nhánh trở lại với nhau.

- chúng tôi đặt tất cả các tài liệu cần thiết để xây dựng một (hoặc hệ thống) thực thi vào kho lưu trữ; Điều đó có nghĩa là ít nhất là mã nguồn và tạo tệp (hoặc tệp dự án cho Visual Studio). Nhưng khi chúng ta có các biểu tượng và tập tin cấu hình và tất cả những thứ khác, điều đó sẽ đi vào kho lưu trữ. Một số tài liệu tìm đường vào repo; chắc chắn bất kỳ tài liệu nào như các tệp trợ giúp có thể tách rời với chương trình và đây là nơi hữu ích để đặt tài liệu dành cho nhà phát triển.

Chúng tôi thậm chí còn đặt các tệp thực thi Windows cho các bản phát hành sản xuất của mình ở đó, để cung cấp một vị trí duy nhất cho những người tìm kiếm phần mềm - các bản phát hành Linux của chúng tôi đi đến một máy chủ vì vậy không cần phải lưu trữ.

- chúng tôi không yêu cầu kho lưu trữ mọi lúc có khả năng cung cấp phiên bản mới nhất để xây dựng và thực thi; một số dự án hoạt động theo cách đó, một số thì không; quyết định thuộc về người quản lý dự án và phụ thuộc vào nhiều yếu tố nhưng tôi nghĩ nó bị phá vỡ khi thực hiện các thay đổi lớn đối với chương trình.


18
* How often do you commit? As often as one would press ctrl + s?

Càng thường xuyên càng tốt. Mã không tồn tại trừ khi nó nằm dưới sự kiểm soát nguồn :)

Cam kết thường xuyên (sau đó là các bộ thay đổi nhỏ hơn) cho phép bạn tích hợp các thay đổi của mình một cách dễ dàng và tăng cơ hội để không phá vỡ một cái gì đó.

Những người khác lưu ý rằng bạn nên cam kết khi bạn có một đoạn mã chức năng, tuy nhiên tôi thấy nó hữu ích để cam kết thường xuyên hơn một chút. Vài lần tôi nhận thấy rằng tôi sử dụng kiểm soát nguồn như một cơ chế hoàn tác / làm lại nhanh chóng.

Khi tôi làm việc trên chi nhánh của riêng mình, tôi muốn cam kết càng nhiều càng tốt (theo nghĩa đen thường xuyên như tôi nhấn ctrl + s).

* What is a Branch and what is a Tag and how do you control them?

Đọc sách SVN - đó là nơi bạn nên bắt đầu khi học SVN:

* What goes into the SVN?

Tài liệu, các tệp nhị phân nhỏ cần thiết để xây dựng và các nội dung khác có giá trị nào đó sẽ được kiểm soát nguồn.


11

Dưới đây là một số tài nguyên về tần suất cam kết, thông điệp cam kết, cấu trúc dự án, những gì cần đặt dưới sự kiểm soát nguồn và các hướng dẫn chung khác:

Những câu hỏi về Stack Overflow này cũng chứa một số thông tin hữu ích có thể được quan tâm:

Về các khái niệm Subversion cơ bản như phân nhánh và gắn thẻ, tôi nghĩ rằng điều này được giải thích rất rõ trong cuốn sách Subversion .

Như bạn có thể nhận ra sau khi đọc thêm một chút về chủ đề này, ý kiến ​​của mọi người về những gì thực hành tốt nhất trong lĩnh vực này thường thay đổi và đôi khi mâu thuẫn. Tôi nghĩ rằng lựa chọn tốt nhất cho bạn là đọc về những gì người khác đang làm và chọn các hướng dẫn và thực hành mà bạn cảm thấy có ý nghĩa nhất đối với bạn.

Tôi không nghĩ nên áp dụng một thực tiễn nếu bạn không hiểu mục đích của nó hoặc không đồng ý với lý do đằng sau nó. Vì vậy, đừng làm theo bất kỳ lời khuyên nào một cách mù quáng mà thay vào đó hãy tự suy nghĩ về những gì bạn nghĩ sẽ tốt nhất cho bạn. Ngoài ra, thử nghiệm các cách làm việc khác nhau là một cách tốt để tìm hiểu và tìm ra cách bạn thích làm việc nhất. Một ví dụ điển hình của việc này là cách bạn cấu trúc kho lưu trữ. Không có cách nào đúng hay sai để làm điều đó và thường rất khó để biết bạn thích cách nào cho đến khi bạn thực sự thử chúng trong thực tế.


8

Cam kết tần suất phụ thuộc vào phong cách quản lý dự án của bạn. Nhiều người không chịu cam kết nếu nó sẽ phá vỡ bản dựng (hoặc chức năng).

Các nhánh có thể được sử dụng theo một trong hai cách, thường là: 1) Một nhánh hoạt động để phát triển (và thân cây ổn định) hoặc 2) nhánh cho các đường dev thay thế.

Các thẻ thường được sử dụng để xác định các bản phát hành, vì vậy chúng không bị lạc trong hỗn hợp. Định nghĩa của 'phát hành' là tùy thuộc vào bạn.


Đồng ý: cam kết miễn là bạn không phá vỡ công trình!
Brandon Montgomery

7

Tôi nghĩ vấn đề chính là bức tranh tinh thần về kiểm soát nguồn bị nhầm lẫn. Chúng tôi thường có thân cây và các nhánh, nhưng sau đó chúng tôi nhận được những ý tưởng không liên quan về thẻ / bản phát hành hoặc thứ gì đó ảnh hưởng đến nó.

Nếu bạn sử dụng ý tưởng về một cái cây hoàn toàn hơn, nó sẽ trở nên rõ ràng hơn, ít nhất là đối với tôi.

Chúng tôi nhận được thân cây -> hình thành các nhánh -> sản xuất trái cây (thẻ / phát hành).

Ý tưởng là bạn phát triển dự án từ một thân cây, sau đó tạo ra các nhánh một khi thân cây đủ ổn định để giữ nhánh. Sau đó, khi chi nhánh đã tạo ra một trái cây, bạn nhổ nó từ chi nhánh và phát hành dưới dạng thẻ.

Thẻ về cơ bản là giao hàng. Trong khi đó thân và cành sản xuất chúng.


4

Như những người khác đã nói, Sách SVN là nơi tốt nhất để bắt đầu và là một tài liệu tham khảo tuyệt vời khi bạn đã nhận được chân biển của mình. Bây giờ, với câu hỏi của bạn ...

Bạn có thường xuyên cam kết không? Thường xuyên như người ta sẽ nhấn ctrl + s?

Thông thường, nhưng không thường xuyên như bạn nhấn ctrl + s. Đó là vấn đề sở thích cá nhân và / hoặc chính sách nhóm. Cá nhân tôi sẽ nói cam kết khi bạn hoàn thành một đoạn mã chức năng, tuy nhỏ.

Chi nhánh là gì và Thẻ là gì và làm thế nào để bạn kiểm soát chúng?

Đầu tiên, thân cây là nơi bạn phát triển tích cực. Đây là dòng chính của mã của bạn. Một nhánh là một số sai lệch so với dòng chính. Nó có thể là một sai lệch lớn, như một bản phát hành trước đó, hoặc chỉ là một tinh chỉnh nhỏ mà bạn muốn thử. Một thẻ là một ảnh chụp nhanh mã của bạn. Đó là một cách để đính kèm nhãn hoặc dấu trang vào một phiên bản cụ thể.

Điều đáng nói là trong lật đổ, thân cây, nhánh và thẻ chỉ là quy ước. Không có gì ngăn bạn thực hiện công việc trong các thẻ hoặc có các nhánh là dòng chính của bạn hoặc bỏ qua sơ đồ thân cây thẻ-nhánh cùng nhau. Nhưng, trừ khi bạn có một lý do rất chính đáng, tốt nhất là nên tuân thủ quy ước.

Điều gì đi vào SVN? Chỉ Mã nguồn hoặc bạn có chia sẻ các tệp khác ở đây không?

Cũng là một lựa chọn cá nhân hoặc nhóm. Tôi thích giữ bất cứ thứ gì liên quan đến bản dựng trong kho lưu trữ của tôi. Điều đó bao gồm các tệp cấu hình, tập lệnh xây dựng, tệp phương tiện có liên quan, tài liệu, v.v. Bạn không nên kiểm tra các tệp cần phải khác nhau trên mỗi máy của nhà phát triển. Bạn cũng không cần phải kiểm tra các sản phẩm phụ của mã của mình. Tôi đang suy nghĩ chủ yếu về các thư mục xây dựng, các tệp đối tượng và những thứ tương tự.


Thông thường, nhưng không thường xuyên như bạn nhấn ctrl + s. Đã đồng ý. Bạn có thể phải lưu các thay đổi của bạn để xem các hiệu ứng. Tôi có thể làm điều đó 10 lần, xây dựng một số mã từng chút một, trước khi tôi có điều gì đó tôi có thể cam kết và có một nhận xét có ý nghĩa về những gì tôi đã làm. Nói cách khác, tôi muốn các bình luận của tôi nói "đã thêm tính năng này" hoặc "đã sửa lỗi đó" và không "chọc vào một vài dòng, không chắc nó sẽ hoạt động như thế nào". Vì vậy, tôi cam kết có thể một nửa tá một ngày.
Nathan Long

4

Eric Sink, người đã xuất hiện trên podcast SO # 36 vào tháng 1 năm 2009, đã viết một loạt bài viết xuất sắc với tiêu đề Source Control How-to .

(Eric là người sáng lập SourceGear , người tiếp thị phiên bản SourceSafe tương thích với trình cắm, nhưng không có sự khủng khiếp.)


4

Chỉ cần thêm một bộ câu trả lời khác:

  • Tôi cam kết bất cứ khi nào tôi hoàn thành một phần của công việc. Đôi khi, đó là một lỗi nhỏ chỉ thay đổi một dòng và tôi mất 2 phút để làm; lần khác, nó là hai tuần mồ hôi. Ngoài ra, theo nguyên tắc thông thường, bạn không cam kết bất cứ điều gì phá vỡ công trình. Do đó, nếu bạn mất nhiều thời gian để làm một cái gì đó, hãy lấy phiên bản mới nhất trước khi cam kết và xem các thay đổi của bạn có phá vỡ bản dựng không. Tất nhiên, nếu tôi đi một thời gian dài mà không cam kết, điều đó khiến tôi không yên tâm vì tôi không muốn mất công việc đó. Trong TFS tôi sử dụng thứ tốt đẹp này làm "kệ" cho việc này. Trong SVN, bạn sẽ phải làm việc theo cách khác. Có lẽ tạo chi nhánh của riêng bạn hoặc sao lưu các tệp này theo cách thủ công sang máy khác.
  • Chi nhánh là bản sao của toàn bộ dự án của bạn. Minh họa tốt nhất cho việc sử dụng của họ có lẽ là phiên bản của sản phẩm. Hãy tưởng tượng rằng bạn đang làm việc tại một dự án lớn (giả sử, nhân Linux). Sau nhiều tháng đổ mồ hôi, cuối cùng bạn đã đến phiên bản 1.0 mà bạn phát hành ra công chúng. Sau đó, bạn bắt đầu làm việc trên phiên bản 2.0 của sản phẩm, điều này sẽ tốt hơn. Nhưng trong thời gian đó cũng có rất nhiều người đang sử dụng phiên bản 1.0. Và những người này tìm thấy lỗi mà bạn phải sửa. Bây giờ, bạn không thể sửa lỗi trong phiên bản 2.0 sắp tới và gửi nó cho khách hàng - nó chưa sẵn sàng. Thay vào đó, bạn phải lấy ra một bản sao cũ của nguồn 1.0, sửa lỗi ở đó và gửi nó cho mọi người. Đây là những gì các chi nhánh dành cho. Khi bạn phát hành 1. 0 phiên bản bạn đã tạo một chi nhánh trong SVN để tạo một bản sao của mã nguồn tại thời điểm đó. Chi nhánh này được đặt tên là "1.0". Sau đó, bạn tiếp tục làm việc trên phiên bản tiếp theo trong bản sao nguồn chính của mình, nhưng bản sao 1.0 vẫn ở đó như thời điểm phát hành. Và bạn có thể tiếp tục sửa lỗi ở đó. Thẻ chỉ là tên gắn liền với phiên bản cụ thể để dễ sử dụng. Bạn có thể nói "Bản sửa đổi 2342 của mã nguồn", nhưng dễ dàng hơn để gọi nó là "Bản sửa đổi ổn định đầu tiên". :)
  • Tôi thường đặt mọi thứ trong điều khiển nguồn liên quan trực tiếp đến lập trình. Ví dụ: vì tôi đang tạo trang web, tôi cũng đặt hình ảnh và tệp CSS trong kiểm soát nguồn, không đề cập đến tệp cấu hình, v.v. Tài liệu dự án không đi vào đó, tuy nhiên đó thực sự chỉ là vấn đề ưu tiên.

3

Những người khác đã tuyên bố rằng nó phụ thuộc vào phong cách của bạn.

Câu hỏi lớn dành cho bạn là tần suất bạn "tích hợp" phần mềm của mình. Phát triển theo hướng thử nghiệm, Agile và Scrum (và nhiều, nhiều người khác) dựa vào những thay đổi nhỏ và tích hợp liên tục. Họ rao giảng rằng những thay đổi nhỏ được thực hiện, mọi người đều tìm thấy sự phá vỡ và sửa chữa chúng mọi lúc.

Tuy nhiên, trên một dự án lớn hơn (nghĩ rằng chính phủ, quốc phòng, 100 nghìn + LỘC) bạn chỉ đơn giản là không thể sử dụng tích hợp liên tục vì điều đó là không thể. Trong những tình huống này, có thể tốt hơn là sử dụng phân nhánh để thực hiện nhiều cam kết nhỏ nhưng mang lại vào thân cây CHỈ những gì sẽ hoạt động và sẵn sàng để được tích hợp vào bản dựng.

Một điều lưu ý với việc phân nhánh là nếu chúng không được quản lý đúng cách, thì đó có thể là một cơn ác mộng trong kho lưu trữ của bạn, vì mọi người đang phát triển từ các điểm khác nhau trên thân cây (đây là một trong những đối số lớn nhất cho hội nhập liên tục).

Không có câu trả lời dứt khoát cho câu hỏi này, cách tốt nhất là làm việc với nhóm của bạn để đưa ra giải pháp thỏa hiệp tốt nhất.



1

Để cam kết, tôi sử dụng các chiến lược sau:

  • cam kết càng thường xuyên càng tốt.

  • Mỗi thay đổi / sửa lỗi tính năng sẽ có một cam kết riêng (không cam kết nhiều tệp cùng một lúc vì điều đó sẽ làm cho lịch sử của tệp đó không rõ ràng - ví dụ: Nếu tôi thay đổi mô-đun ghi nhật ký và mô-đun GUI một cách độc lập và tôi cam kết cả hai cùng một lúc, cả hai thay đổi sẽ hiển thị trong cả hai lịch sử tệp. Điều này làm cho việc đọc lịch sử tệp khó khăn),

  • không phá vỡ bản dựng trên bất kỳ cam kết nào - có thể truy xuất bất kỳ phiên bản nào của kho lưu trữ và xây dựng nó.

Tất cả các tệp cần thiết để xây dựng và chạy ứng dụng nên có trong SVN. Các tệp kiểm tra và không nên, trừ khi chúng là một phần của bài kiểm tra đơn vị.


Quy tắc 1 và 3 của bạn có phần mâu thuẫn. Tuy nhiên, nếu sự phát triển chính được thực hiện trên các nhánh tính năng, quy tắc số 3 có thể là "không phá vỡ thân cây" đối với những thay đổi nhỏ hơn trong đó các nhánh sẽ quá mức cần thiết.
Chris Charabaruk

1

Rất nhiều bình luận tốt ở đây, nhưng một cái gì đó chưa được đề cập là thông điệp cam kết. Những điều này nên là bắt buộc và có ý nghĩa. Đặc biệt với sự phân nhánh / sáp nhập. Điều này sẽ cho phép bạn theo dõi những thay đổi có liên quan đến các tính năng lỗi.

ví dụ svn commit . -m 'bug #201 fixed y2k bug in code'sẽ cho bất cứ ai nhìn vào lịch sử xem bản sửa đổi đó để làm gì.

Một số hệ thống theo dõi lỗi (ví dụ trac) có thể tìm trong kho lưu trữ các thông báo này và liên kết chúng với vé. Điều này làm cho việc tìm ra những thay đổi được liên kết với mỗi vé rất dễ dàng.


1

Chính sách trong công việc của chúng tôi diễn ra như sau (nhóm nhiều nhà phát triển làm việc trên khung hướng đối tượng):

  • Cập nhật từ SVN mỗi ngày để nhận các thay đổi của ngày hôm trước

  • Cam kết hàng ngày vì vậy nếu bạn bị ốm hoặc vắng mặt vào ngày hôm sau, người khác có thể dễ dàng tiếp quản từ nơi bạn rời đi.

  • Không cam kết mã phá vỡ bất cứ điều gì, vì điều đó sẽ ảnh hưởng đến các nhà phát triển khác.

  • Làm việc trên những khối nhỏ và cam kết hàng ngày VỚI NHẬN XÉT Ý NGH MEA!

  • Là một nhóm: Giữ một nhánh Phát triển, sau đó di chuyển mã phát hành trước (cho QA) vào một nhánh Sản xuất. Chi nhánh này chỉ nên có mã làm việc đầy đủ.



0

Tôi nghĩ có hai cách về tần suất cam kết:

  1. Cam kết rất thường xuyên, đối với mỗi phương thức được thực hiện, một phần nhỏ của mã, v.v.
  2. Cam kết chỉ hoàn thành các phần của mã, như các mô-đun, v.v.

Tôi thích cái đầu tiên - bởi vì sử dụng hệ thống kiểm soát nguồn rất hữu ích không chỉ cho dự án hay công ty, thứ nhất là hữu ích cho nhà phát triển. Đối với tôi tính năng tốt nhất là khôi phục lại tất cả các mã trong khi tìm kiếm thực thi nhiệm vụ được giao tốt nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.