2009-04-15 26 views
44

Tôi muốn có một kho lưu trữ git trống được lưu trữ trên một mạng chia sẻ (cửa sổ). Tôi sử dụng Linux, và có chia sẻ mạng được gắn kết với CIFS. Đồng nghiệp của tôi sử dụng windows xp, và có chia sẻ mạng tự động (từ ActiveDirectory, bằng cách nào đó) như một ổ đĩa mạng.Đồng thời trong một repo GIT trên một thư mục chia sẻ mạng

Tôi tự hỏi liệu tôi có thể sử dụng repo từ cả hai máy tính, mà không có vấn đề đồng thời.

Tôi đã thử nghiệm, và cuối cùng tôi có thể sao chép ok, nhưng tôi sợ những gì có thể xảy ra nếu cả hai chúng tôi truy cập cùng một repo (đẩy/kéo), cùng một lúc.

Trong câu hỏi thường gặp, có một tham chiếu về cách sử dụng hệ thống tệp mạng (và một số vấn đề với SMBFS), nhưng tôi không chắc liệu có bất kỳ khóa tệp nào được thực hiện bởi mạng/máy chủ/windows/linux hay không khá chắc chắn không có.

Vì vậy, có ai đã sử dụng repo git trên mạng chia sẻ, không có máy chủ và không có sự cố không?

Cảm ơn bạn,
Alex

PS: Tôi muốn tránh sử dụng một máy chủ http (hoặc git-daemon), bởi vì tôi không có quyền truy cập vào máy chủ với các cổ phiếu. Ngoài ra, tôi biết chúng tôi có thể chỉ cần đẩy/kéo từ một đến khác, nhưng chúng tôi được yêu cầu phải có mã/repo trên chia sẻ vì lý do sao lưu.

Cập nhật:

lo lắng của tôi không phải là về khả năng của một thất bại mạng. Mặc dù vậy, chúng tôi sẽ có các chi nhánh cần thiết tại địa phương, và chúng tôi sẽ có thể biên dịch các nguồn của chúng tôi.

Tuy nhiên, chúng tôi thường cam kết khá thường xuyên và cần phải rebase/merge thường xuyên. Theo quan điểm của tôi, lựa chọn tốt nhất là để có một repo trung tâm trên phần (vì vậy các bản sao lưu được đảm bảo), và chúng tôi sẽ nhân bản từ đó, và sử dụng nó để rebase.

Nhưng, do thực tế chúng tôi đang làm điều này thường xuyên, tôi sợ về tệp/repo tham nhũng, nếu điều đó xảy ra mà cả hai chúng tôi đều đẩy/kéo cùng một lúc. Thông thường, chúng tôi có thể hét lên với nhau mỗi khi chúng tôi truy cập repo từ xa :), nhưng sẽ tốt hơn nếu bảo mật máy tính/mạng. Và, có thể GIT có một cơ chế nội bộ để làm điều này (vì ai đó có thể đẩy vào một trong các bản Repos của bạn, trong khi bạn làm việc trên nó), nhưng tôi chưa tìm thấy bất cứ điều gì kết luận.

Cập nhật 2:

Các repo trên ổ đĩa cổ phiếu sẽ là một repo trần, không chứa một bản sao làm việc.

+3

Cảm ơn câu hỏi Alex, tôi đang đối mặt với tình huống tương tự và điều này rất hữu ích. Một số điểm cần thêm: bạn cần phải shure rằng cả hai bạn đang sử dụng cùng một phiên bản của git, bởi vì các cửa sổ và linux exe sẽ làm việc trên cùng một repo trần trên mạng chia sẻ và trong lý thuyết nó là possibe để có một số sự khác biệt giữa các phiên bản . Có lẽ không chỉ là một lá cờ mà bạn cần phải ghi nhớ. –

+0

Xem thêm: http://stackoverflow.com/questions/1489542/are-there-any-concurrency-issues-in-backing-up-git –

+0

Có thể hữu ích khi giới hạn số lượng người dùng đồng thời thành 1 bằng cách truy cập Tùy chọn Chia sẻ Nâng cao cho thư mục – Omar

Trả lời

39

Git yêu cầu khóa tệp tối thiểu, mà tôi tin là nguyên nhân chính gây ra sự cố khi sử dụng loại tài nguyên được chia sẻ này qua hệ thống tệp mạng. Lý do nó có thể thoát khỏi điều này là hầu hết các tệp trong repo Git --- tất cả các tệp tạo thành cơ sở dữ liệu đối tượng --- được đặt tên như một thông báo về nội dung của chúng và không thay đổi khi được tạo. Vì vậy, có vấn đề của hai khách hàng đang cố gắng sử dụng cùng một tệp cho nội dung khác nhau không xuất hiện.

Phần khác của cơ sở dữ liệu đối tượng phức tạp hơn - các tệp được lưu trữ trong các tệp trong thư mục "refs" (hoặc trong "refs") và những thay đổi này: mặc dù các tệp refs/* nhỏ và luôn được viết lại thay vì được chỉnh sửa. Trong trường hợp này, Git ghi dữ liệu mới vào một tệp ".lock" tạm thời và sau đó đổi tên nó thành tệp đích. Nếu hệ thống tệp tuân theo các ngữ nghĩa O_EXCL, điều đó an toàn. Ngay cả khi không, điều tồi tệ nhất có thể xảy ra sẽ là một cuộc đua ghi đè lên một tập tin ref. Mặc dù điều này sẽ gây khó chịu khi gặp phải, nó không nên gây ra tham nhũng như vậy: nó chỉ có thể là trường hợp bạn đẩy đến repo được chia sẻ, và việc đó có vẻ như nó đã thành công trong khi thực tế là người khác đã làm. Nhưng điều này có thể được sắp xếp chỉ đơn giản bằng cách kéo (sáp nhập vào cam kết của người khác) và đẩy lại. Tóm lại, tôi không nghĩ rằng repo tham nhũng là quá nhiều của một vấn đề ở đây --- đó là sự thật rằng mọi thứ có thể đi một chút sai do các vấn đề khóa, nhưng thiết kế của repo Git sẽ giảm thiểu thiệt hại .

(Disclaimer: tất cả điều này nghe có vẻ tốt về mặt lý thuyết, nhưng tôi đã không thực hiện bất kỳ búa đồng thời của một repo để kiểm tra nó ra, và chỉ chia sẻ chúng qua NFS không CIFS)

+0

Cảm ơn bạn! Đối với một số lời giải thích như thế này tôi đang tìm kiếm. Tôi sẽ thử, và xem có điều gì xấu xảy ra không, và tôi sẽ cập nhật câu hỏi này. Chúc bạn một ngày vui vẻ! – Alex

+0

bạn có thể cung cấp một URL hoặc một cái gì đó mà điều này được đề cập sâu hơn không? nó thật sự rất thú vị – knocte

7

Tại sao phải bận tâm? Git được thiết kế để phân phối. Chỉ cần có một kho lưu trữ trên mỗi máy và sử dụng cơ chế xuất bản và kéo để truyền các thay đổi của bạn giữa chúng.

Vì mục đích sao lưu, hãy chạy tác vụ hàng đêm để sao chép kho lưu trữ của bạn vào phần chia sẻ.

Hoặc, tạo một kho lưu trữ trên mỗi chia sẻ và thực hiện công việc của bạn từ chúng nhưng sử dụng chúng làm kho lưu trữ được phân phối để bạn có thể kéo các thay đổi từ nhau. Nếu bạn sử dụng phương pháp này, thì hiệu suất của việc xây dựng và như vậy sẽ giảm kể từ khi bạn sẽ liên tục truy cập qua mạng.

Hoặc, có kho lưu trữ được phân phối trên máy tính của riêng bạn và chạy tác vụ định kỳ để đẩy các cam kết của bạn đến kho lưu trữ trên chia sẻ.

+0

Tôi nghĩ rằng câu hỏi thực sự từ alexandrei không phải là về bản chất phân tán nhưng điều gì sẽ xảy ra nếu push sẽ thất bại do lỗi CIFS/windows share (vấn đề gắn kết, ngắt kết nối, v.v.) –

+0

vấn đề là tại sao phải lo lắng? Bạn không cần phải nếu bạn chỉ đơn giản là sử dụng git cách nó được thiết kế –

+0

Tôi nghĩ rằng điểm cuối cùng ở đây trả lời câu hỏi khá thanh lịch. Chỉ cần có repo của mỗi máy tính được tự động đẩy vào chia sẻ tại các thời điểm khác nhau. – supercheetah

-2

Có vẻ như bạn muốn sử dụng hệ thống phiên bản tập trung, do đó truy vấn sao lưu được satisifed. Có lẽ với xxx2git ở giữa để bạn làm việc tại địa phương.

+0

Đó là những gì chúng tôi hiện đang làm, với SVN ở giữa - nhưng đó là cùng một vấn đề, không có máy chủ, chúng tôi đang sử dụng nó dựa trên tập tin. Đây là một trong những lý do để chuyển sang GIT (và thực tế là nó phù hợp hơn với công việc của chúng tôi, để chuyển đổi giữa các nhánh khác nhau trong cùng một nền công việc) – Alex

5

Rõ ràng sử dụng một git repo trung ương được hỗ trợ. Hầu hết các cách sử dụng theo quy định đều cho thấy truy cập ssh hoặc http, không ai trong số đó tránh truy cập đồng thời vào repo. Ngay cả khi bạn đang sử dụng hoàn toàn phân tán, câu hỏi này nảy sinh nếu có nhiều hơn hai cộng tác viên đẩy cùng repo vào bất kỳ đâu. Cho đến nay, không có phản ứng nào trả lời câu hỏi. Liệu thiết kế của git cho phép nó xử lý N đồng thời đẩy đến một chi nhánh?

Các vấn đề liên quan