Làm gì với lịch sử svn lớn khi chuyển sang git?


23

Chỉnh sửa: không giống như một số câu hỏi tương tự như Chuyển một repo SVN nhiều GB sang Git hoặc /programming/540535/managing-large-binary-files-with-git Kịch bản của tôi không liên quan đến một số tiểu dự án có thể dễ dàng chuyển đổi thành các mô đun con git, cũng không phải là một vài tệp nhị phân rất lớn rất phù hợp với git-annex. Nó là một kho lưu trữ duy nhất trong đó các nhị phân là bộ kiểm tra được kết hợp chặt chẽ với mã nguồn chính của cùng một sửa đổi, giống như nếu chúng là các tài sản thời gian như đồ họa.

Tôi đang điều tra chuyển đổi kho lưu trữ mã có kích thước trung bình / lớn (50 người dùng, 60k, lịch sử 80Gb, bản sao làm việc 2Gb) từ svn. Khi số lượng người dùng tăng lên, có rất nhiều sự thay đổi trong thân cây và các tính năng thường được trải rộng trên nhiều cam kết khiến cho việc xem xét mã khó thực hiện. Ngoài ra, không có sự phân nhánh, không có cách nào để "chuyển" mã xấu ra, các đánh giá chỉ có thể được thực hiện sau khi nó được cam kết trung kế. Tôi đang điều tra các lựa chọn thay thế. Tôi đã hy vọng chúng ta có thể chuyển sang git, nhưng tôi gặp một số vấn đề.

Vấn đề với repo hiện tại theo như git đi là kích thước. Có rất nhiều tàu cũ trong đó, và làm sạch nó bằng --filter-Branch khi chuyển đổi thành git có thể cắt giảm kích thước của nó theo một độ lớn, khoảng 5-10GB. Điều này vẫn còn quá lớn. Lý do lớn nhất cho kích thước kho lưu trữ lớn là có rất nhiều tài liệu nhị phân được đưa vào để kiểm tra. Các tệp này khác nhau trong khoảng từ 0,55 đến 30mb và có hàng trăm. Họ cũng có khá nhiều thay đổi. Tôi đã xem xét các mô hình con, git-annex, v.v., nhưng có các thử nghiệm trong một mô hình con cảm thấy sai, cũng như có phụ lục cho nhiều tệp mà bạn muốn có lịch sử đầy đủ.

Vì vậy, bản chất phân tán của git thực sự là thứ ngăn cản tôi áp dụng nó. Tôi không thực sự quan tâm đến phân phối, tôi chỉ muốn các tính năng hợp nhất phân nhánh và mạnh mẽ giá rẻ. Giống như tôi giả sử 99,9% người dùng git làm, chúng tôi sẽ sử dụng kho lưu trữ trung tâm hoàn toàn may mắn.

Tôi không chắc chắn tôi hiểu tại sao mỗi người dùng phải có một lịch sử địa phương đầy đủ khi sử dụng git? Nếu quy trình làm việc không được phân cấp, dữ liệu đó đang làm gì trên đĩa của người dùng? Tôi biết rằng trong các phiên bản gần đây của git, bạn có thể sử dụng một bản sao nông chỉ với lịch sử gần đây. Câu hỏi của tôi là: có khả thi để làm điều này như là chế độ hoạt động tiêu chuẩn cho toàn bộ nhóm không? Git có thể được cấu hình để luôn nông để bạn có thể có toàn bộ lịch sử chỉ tập trung, nhưng người dùng theo mặc định chỉ có 1000 vòng quay lịch sử? Tất nhiên, tùy chọn đó chỉ là chuyển đổi 1000 vòng quay sang git và giữ lại repo svn cho khảo cổ học. Tuy nhiên, trong kịch bản đó, chúng tôi lại gặp phải vấn đề tương tự sau vài nghìn lần sửa đổi tiếp theo đối với các tài liệu thử nghiệm.

  • Một tốt thực hành tốt nhất cho việc sử dụng git với Repos lớn chứa nhiều tập tin nhị phân mà bạn là gì làm muốn lịch sử? Hầu hết các thực hành tốt nhất và hướng dẫn dường như để tránh trường hợp này. Họ giải quyết vấn đề của một vài nhị phân lớn, hoặc đề nghị bỏ hoàn toàn các nhị phân.
  • Là nhân bản nông có thể sử dụng như một chế độ hoạt động bình thường hay nó là một "hack"?
  • Các mô hình con có thể được sử dụng cho mã khi bạn có sự phụ thuộc chặt chẽ giữa sửa đổi nguồn chính và sửa đổi mô hình con (chẳng hạn như trong phụ thuộc nhị phân thời gian biên dịch hoặc bộ kiểm thử đơn vị)?
  • Làm thế nào lớn là "quá lớn" cho một kho git (tại cơ sở)? Chúng ta có nên tránh chuyển đổi nếu chúng ta có thể giảm xuống còn 4GB? 2GB?

có thể trùng lặp với việc chuyển một repo SVN nhiều GB sang Git
gnat

Tôi đã tìm kiếm rất nhiều thông tin về điều này, và không tìm thấy bất cứ điều gì trả lời câu hỏi của tôi. Trong câu hỏi được liên kết, các workaounrd (mô đun con, phụ lục, v.v.) sẽ hoạt động tốt hơn nhiều so với trong kịch bản của tôi.
Anders Forsgren


Perforce có thể là một lựa chọn tốt hơn git, vì nó được thiết kế để đối phó với nhiều tệp nhị phân lớn, do đó được nhiều nhà phát triển trò chơi sử dụng. Nhựacm cũng đáng xem xét.
Ian

Chỉ là một bên: tránh các mô đun con git nếu bạn có thể, vì chúng làm phức tạp quá mức hệ thống xây dựng (vốn đã phức tạp trong trường hợp của bạn).
IgorGanapolsky

Câu trả lời:


10

Wow, đó là một câu hỏi dài (và một vấn đề phức tạp). Tôi sẽ cố gắng để có một đi vào nó.

Tôi không chắc chắn tôi hiểu tại sao mỗi người dùng phải có một lịch sử địa phương đầy đủ khi sử dụng git?

Đây là một quyết định thiết kế trung tâm với git. Vì những lý do chính xác, bạn cần phải hỏi tác giả (Linus Torvalds), nhưng theo tôi biết, lý do chính là tốc độ: Có mọi thứ cục bộ (trên đĩa nhanh hoặc thậm chí được lưu trong bộ nhớ cache) giúp thao tác trên lịch sử nhanh hơn nhiều bằng cách tránh truy cập mạng.

Lý do lớn nhất cho kích thước kho lưu trữ lớn là có rất nhiều tài liệu nhị phân được đưa vào để kiểm tra. Các tệp này khác nhau trong khoảng từ 0,55 đến 30mb và có hàng trăm. Họ cũng có khá nhiều thay đổi.

Đó là điểm tôi sẽ nghĩ đến đầu tiên. Có quá nhiều tệp nhị phân thay đổi liên tục trong kiểm soát nguồn dường như có vấn đề với tôi (ngay cả với SVN). Bạn không thể sử dụng một cách tiếp cận khác nhau? Ý tưởng:

  • Không giống như mã nguồn, tệp nhị phân 3 MB có thể không được viết bằng tay. Nếu một số công cụ / quy trình tạo ra nó, hãy xem xét việc tích hợp nó vào bản dựng của bạn, thay vì lưu trữ dữ liệu.

  • Nếu điều đó không thực tế, các tệp nhị phân thường tốt hơn trong kho lưu trữ giả (như Artifactory cho Maven & co.). Có lẽ đó là một lựa chọn cho bạn.

Tôi đã xem xét các mô hình con, git-annex, v.v., nhưng có các thử nghiệm trong một mô hình con cảm thấy sai, cũng như có phụ lục cho nhiều tệp mà bạn muốn có lịch sử đầy đủ.

Trên thực tế, điều này có vẻ như git-annex sẽ hoàn toàn phù hợp. git-annex về cơ bản cho phép bạn lưu trữ nội dung tệp bên ngoài kho git (kho lưu trữ chứa một trình giữ chỗ thay thế). Bạn có thể lưu trữ nội dung tệp theo nhiều cách khác nhau (trung tâm git repo, ổ đĩa chung, lưu trữ đám mây ...) và bạn có thể kiểm soát nội dung nào bạn muốn có cục bộ.

Bạn có thể hiểu sai về cách hoạt động của git-annex? git-annex lưu trữ toàn bộ lịch sử cho tất cả các tệp mà nó quản lý - nó chỉ cho phép bạn chọn nội dung tệp bạn muốn có cục bộ.

Cuối cùng, về câu hỏi của bạn:

Cách tốt nhất để sử dụng git với repos lớn chứa nhiều tệp nhị phân mà bạn muốn có lịch sử là gì?

Theo kinh nghiệm của tôi, các tùy chọn thường là:

  • tránh sự cần thiết của nhị phân trong repo (tạo chúng theo yêu cầu, lưu trữ chúng ở nơi khác)
  • sử dụng git-annex (hoặc một giải pháp tương tự, chẳng hạn như Git LFS)
  • sống với một repo lớn (không phải tất cả các thao tác git đều bị ảnh hưởng bởi các tệp lớn và nếu bạn có máy tính và ổ đĩa nhanh, nó có thể hoạt động khá tốt)

Là nhân bản nông có thể sử dụng như một chế độ hoạt động bình thường hay nó là một "hack"?

Điều đó có thể làm được; tuy nhiên, tôi không nghĩ rằng điều này sẽ giải quyết vấn đề của bạn:

  • bạn sẽ mất lợi ích của git đến từ việc có lịch sử đầy đủ, chẳng hạn như tìm kiếm nhanh lịch sử
  • việc hợp nhất có thể trở nên khó khăn, vì AKAIK bạn phải có ít nhất lịch sử quay lại điểm nhánh để hợp nhất
  • Người dùng cần sao chép lại định kỳ để giữ kích thước của bản sao nhỏ
  • đó chỉ là một cách sử dụng git không phổ biến, vì vậy bạn có thể gặp vấn đề với nhiều công cụ

Làm thế nào lớn là "quá lớn" cho một kho git (tại cơ sở)? Chúng ta có nên tránh chuyển đổi nếu chúng ta có thể giảm xuống còn 4GB? 2GB?

Điều đó phụ thuộc vào cấu trúc của repo (vài / nhiều tệp, v.v.), vào những gì bạn muốn làm, vào mức độ mạnh mẽ của máy tính và sự kiên nhẫn của bạn :-).

Để cung cấp cho bạn một ý tưởng nhanh: Trên máy tính xách tay (mới, nhưng ít thông số) của tôi, cam kết một tệp 500 MB mất 30-60 giây. Chỉ liệt kê lịch sử (nhật ký git, v.v.) không bị ảnh hưởng bởi các tệp lớn; những thứ như "git log -S" phải quét nội dung tệp rất chậm - tuy nhiên, tốc độ chủ yếu bị chi phối bởi I / O, vì vậy đó không thực sự là lỗi của git.

Trên repo 3 GB với một số lần sửa đổi, "git log -S" mất khoảng một phút.

Vì vậy, tôi muốn nói rằng một vài GB là ok, mặc dù không lý tưởng. Hơn 10-20 GB có thể đang đẩy nó, nhưng nó có thể thực hiện được - bạn phải thử nó.


Cảm ơn bạn đã trả lời chi tiết. Tôi chắc chắn sẽ xem xét sử dụng phụ lục cho các tài liệu thử nghiệm. Thanh "hiệu suất hợp lý" có thể là "gần với svn", nghĩa là nếu nó chậm hơn đáng kể cho bất kỳ hoạt động nào thì sẽ có quá nhiều ma sát để chuyển đổi.
Anders Forsgren

Tôi nghĩ Git LFS cũng có thể được sử dụng để lưu trữ tệp nhị phân lớn.
IgorGanapolsky

@IgorG.: Có, Git LFS là một thay thế, có những cái khác. Cảm ơn đã chỉ ra nó, tôi đã chỉnh sửa bài viết của mình.
sleske

4

Khi số lượng người dùng tăng lên, có rất nhiều sự thay đổi trong thân cây và các tính năng thường được trải rộng trên nhiều cam kết khiến cho việc xem xét mã khó thực hiện. Ngoài ra, không có phân nhánh, không có cách nào để "chuyển" mã xấu ra, các đánh giá chỉ có thể được thực hiện sau khi cam kết với thân cây

Chuyển sang git sẽ không giải quyết được các vấn đề này, chúng là vấn đề trong cách bạn sử dụng công cụ và nếu bạn sử dụng git theo cách tương tự, các vấn đề sẽ vẫn còn.

Bạn có thể phân nhánh trong svn một cách dễ dàng trong git và việc hợp nhất nói chung cũng dễ dàng và có những cạm bẫy tương tự. Git được thiết kế để làm việc với mã nguồn kernel, do đó, nó đưa ra một số giả định có thể không áp dụng trong mọi trường hợp, chẳng hạn như của bạn với các nhị phân lớn và lịch sử lớn. Ý định đằng sau một DVCS là mọi người dùng đều hoạt động một mình một cách hiệu quả và chỉ hợp tác sau đó - tức là họ có repo của riêng họ, làm việc theo cách họ thích và sau đó đẩy các thay đổi cho bất kỳ ai khác muốn. Một hệ thống liên kết được sử dụng trong phát triển nhân linux là hoàn hảo cho việc này - bạn đẩy các thay đổi của mình cho người tiếp theo lên chuỗi kết hợp nó với cơ sở mã của mình và sau đó đẩy nó sang người tiếp theo cho đến khi Linus đưa nó vào bản phát hành. Hầu hết các đội sử dụng git tương tự nhau, nhưng chỉ có 1 anh chàng thượng lưu thường là repo 'vàng' phía máy chủ,

Vì vậy, tôi sẽ xem xét thay đổi quy trình làm việc của bạn trước tiên, chỉ chuyển sang git một khi bạn có cách làm việc tốt hơn. Triển khai phân nhánh và hợp nhất trong SVN, nếu bạn không đổi tên tệp hoặc hợp nhất thư mục sẽ khá tốt.


4
"Bạn có thể phân nhánh trong svn một cách dễ dàng trong git, và việc hợp nhất nói chung cũng dễ dàng và có những cạm bẫy tương tự", wow đó là một tuyên bố thực sự gây tranh cãi. Theo tôi, việc hợp nhất git thường là một cơn gió nhẹ và trong svn thường là một cơn ác mộng, ngay cả trong các phiên bản sau khi một nỗ lực nửa vời trong theo dõi hợp nhất đã được giới thiệu (vâng, tôi làm việc với git, không chỉ trên repo này). Quy trình công việc chúng tôi muốn có là một nơi bạn tạo một nhánh tính năng, đánh giá mã / CI xây dựng trên nhánh đó. Không có cách nào để làm điều đó trong SVN mà không có sự thất vọng lớn.
Anders Forsgren

2
Không, chúng tôi làm tất cả thời gian ở đây. Tôi chỉ đi qua 157 chi nhánh trong repo SVN của tôi để xem cái nào có thể bị xóa. Chúng tôi phân nhánh, phát triển, xem xét và sau đó hợp nhất trên cơ sở gần như hàng ngày ở đây, đôi khi gặp rắc rối nhưng điều đó luôn được khắc phục bằng cách lấy một nhánh mới ra khỏi thân cây và hợp nhất các thay đổi với nó (để có thể dễ dàng hợp nhất trở lại thân cây sau này) . Điều đó chỉ thực sự áp dụng cho các ngành cổ xưa mặc dù. Nếu bạn có sự thất vọng lớn, bạn không hiểu nó đủ rõ. Git cũng sẽ cung cấp cho bạn sự thất vọng lớn.
gbjbaanb

2
Tôi không trải nghiệm nó. Khi làm việc với git (như tôi đã nói, nhưng trong các repos nhỏ hơn) tôi thấy khá dễ dàng và tự nhiên để thực hiện tính năng phân nhánh, nổi loạn, đè bẹp và hợp nhất. "Xung đột cây sau khi đổi tên", vv cảm thấy hiếm hơn, và thực tế là bạn có thể mô phỏng một lịch sử tuyến tính và đơn giản (thông qua rebase + squash, v.v.) là rất quan trọng. Vì vậy: vì mục đích giữ câu hỏi về chủ đề (git với số lượng lớn): Hãy cho rằng svn không hỗ trợ quy trình công việc tôi cần, và git thì có.
Anders Forsgren

1
Trong một công ty trước đây, chúng tôi đã sử dụng git và tôi biết ai đó đã từng mất công việc thường xuyên sử dụng nó, vì vậy nó không phải là một hệ thống hoàn hảo bằng mọi cách! Cũng không phải là SVN, nhưng SVN phù hợp với hoàn cảnh của bạn hơn git IMHO và nó hoạt động. Về chủ đề, làm thế nào để git hoạt động như bạn muốn ... Tôi thực sự không chắc chắn nó sẽ, xin lỗi.
gbjbaanb

7
@gbjbaanb nếu ai đó mất việc với Git, họ đang làm điều gì đó cực kỳ sai lầm.
RubberDuck

2

Nhìn vào danh sách gửi thư của GCC. Di chuyển cây nguồn của trình biên dịch GCC từ SVN sang GIT được thảo luận ngay bây giờ (tháng 8 & tháng 9 năm 2015), trong khi vẫn giữ lịch sử của GCC. Xem ví dụ kho lưu trữ cho các tiêu chí chấp nhận & máy móc chuyển đổi cho các chuỗi thư chuyển đổi git ; bạn sẽ tìm thấy các tài liệu tham khảo về các công cụ và quy trình liên quan đến chuyển đổi (điều này không đơn giản như vẻ ngoài của nó; việc chuyển đổi lịch sử cơ sở mã lớn như vậy cần 36 giờ và khoảng 64Gbyte RAM, IIRC)


Ý bạn là di chuyển từ SVN sang Git? Di chuyển từ hệ thống kiểm soát phiên bản sang bộ trình biên dịch có vẻ hơi ... kỳ quặc. Ngoài ra, điều này đọc một chút giống như một bình luận hơn là một câu trả lời.
8

Vâng. Xin lỗi vì lỗi đánh máy.
Basile Starynkevitch

Cảm ơn. 36 giờ nghe có vẻ như một làn gió, chúng ta có thể chuyển đổi trong một vài tuần ...
Anders Forsgren

2

Nếu chuyển đổi toàn bộ kho lưu trữ SVN thành Git trong kho lưu trữ lớn không thể sao chép, bạn có thể thử sử dụng SubGit để tạo các gương Git nhỏ hơn cho các phần nhất định của kho lưu trữ Subversion.

Chẳng hạn, bạn có thể nhập và đồng bộ một số thư mục con của kho lưu trữ SVN của bạn http://domain/repos/trunk/project/src:

subgit configure --layout auto --trunk trunk/project/src http://domain/repos project.git
edit project.git/subgit/config
edit project.git/subgit/authors.txt
subgit install project.git

Để biết thêm chi tiết về việc sử dụng SubGit, hãy tham khảo tài liệu của nó .

Ngay khi bạn có nhân bản Git của thư mục đó, bạn có thể sử dụng kho Git để gửi các thay đổi mới ngay lập tức được phản ánh trong kho SVN. Vì bạn chỉ đồng bộ một phần nhất định của kho SVN thu nhỏ đáng kể kích thước của kho Git đã chuyển đổi và bạn vẫn có thể tạo các nhánh, hợp nhất chúng, sử dụng bất kỳ quy trình công việc nào từ phía Git.

Ngoài ra, bạn có thể nhập toàn bộ kho SVN nhưng loại trừ các tệp lớn khỏi đồng bộ hóa:

subgit configure --layout auto --trunk trunk http://domain/repos project.git
edit project.git/subgit/config
...
[svn]
    excludePath = *.bin
    excludePath = *.iso
...
edit project.git/subgit/authors.txt
subgit install project.git

Kho lưu trữ Git có kết quả phải có kích thước hợp lý và nhà phát triển vẫn có thể sử dụng Git để gửi thay đổi của họ tới kho lưu trữ Subversion.

Lưu ý rằng giải pháp này sẽ hoạt động tốt cho bạn nếu bạn đã sẵn sàng để máy chủ Subversion chạy và sử dụng Git cùng với kho SVN của bạn.

Tuyên bố miễn trừ trách nhiệm: Tôi là một trong những nhà phát triển SubGit; SubGit là phần mềm thương mại với một số tùy chọn miễn phí có sẵn.


1

Tôi đã tiếp cận tình huống của bạn theo cách sau:

1) Khởi tạo kho git trong cùng thư mục với repo SVN của bạn. Làm git initgit remote add originđể bắt đầu repo git đó. Bằng cách đó, bạn có thể tiếp tục cam kết trên SVN và git riêng mà không phải xử lý chuyển đổi đầy đủ từ cái này sang cái khác cho đến khi bạn sẵn sàng.

2) Chủ động sử dụng các công cụ bfgbộ lọc nhánh để thử và thu nhỏ repo git của bạn, như được thảo luận ở đây: https://confluence.atlassian.com/bitbucket/reduce-reposeective-size-321848262.html

3) Sử dụng git-annex hoặc Git LFS hoặc chỉ một máy chủ lưu trữ bên ngoài cho các nhị phân lớn của bạn (vận chuyển các tệp bằng cách sử dụng tập lệnh shell trong thời gian xây dựng).

4) Khi bạn cảm thấy thoải mái với chiến lược hợp nhất / phân nhánh trong repo git của mình và thoải mái với kích thước của repo git của bạn, sau đó bạn có thể thực hiện chuyển đổi hoàn toàn từ svn sang git của mình.

Hi vọng điêu nay co ich.

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.