Làm thế nào để các nhóm ngăn chặn ghi đè làm việc trong các tệp nguồn? [đóng cửa]


26

Nó xảy ra với tôi khả năng là trong khi, ví dụ như công cụ trò chơi, đang được xử lý đồng thời bởi nhiều người, làm thế nào để ghi đè bị ngăn chặn?

Giả sử nhà phát triển một đang làm việc Audio.cppnhà phát triển hai cũng đang làm việc Audio.cpp, làm thế nào điều này thường được quản lý trong các nhóm lớn để chống lại việc ghi đè? (Nói cách khác để ngăn nhà phát triển hai mở tệp cho đến khi nhà phát triển kết thúc)


84
Một trong những thẻ bạn đã chọn đã là câu trả lời.
Philipp

18
Trong thực tế, 3 trong 4 thẻ là một câu trả lời, nhưng một là những câu trả lời.
MSalters

Câu trả lời:


69

Hầu hết các nhóm phát triển phần mềm (không chỉ trong phát triển trò chơi) giải quyết vấn đề này bằng phần mềm kiểm soát phiên bản . Ví dụ là

Tất cả các công cụ này có một số khác biệt, nhưng quy trình làm việc cơ bản thường như sau: Có một kho lưu trữ trung tâm cho dự án với cơ sở mã hoàn chỉnh. Khi một nhà phát triển muốn tham gia dự án, họ thực hiện "kiểm tra". Phần mềm kiểm soát phiên bản sao chép cơ sở mã vào máy cục bộ của họ. Phần mềm ghi nhớ phiên bản hiện tại ("sửa đổi") của cơ sở mã. Khi một nhà phát triển thực hiện các thay đổi của họ và muốn đưa chúng vào kho lưu trữ chính, họ thực hiện một "cam kết". Những thay đổi của chúng được tải lên kho lưu trữ trung tâm và một số sửa đổi mới được tạo.

Khi một nhà phát triển khác muốn thực hiện các thay đổi của họ nhưng bản sửa đổi mà họ đã kiểm tra không còn là bản mới nhất, hệ thống kiểm soát phiên bản sẽ không cho phép họ thay đổi. Trước tiên, nhà phát triển cần "kéo" các bản sửa đổi xảy ra trong thời gian đó. Điều này cập nhật bản sao cục bộ của họ lên phiên bản mới nhất trên kho lưu trữ trung tâm. Khi có xung đột (bản sửa đổi trung gian đã thay đổi tệp mà họ cũng đã thay đổi), phần mềm có thể yêu cầu họ giải quyết xung đột bằng cách chỉnh sửa các tệp xung đột theo cách thủ công ("hợp nhất") trong trường hợp không quản lý để tự động làm điều đó. Sau khi họ đã làm điều đó, họ có thể cam kết thay đổi của họ như là một sửa đổi mới.


18
Lưu ý rằng Git và Mercurial là các hệ thống kiểm soát phiên bản phân tán , hoạt động hơi khác một chút: chúng không yêu cầu một kho lưu trữ trung tâm duy nhất, nhưng về mặt lý thuyết cho phép bất kỳ nhà phát triển nào lấy bản cập nhật trực tiếp từ bất kỳ ai khác. Tất nhiên, trong thực tế, vẫn có một kho lưu trữ (thường được đặt trên một máy chủ công cộng như GitHub) đã khai báo "kho chính thức" và sử dụng ít nhiều như kho lưu trữ trung tâm trong hệ thống kiểm soát phiên bản không phân tán.
Ilmari Karonen

18
Câu trả lời này cũng ngụ ý rằng việc hợp nhất luôn được thực hiện thủ công. Tuy nhiên, hầu hết thời gian, phần mềm kiểm soát phiên bản có thể tự động hợp nhất các khác biệt và chỉ yêu cầu công việc thủ công cho những thay đổi thực sự khó khăn.
jhocking

Xin vui lòng tránh thảo luận mở rộng trong ý kiến, folks. Đây không phải là một diễn đàn thảo luận. Sử dụng Trò chuyện Phát triển Trò chơi nếu bạn muốn làm điều đó. Tôi đã làm sạch một số chủ đề bình luận tiếp tuyến.
Josh

Ngoài ra, lý tưởng là mỗi thành viên trong nhóm sẽ phụ trách hầu hết các mô-đun cụ thể và chỉ trong một số trường hợp hiếm hoi, nhiều người sẽ sửa đổi cùng một tệp nguồn trong một khoảng thời gian ngắn, vì quy trình công việc này giảm thiểu nhu cầu hợp nhất các thay đổi xung đột. Nhưng đó không phải là luôn luôn như vậy.
Nicolas Miari

13

Các nhà phát triển không sử dụng cùng một tệp.

Mỗi nhà phát triển có phiên bản riêng của tệp và họ sử dụng một loại phần mềm đặc biệt để quản lý công việc của họ. Nếu cả hai đều thực hiện thay đổi cho nó, thì một trong những cố gắng ghi đè lên các thay đổi được thực hiện bởi nhà phát triển khác sẽ gặp phải một xung đột phải giải quyết, nếu không thì phần mềm tôi đã nói về bắt đầu phàn nàn. Nói cách khác, nhà phát triển gây ra xung đột, cần kết hợp công việc của họ với công việc của nhà phát triển khác và chỉ sau đó tệp mới có thể được "lưu".

Đây là một lời giải thích đơn giản cho một phần của khái niệm kiểm soát phiên bản không đơn giản .


6
Ngoài ra, họ làm điều mới lạ này được gọi là giao tiếp và phần mềm không được viết trong chân không. Vì vậy, nếu họ không hiểu được xung đột, họ sẽ nói chuyện với người khác hoặc phối hợp trước.
Brian

9

Ngoài những điểm được nêu trong các câu trả lời khác về kiểm soát phiên bản và xử lý xung đột với sáp nhập, có ít nhất hai cách khác mà các thành viên trong nhóm có thể tránh ghi đè lên công việc của nhau:

  • Một số hệ thống kiểm soát phiên bản (ví dụ SVN) cho phép khóa các tệp. Điều này có nghĩa là một thành viên trong nhóm có thể sở hữu độc quyền một tệp trong một khoảng thời gian, ngăn các thành viên khác trong nhóm thực hiện các chỉnh sửa mâu thuẫn (hoặc, thực sự, bất kỳ chỉnh sửa nào) cho đến khi tệp được mở khóa sau đó.

    Tuy nhiên, điều này thường được sử dụng không thường xuyên, vì nó có thể gây ra một số vấn đề. Nó có thể làm giảm năng suất (bằng cách giới hạn người có thể làm việc trên các tệp tại bất kỳ thời điểm cụ thể nào) và có thể gây ra sự cố nếu ai đó quên mở khóa tệp. Ngoài ra, ít nhất là đối với SVN (tôi không chắc chắn về các VCS khác), việc khóa tệp không ngăn người khác thay đổi bản sao làm việc của họ, điều đó chỉ ngăn họ thực hiện các thay đổi của họ - điều này có thể gây lãng phí nỗ lực nếu nhà phát triển chỉ sửa đổi tệp để phát hiện ra họ không thể cam kết thay đổi vì nó bị khóa.

  • Các nhóm có thể cố gắng phân công nhiệm vụ cho các nhà phát triển theo cách mà họ không có nhiều người làm việc trên bất kỳ tệp cụ thể nào tại một thời điểm nhất định. Ví dụ: mỗi nhà phát triển có thể chịu trách nhiệm cho một phần cụ thể của dự án (ví dụ: kết xuất 3D, mạng, âm thanh, v.v.) - nếu cơ sở mã hóa được mô đun hóa tốt, thì nhà phát triển được gán cho mã mạng sẽ không cần phải chạm vào các tệp đối phó với âm thanh.

    Tất nhiên, sẽ luôn có một số chồng chéo phải được quản lý theo một cách khác.


2
Về mặt tích cực, khóa là cách duy nhất bạn có thể chỉnh sửa .JPEG hoặc tệp văn bản không đơn giản khác. Đây không phải là một hạn chế về mặt lý thuyết, chỉ là các công cụ hợp nhất thường hút.
MSalters

2
@MSalters Không phải là các công cụ hút, chỉ là hầu hết các công cụ hợp nhất được tạo cho văn bản, không phải cho dữ liệu nhị phân. Và bạn sẽ giải quyết xung đột như thế nào nếu hai thay đổi sửa đổi cùng một pixel trong một tệp? Hoặc thậm chí tệ hơn, bạn sẽ tính đến những thay đổi do nén JPEG gây ra như thế nào? Đây là một vấn đề rất phức tạp, thậm chí có thể không có một giải pháp tốt duy nhất, vì vậy lý do hầu hết các công cụ hợp nhất không hỗ trợ là vì nhu cầu đó rất hiếm và chức năng khó thực hiện.
Maurycy

3
@MaurycyZarzycki: Thay đổi cùng một chữ cái tương tự như thay đổi cùng một pixel: cần giải quyết thủ công. .JPEG có lẽ là một ví dụ tồi, bây giờ tôi nhận ra, vì các nghệ sĩ không làm việc trên các định dạng mất mát. Nhưng vấn đề hợp nhất cũng tồn tại với .PNG. Ít nhất, bạn sẽ đánh giá cao nếu các công cụ hợp nhất có thể hợp nhất XML mà không phá vỡ nó.
MSalters

@MSalters Chắc chắn, với điều đó tôi có thể đồng ý nhiều hơn nữa.
Maurycy

1
@xorsyst: Hãy thử theo cách này: kiểm tra từ SVN ở hai địa điểm. Sau đó khóa tệp từ vị trí 1. Vị trí 2 sẽ không biết nó bị khóa cho đến khi xác nhận hoặc cập nhật.
Zan Lynx
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.