2009-08-21 86 views
6

Tôi mệt mỏi vì bị lật đổ, nó vẫn làm hỏng kho lưu trữ của chính nó. Như tôi đã cho một thời gian dài của git và luôn luôn muốn thử nó ra, tôi đã quyết định để cho nó một đi và sử dụng git-svn. Nhưng đọc qua tài liệu tôi nhận ra rằng bạn không thể sử dụng nhiều git awesomeness với nó. Bạn không thể sử dụng git-pull, nó không được khuyến khích để tạo ra các chi nhánh địa phương và có rất nhiều hạn chế. Có vẻ như nó không phải là tốt hơn nhiều so với việc sử dụng subversion trực tiếp. Hoặc là nó? Những gì ưu và nhược điểm git-svn có hơn svn đơn giản?Ưu và nhược điểm của việc sử dụng git-svn là gì?

PS. Tôi xin lỗi nhưng tôi không hỏi bạn làm thế nào để sửa chữa kho lưu trữ subversion của tôi, tôi không quan tâm nhiều. Xóa tất cả .svn và thanh toán trong cùng một thư mục qua đêm hoạt động tốt. Tôi chỉ tự hỏi những lợi ích mà git-svn mang lại cho bảng.

+7

Bạn thực sự không nên gặp vấn đề về lật đổ như vậy. Kho lưu trữ Subversion mà chúng tôi quản lý tại nơi làm việc khá lớn (hơn 10.000 tệp) và chúng tôi chưa bao giờ có bất kỳ vấn đề tham nhũng nào với nó. Âm thanh giống như một vấn đề phần cứng, tham nhũng tùy ý sẽ không bao giờ xảy ra. – Kezzer

+3

Tôi đoán kho lưu trữ của bạn không được sử dụng bởi những người không lập trình :) Họ có thể phá vỡ mọi thứ. – vava

+0

@vava: Những người không lập trình có thể có thể bẻ khóa copy_ của họ và mất rất nhiều công việc, nhưng họ chắc chắn không thể phá vỡ _repository_. Một cái gì đó có vẻ như là cá ở đó và nếu tôi là bạn, tôi sẽ cố gắng tìm ra cách điều này xảy ra trước khi làm bất cứ điều gì khác. – sbi

Trả lời

4

Ưu điểm:

  • Tất cả những gì Git là tốt cho:
    • mạng miễn phí truy cập vào tất cả cũ cam kết
    • Cam kết và rebase trong Git (một lần nữa, mạng miễn phí) và sau đó git svn dcommit để đẩy tất cả những thay đổi để SVN for a nice sạch cam kết
    • giá rẻ nhánh địa phương (không chắc chắn lý do tại sao bạn nói điều này không làm việc rất tốt)
  • Đừng có để đối phó với SVN rất nhiều :)

Nhược điểm:

  • công việc tốt hơn nhiều nếu bạn đã biết cả Git và SVN (ví dụ, không phải như vậy tốt cho người dùng kiểm soát nguồn mới)
  • sẽ nhầm lẫn bất cứ ai khác nếu họ nhìn vào những gì bạn đang làm
  • Một số tính năng của SVN (chẳng hạn như svn: keywords) không khả dụng/thuận tiện
+0

Tôi buộc phải sử dụng SVN tại trường đại học và vẫn thích sử dụng Git với cây cầu SVN. Điều đó nói rằng, bạn không thể tận dụng triệt để Git cho đến khi SVN ra khỏi phương trình. –

2

Kinh nghiệm của tôi với git-svn là nó chủ yếu có ích cho những người dùng git-người dùng có kinh nghiệm muốn có giao diện giống như git cho repo lật đổ. Đồng hóa cả hai tập hợp các khái niệm và những hạn chế của git-svn là quá ít nhất đối với tôi.

Nếu có thể, tôi khuyên bạn nên chuyển sang git hoàn toàn.

Tôi đã thấy nhiều người phàn nàn về Subversion, nhưng theo như tôi biết nó khá ổn định. Bạn có chắc là bạn không gặp sự cố phần cứng?

+0

Vâng, tôi chắc chắn :) Đôi khi nó bị hỏng khi tên tệp quá dài hoặc nếu kết nối đi về phía nam ở giữa cam kết. Đối phó với kho lưu trữ 2GB không dễ dàng cho việc lật đổ kém. Quá tệ tôi không thể chuyển sang git hoàn toàn. – vava

+0

Bạn đã yêu cầu trợ giúp trong danh sách gửi thư của SVN chưa? Tôi cá là họ sẽ rất quan tâm đến những vấn đề như vậy. – sbi

+0

Nó là vô ích, tôi không có một trường hợp thử nghiệm để hiển thị chúng anyway. – vava

0

Tôi không thấy khó khăn khi di chuyển tất cả kho lưu trữ svn sang git, giữ lịch sử và tất cả khác trong đó, và hơn là chuyển sang git hoàn toàn.

2Gb là nhiều cho một kho lưu trữ. Có thể là nó có giá trị để chia nó thành một số bộ phận?

+0

Thật không may, tôi không phải là nhân viên duy nhất :) Và những người không lập trình viên có thể hiểu Tortoise SVN ở một mức độ nào đó, git sẽ quá khắc nghiệt với họ. Vì vậy, di chuyển đến git không phải là một lựa chọn đáng buồn. – vava

1

Nếu việc sử dụng là:

  • "Chúng tôi tiếp tục SVN nhưng có Git cho nhánh nội bộ nhanh", không cần phải sử dụng git-svn: bạn có thể 'git init' trực tiếp trong một chi nhánh của không gian làm việc lật đổ và git Hack trực tiếp trong phần đó của mã của bạn.

Nhưng nếu điều này là:

  • "Chúng tôi duy trì cả một repo SVN trung ương và một repo Git", sau đó điều này là hơi phức tạp hơn, bởi vì:
    • một đơn giản git-svn sẽ sinh sản "Chi nhánh SVN" (thực sự là thư mục đơn giản có bản sao trong đó), vì vậy tôi khuyên bạn nên sử dụng svn2git and git2svn
    • cố gắng nhập mọi thứ vào một kho lưu trữ Git là không phải lúc nào cũng là ý tưởng hay (xem "What are the git limits?"): nếu hệ thống của bạn bao gồm các mô-đun khác nhau có thể được phát triển độc lập với nhau, chúng có thể nằm trong một kho lưu trữ trung tâm SVN duy nhất, nhưng chúng phải có repo Git tương ứng để có thể để kéo chỉ các module bạn cần)
1

Tôi nghĩ thay đổi thành git sẽ không giải quyết được vấn đề của bạn. Nếu bạn có "không lập trình" bên trong lực lượng lao động của bạn và họ sẽ phá vỡ những người khác làm việc sao chép (tôi giả định bằng cách đổi tên/loại bỏ các thư mục hoặc tập tin).

Nếu bạn sử dụng git-svn hoặc git hoặc bất kỳ VCS nào khác và mọi người vẫn đổi tên/xóa thư mục của họ, cách này sẽ tốt hơn thế nào?

Tôi nghĩ bạn nên cố gắng đào tạo một số người để hiểu các khái niệm cơ bản của VCS.

Nếu mọi người không hiểu quy trình làm việc của SVN, tôi nghi ngờ họ sẽ làm chủ git-svn, hoặc git.

+0

Đó là lý do tại sao tôi muốn ẩn đằng sau git-svn :) Tôi không biết điều này chắc chắn nhưng tôi muốn nghĩ rằng git chỉ nâng cao hơn và sẽ không phá vỡ dễ dàng. – vava

+0

git-svn sẽ giới thiệu độ phức tạp hơn và sẽ dễ dàng bị phá vỡ như svn, nếu bạn xóa và đổi tên tệp một cách dữ dội và cố gắng hợp nhất. Bạn thực sự nên tìm kiếm nguồn gốc của các vấn đề của bạn. –

3

Đây là những người chuyên nghiệp và sử dụng git-svn. Vì vậy, nó không thực sự về git chính nó.

Pro:

Xu hướng của những người sử dụng svn là để cam kết những thay đổi lớn cùng một lúc, bởi vì bạn cần phải cam kết qua dây dẫn. Cách tiếp cận này có thể là xấu bởi vì đôi khi những thay đổi có thể không liên quan với nhau. ví dụ: Bạn có thể có các thay đổi với sửa lỗi và thay đổi đối với tính năng mới được cam kết trên một changeset. Với git tôi có thể cam kết thường xuyên với kho git cục bộ của mình (đặc biệt là khi tôi không kết nối với mạng) và có một thay đổi nhỏ nhất có thể. Sau đó tôi cam kết svn (sử dụng 'git svn dcommit') khi toàn bộ các thay đổi lớn đã sẵn sàng.

Côn:

Các con là đã svn như kho lưu trữ từ xa được sáp nhập, đặc biệt là khi có xung đột. Đôi khi nó có thể gây đau đớn. Tôi sử dụng IntelliJ làm IDE của mình và để giải quyết xung đột, tôi phải đi đến dòng lệnh để sửa chữa nó. Biết rằng tôi gặp phải vấn đề này thường xuyên, I have documented it và bây giờ nó không trở thành một vấn đề lớn nữa đối với tôi.

+5

Liên kết của bạn đã chết. –

3

Tôi di chuyển sang git bằng git-svn. Kho svn của chúng tôi vẫn còn nguyên vẹn và chúng tôi vẫn nhận được tất cả các "git awesomeness". Về cơ bản sau khi git-svn nhân bản bạn phân nhánh lại thành 'thân cây' của bạn. Mọi người sử dụng git sẽ phân nhánh từ đây. Khi bạn cần cập nhật từ svn, bạn chỉ cần thực hiện lệnh git-svn rebase và sau đó thực hiện git merge --squash từ nhánh svn đến new 'trunk'. Và ngược lại. Điều này có nghĩa là lịch sử của bạn trên repo svn sẽ không khớp với những gì trong git. Khi bạn làm nhiều hơn thì một hợp nhất, tại một số điểm bạn sẽ phải bắt đầu ghép các cam kết vì lịch sử không khớp. Tuy nhiên, nếu bạn ghép HEAD của git trunk của bạn đến id cam kết cuối cùng đã được hợp nhất đè bẹp, bạn sẽ nhận được cùng một hiệu ứng.

Ok vì vậy, hãy để tôi giải thích điều này tốt nhất có thể với ví dụ.

svn repo: svn: //xyz.com/myproject

git svn clone svn://xyz.com/myproject 

này nên để lại cho bạn với một thiết lập git-svn bình thường với một chi nhánh tổng thể trong đó có lịch sử tương tự như kho svn.

git checkout -b git_trunk 

git_trunk trở thành "thân cây" cho người dùng git.

Chi nhánh này có thể được sử dụng tự do như bất kỳ kho lưu trữ git nào khác.

Bây giờ bạn cần phải đồng bộ hóa hai chi nhánh này qua git merge --squash

Ví dụ .. sáp nhập từ các chi nhánh chủ svn để git_trunk

git checkout git_trunk 
git merge --squash master 
git commit -a 

Bạn sẽ làm điều tương tự để sáp nhập từ git_trunk để làm chủ svn ngoại trừ bạn sẽ thực hiện

git svn dcommit 

này sẽ đẩy nó trở lại svn.

Vì vậy, phần phức tạp ở đây là vì chúng tôi đang sử dụng --squash lịch sử hợp nhất bị mất và git tổ tiên chung duy nhất sẽ biết là điểm chi nhánh. Điều này có nghĩa là xung đột hợp nhất.Cách tôi giải quyết nó là bằng cách làm một cái gì đó như thế này

Hợp nhất từ ​​git_trunk để làm chủ. Đầu tiên tôi lấy id commit của squash cuối cùng trên git_trunk. Cho phép gọi nó là ABCDEFG. Sau đó, tôi nhận được cam kết-d của git_trunk. Cho phép nói HIJKLMNO của nó

echo "HIJKLMNO ABCDEFG" > .git/info/grafts 

Điều này sẽ cho git khi hợp nhất tổ tiên chung nhất là cam kết đè bẹp gần đây nhất.

Nó không hoàn hảo nhưng nó hoạt động tuyệt vời cho tôi. Đặc biệt là bây giờ kể từ khi hầu như tất cả mọi người là trên git.

+0

Vì vậy, bạn đã tạo một kho lưu trữ git công khai mà mọi người thích git đang sử dụng và thỉnh thoảng bạn chỉ cam kết tất cả những thay đổi đó thành một phiên bản lật đổ chính. Những người nghèo còn lại trên svn không thể đổ lỗi nữa :) – vava

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