2010-01-08 33 views
20

Tôi đang cố gắng sử dụng Git làm giao diện người dùng cho kho SVN để có thể sử dụng các tính năng đẹp của Git như phân nhánh đơn giản, stashing, v.v.Git-svn có thể được sử dụng trên các kho lưu trữ lớn, phân nhánh không?

Vấn đề là kho SVN khá lớn (8.000 vòng quay) và chứa rất nhiều chi nhánh và thẻ (cũ cũng như mới).

Đó là bố cục chuẩn gần, với cấu hình chứa chỉ dẫn tìm nạp, chi nhánh và thẻ.

Vì chi nhánh và thẻ lâu đời nhất đề cập đến bản sửa đổi 10, điều này có nghĩa là mỗi svn fetch đọc toàn bộ lịch sử lưu trữ từ bản sửa đổi 10 trở đi, có thể mất hàng giờ trên kết nối chậm.

Nếu tôi chỉ theo dõi thân cây, thì không sao, nhưng tôi vẫn muốn làm cho nhận biết về các chi nhánh và thẻ mới.

Tôi thường xem git log -1 trên nhánh tôi đang ở và nhận sửa đổi SVN từ nhận xét, vì vậy tôi có thể thực hiện git svn fetch -r7915:HEAD hoặc tương tự. Tôi đoán đó là những gì git svn fetch --parent. Nhưng tại sao tôi cần phải làm điều này?

Tôi đang sử dụng Windows và sử dụng TortoiseGit có hỗ trợ khá tốt cho git-svn, nhưng vì TortoiseGit chỉ chạy git svn fetch Tôi bị kẹt.

Tôi có làm gì sai không? Tôi mong đợi svn fetch hoạt động nhanh khi svn clone -s đầu tiên hoàn tất.

Trả lời

3

Bạn đang sử dụng chính xác: việc nhập ban đầu kho lưu trữ Subversion với nhiều lịch sử sẽ rất chậm.

Tin xấu là vì các nhánh và thẻ của Subversion chỉ là các thư mục, git-svn buộc phải đi theo con đường bi quan để đọc từng chi nhánh từ đầu đến tận sửa đổi đầu tiên. Có, nếu bạn đã bị xử lý kỷ luật trong việc sử dụng Subversion, điều này sẽ dẫn đến nhiều lần tìm nạp cùng một dữ liệu, nhưng các mẫu sử dụng trong thế giới thực làm cho trường hợp này trở thành một trường hợp không chắc chắn.

Bắt đầu bản sao vào buổi tối và quay lại một buổi họp mặt vui vẻ vào sáng hôm sau!

Khi bạn đã nhân bản, git svn fetch thậm chí cảnh báo bạn:

This may take a while on large repositories

Subversion là đơn giản và ngu ngốc, vì vậy git có để có những điều chậm rãi.

+1

Cảm ơn bạn đã trả lời. Tôi không có vấn đề gì khi bản sao ban đầu mất thời gian, nhưng mọi hoạt động tìm nạp sau đó phải trải qua hầu như tất cả các bản sửa đổi có vẻ sai. –

5

Nếu bạn không cần phải có lịch sử đầy đủ trong kho git, tôi khuyên bạn hãy xem cách tiếp cận "git + svn", được nêu chi tiết trong liên kết bên dưới, thay vì tích hợp git-svn chuẩn. Nhập ban đầu của bạn vào git phải rất nhanh, vì bạn sẽ không nhập lịch sử.

Đảm bảo đọc phần có tiêu đề "Lợi ích, nhược điểm và bài học".

http://www.lostechies.com/blogs/derickbailey/archive/2010/02/03/branch-per-feature-how-i-manage-subversion-with-git-branches.aspx

+0

Đây là một giải pháp tốt nếu bạn đang cố gắng sử dụng git để tránh những thiếu sót của svn trong một môi trường mà bạn bất lực để thực hiện chuyển đổi đầy đủ. Bạn không thực sự cần nó là một khách hàng lật đổ đầy đủ, chỉ để cung cấp cho bạn một số sức mạnh của git. Nice writeup. – captncraig

+0

Tôi cũng thích cách tiếp cận "git + svn" được mô tả trong liên kết mà @Jordan đăng. Tuy nhiên NetBeans (7.0.1) dường như không thể làm việc với nó. Nó xác định dự án như là một thanh toán subversion nhưng không thể nhìn thấy repo git bên trong nó. – michael

12

Cảm ơn câu trả lời. Tuy nhiên, họ không thực sự giúp tôi.

Lệnh này là giải pháp tốt nhất cho đến nay:

git svn log --all -1 | \ 
    sed -n '2s/r\\([0-9]*\\).*/\\1/p' | \ 
    xargs --replace=from git svn fetch -r from:HEAD

Nó sử dụng git svn log --all để tìm số SVN sửa đổi cao nhất lấy cho đến nay, và lấy tất cả mọi thứ từ thời điểm đó trở đi.

Tôi muốn git svn fetch sẽ có tùy chọn để xử lý như thế này. Trừ khi các sửa đổi của SVN được thay đổi, không có lý do nào git svn nên tìm nạp các bản sửa đổi tương tự hơn và hơn mỗi lần.

+0

Cảm ơn bạn đã thực hiện điều này ở đây. Rất nhiều người đang tìm cách sử dụng Git với các hệ thống kiểm soát nguồn khác. – Jordan

+1

Trên repo SVN của tôi mà có tấn cam kết, lệnh trên là đau đớn chậm - nó buộc git-svn để quay trở lại đầu của repo để tìm lịch sử. – MikeHoss

+0

bản sửa đổi CHÍNH của bản sao làm việc là: 'git svn find-rev HEAD ' do đó cách ngắn nhất để tìm bản sửa đổi được tải xuống lần cuối cho bản sửa đổi CHÍNH của từ xa là: ' git svn fetch -r \' git svn find-rev HEAD \ ': HEAD' –

0

Bạn có liên kết tượng trưng trong repo SVN không? Nếu không được, bạn đã thử cài đặt này:

svn.brokenSymlinkWorkaround

này vô hiệu hóa khả năng kiểm tra tốn kém để workaround vỡ symlink kiểm tra vào SVN bằng bị phá vỡ khách hàng. Đặt tùy chọn này thành "false" nếu bạn theo dõi một kho lưu trữ SVN với nhiều các đốm màu trống không phải là các liên kết tượng trưng. Tùy chọn này có thể thay đổi trong khi git svn đang chạy và có hiệu lực trên bản sửa đổi tiếp theo được tìm nạp. Nếu không được đặt, git svn giả định tùy chọn này là "true".

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