2012-07-03 27 views
5

Trong công ty của tôi, chúng tôi có một máy chủ lật đổ và tất cả mọi người đang sử dụng subversion trên máy của họ. Tuy nhiên tôi muốn sử dụng git, cam kết thay đổi cục bộ và sau đó "đẩy" chúng khi tôi sẵn sàng.Là git svn dcommit atomic?

Tuy nhiên, tôi không thể hiểu điều gì xảy ra trong trường hợp sau. Hãy nói rằng tôi đã thực hiện 3 git cam kết tại địa phương và bây giờ tôi đã sẵn sàng để "đẩy" tất cả mọi thứ trên máy chủ lật đổ. Nếu tôi hiểu chính xác, git svn dcommit về cơ bản sẽ thực hiện 3 lần commit trên máy chủ, đúng không? Nhưng điều gì sẽ xảy ra nếu trong thời gian chờ đợi (hãy nói giữa cam kết thứ hai và thứ ba) một đồng nghiệp khác của tôi đưa ra một cam kết? Các kịch bản tôi có thể nghĩ đến là:

1) git loại "ổ khóa" (là ngay cả có thể) máy chủ lật đổ trong cam kết để cam kết của tôi đang làm nguyên tử và một đồng nghiệp của tôi được thực hiện sau khi tôi

?

2) Lịch sử cam kết trên máy chủ trở thành mine1-mine2-other-mine3 (ngay cả khi 'khác' sẽ bị lỗi vì đồng nghiệp của tôi không có bản sao làm việc được cập nhật tại thời điểm đó).

Tôi nghĩ rằng đó là # 2, nhưng có lẽ tốc độ cam kết quá cao khiến điều này hiếm khi trở thành vấn đề. Vậy cái nào là, # 1 hoặC# 2?

+0

không nếu không thành công. Nhưng tôi không biết. (+1) –

Trả lời

5

Không có khóa nào không được hỗ trợ trong Git, không phải là cách Git (cách Git là phân nhánh và hợp nhất). Với git-svn bạn sẽ nhận được lịch sử mine1-mine2-other-mine3. Nếu bạn cần atomicity, có một cái nhìn tại dự án SubGit (nó được cài đặt vào máy chủ SVN và tạo ra một giao diện Git thuần túy cho kho SVN).

Có một số tương tự question gần đây có thể thú vị đối với bạn.

+0

+1 Dù sao thì tôi nghĩ vấn đề là máy chủ SVN không hỗ trợ khóa. Ngay cả khi đó là cách git, không có gì để khóa, tôi sợ. – Emiliano

+0

Bạn chỉ nhận được lịch sử mine1-mine2-other-mine3 nếu bạn may mắn. Nếu bạn không phải là sau đó dcommit của bạn dừng lại và bạn phải làm theo các thủ tục được liệt kê ở trên để có được các cam kết mà không được cam kết trở lại. – Rutix

0

Nếu bạn may mắn sau đó là số 2 nhưng phần lớn thời gian bạn không may mắn như vậy. Theo kinh nghiệm của tôi khi tôi chấp nhận nhiều cam kết và một người khác cam kết trong khi làm điều đó thường xảy ra 2 điều:

  1. Nó dừng lại với những thay đổi khác của bạn.
  2. Bạn mất các cam kết chưa được cam kết.

Số 2 thực sự thực sự gây phiền nhiễu. Vấn đề chính là bạn cần phải cập nhật toàn bộ để sử dụng git svn dcommit. Điều này là do git-svn không cho phép máy chủ hợp nhất các bản sửa đổi khi đang di chuyển. (Bởi vì nó sẽ yêu cầu cả hai người có một cây làm việc với cả hai thay đổi).

Cách duy nhất để giải quyết việc này là các bước sau đây mà tôi thấy here

  1. mở .git/logs/HEAD
  2. Hãy tìm bạn gần đây nhất cam kết (lưu ý rằng những cam kết đều được sắp xếp bởi “ unix time ”, mặc dù bạn cũng có thể tìm thấy phiên bản mới nhất bằng cách đọc shortlog có
  3. Xác nhận rằng cam kết bạn tìm thấy là đúng: git hiển thị
  4. git reset - băm băm từ nhật ký
  5. git svn rebase
  6. git svn dcommit

Tiếp theo thủ tục này cho phép bạn cất cánh từ nơi nó đã thất bại. Tôi hy vọng họ sửa lỗi này sớm nhưng họ nói rằng đây không phải là ưu tiên cho họ.

Tất nhiên nếu bạn truyền các nhóm nhỏ và có kết nối nhanh đến máy chủ, điều đó không nên xảy ra thường xuyên. (Tôi chỉ nhận được 2-3 lần khi làm việc tích cực và cam kết mỗi ngày trong 6 tháng).

+0

Một lựa chọn khác là để đánh bóng trước khi đẩy để tôi chỉ có một cam kết mỗi lần mặc dù nó có thể là khá lớn – Emiliano

+0

Chỉ cam kết một cam kết sẽ cho bạn ít vấn đề hơn. Mặc dù điều này ofcourse kinda đi ngược lại nguyên tắc của toàn bộ cam kết :). Tôi đã thêm một số thông tin về vấn đề chính trong trường hợp này. – Rutix

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