Làm thế nào để sử dụng kho lưu trữ Subversion bên trong kho lưu trữ Git?


8

Tôi đang phát triển một dự án ở Git. CNTT phụ thuộc vào một dự án khác, đó là trong kho Subversion. Tôi muốn có thể thực hiện các thay đổi cho dự án Subversion trong cây và cam kết / cập nhật từ kho Subversion từ bên trong dự án Git. Điều đó có thể không?


Trước những bình luận của bạn bên dưới, câu hỏi của bạn là / "tôi có thể kiểm tra svn bên trong repo git không?" - và câu trả lời đơn giản là: có. Câu trả lời bạn chấp nhận không trả lời câu hỏi này.
AD7six

Câu trả lời:


13

Tôi không thể là người duy nhất nghĩ về meme vật phẩm lồng nhau của Xzibit , phải không? Dù sao...

Một trong những điều thú vị còn lại mà Subversion thực hiện được gọi là "bên ngoài." Đó là một cách để trỏ đến một nhánh hoặc thư mục cụ thể trong kho svn khác. Bạn thậm chí có thể ghim nó xuống một phiên bản cụ thể của một thư mục cụ thể. Externals thực sự rất tiện lợi và sẽ giải quyết vấn đề này ngay lập tức, vì những thay đổi được thực hiện trong thư mục externals sẽ tự động được đẩy trở lại nguồn khi thực hiện cam kết.

Externals cũng là một cái gì đó thiếu trong git. Git có các mô hình con , nhưng chúng không hoạt động theo cùng một cách, theo đó chúng được gắn với một cam kết cụ thể. Này có hiệu quả phương tiện mà không có nguồn gốc giải pháp cho vấn đề của việc có chỗ chứa "lồng" có thể được đọc và ghi vào cùng một lúc và vẫn hoàn toàn đồng bộ, không kém phần lồng nhau kho sử dụng backends khác nhau.

Nếu bạn không muốn thực hiện điệu nhảy ghim chỉnh sửa mô hình con , thì có một cách giải quyết khác.

Git có mô phỏng svn phong nha trong git-svncông cụ. Có lẽ bạn đã sử dụng nó. Câu hỏi SO "Làm cách nào để giữ svn: cập nhật bên ngoài bằng git-svn?" cung cấp cho chúng tôi một tùy chọn hữu ích bằng cách lạm dụng công cụ đó.

Câu trả lời được chấp nhận chỉ đơn giản là sử dụng git-svnđể kiểm tra kho Subversion bên ngoài cây được điều khiển bởi git , chỉ cần sử dụng một liên kết tượng trưng để trỏ đến nó bên trong cây. Có thêm một chút công việc thủ công liên quan đến cái này, vì bạn sẽ cần phải nhớ cam kết kho lưu trữ cụ thể đó mỗi khi bạn thực hiện thay đổi trong đó. Tuy nhiên, nó đơn giản, nó đơn giản và được biết là có tác dụng.

Một tùy chọn khác hoàn toàn sẽ được xem xét Mercurial subrepositories , mà có thể lưu trữ cả hai git và svn. Tôi không chắc nếu bạn thực sự muốn đi sâu ba cấp.


1
Kiểm tra để trả lời câu hỏi, +1 cho yo dawg :)
Jonah

Được chứ. Giải pháp tôi đã giải quyết là chỉ checkoutvào cây Git và loại trừ bản sao làm việc SVN khỏi kho Git hoàn toàn với .gitignore.
Giô-na

Sarcastic chỉnh sửa tóm tắt sang một bên, danh tiếng là để khuyến khích hành vi tốt và làm cho trang web trở thành một nơi tốt hơn cho tất cả mọi người, có ý kiến ​​để làm nổi bật nơi cải thiện có thể được thực hiện. Tôi nghĩ với các chỉnh sửa của bạn, câu hỏi của bạn hữu ích hơn nhiều, do đó sự đảo ngược của một lựa chọn không hữu ích thành hữu ích . Nếu tôi không nghĩ câu trả lời của bạn sẽ được hưởng lợi từ ý kiến ​​của tôi, tôi sẽ không đưa ra. Nếu họ xúc phạm tôi, tôi sẽ đánh dấu. Vì nó là, tôi nghĩ rằng tất cả chúng ta được hưởng lợi từ câu trả lời tốt được làm tốt hơn. (Nhận xét này sẽ tự hủy trong ...)
Mark booth

Yo dawg, tôi nghe nói bạn thích svn, vì vậy tôi đã đặt svn vào git của bạn, để bạn có thể svn trong khi bạn git ...
Dave Arkell

Vấn đề là nếu bản thân svn repo của bạn có chứa bên ngoài, bạn có thể quên sử dụng git-svnvì nó không xử lý chúng
Daniel Alder

3

Mặc dù Charles không khuyến khích , tôi nghĩ rằng bạn thực sự đang tìm kiếm các mô-đun phụ git :

Hỗ trợ mô hình con của Git cho phép một kho chứa, như một thư mục con, một kiểm tra của một dự án bên ngoài. Submodules duy trì bản sắc riêng của họ; hỗ trợ mô hình con chỉ lưu trữ vị trí kho lưu trữ mô hình con và xác nhận ID, vì vậy các nhà phát triển khác đã sao chép dự án chứa ("superproject") có thể dễ dàng sao chép tất cả các mô hình con trong cùng một phiên bản. Có thể kiểm tra một phần của siêu dự án: bạn có thể yêu cầu Git sao chép không, một số hoặc tất cả các mô hình con.

Mặc dù Charles dường như nghĩ rằng các git mô hình con bị thiếu vì chúng không thể hoạt động như svn bên ngoài (tham chiếu đến người đứng đầu chi nhánh thay vì sửa đổi cụ thể), tôi nghĩ điều này cũng nhiều vì sự khác biệt trong quy trình làm việc dự kiến ​​giữa gitsvnnhư mọi thứ khác.

Tùy thuộc vào thời điểm và nơi bạn đã cập nhật bản sao làm việc của mình, các thư mục tại các điểm khác nhau trong svnhệ thống phân cấp thư mục làm việc của bạn có thể ở các phiên bản khác nhau. Điều đó là không thể với git. Trong gitbất cứ khi nào bạn cập nhật lên bản sửa đổi, bạn cập nhật toàn bộ bản sao làm việc của mình lên bản sửa đổi đó - bạn mong đợi rằng khi bạn đi đến bản sửa đổi 123abc, bạn sẽ nhận được mã chính xác như lần cuối bạn kiểm tra 123abc và bao gồm bất kỳ và tất cả các mô hình con mà sửa đổi có thể có.

Nếu bạn muốn cập nhật một mô hình con , bạn phải cập nhật nó và sau đó thực hiện một cam kết mới với siêu mô-đun để cập nhật nó để sử dụng sửa đổi mới trong mô hình con . Nó có nghĩa là các mô hình con kém linh hoạt hơn bên ngoài , nhưng nó thực thi gitmô hình chính của một ảnh chụp nhanh kho lưu trữ.

Nếu bạn muốn svn các phần bên ngoài luôn sử dụng chức năng sửa đổi mới nhất thì bạn phải tự mình làm khá nhiều. Như đã đề cập, bạn chỉ cần kiểm tra svn mô hình con bằng tay và sau đó .gitignorenó.

  • Với cách svnlàm việc, cách thức hoạt động bên ngoài là hoàn toàn chấp nhận được.
  • Với cách gitlàm việc, cách thức hoạt động của mô đun con là hoàn toàn chấp nhận được.

Ngẫu nhiên, như xa như tôi hiểu nó, Mercurial subrepositories làm việc trong cùng một cách như Git submodules , do đó sẽ không thể giúp ích một trong hai.


2

Bạn chỉ đang tìm kiếm git-svn? Bởi phụ thuộc vào bạn có nghĩa là phiên bản mẹ là trong svn, hoặc nó có nhà cung cấp là các dự án svn?

Giả sử phụ thuộc vào bạn có nghĩa là phụ thuộc:

Bạn có thể đặt bất kỳ loại repo nào trong kho git mà không gặp vấn đề gì. ví dụ

$ mkdir ~/project
$ cd ~/project
$ git init
$ ...
$ git commit -va
[master (root-commit) xxxxxxx] Did something
 ...
$ mkdir vendors
$ cd vendors
$ svn checkout svnproject(url)
$ cd svnproject
$ ...
$ svn ci -m "committing to svnproject"

Vân vân.

Và sau đó quản lý svnprojectnhư bạn thường làm. Tất nhiên bạn có thể sử dụng git-svnthay vì tương tác với repo svn của bạn bằng lệnh git.

Bạn cũng có thể làm điều này:

$ cd ~/projects
$ git add vendors/svnproject
$ git commit -m "adding svnproject source to main repo"

Trong trường hợp đó, các cập nhật bạn thực hiện cho các tệp trong svnprojectsẽ hiển thị dưới dạng cả svn và git diff. Một ví dụ trong đó /tmp/gitprojectlà một dự án .. git và /tmp/gitproject/vendor/minifylà một kiểm tra svn (ngẫu nhiên):

[andy@laptop:/tmp/gitproject/vendor/minify]$ vim README.txt 
[andy@laptop:/tmp/gitproject/vendor/minify]$ git status
# On branch master
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working     directory)
#
#   modified:   README.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
[andy@laptop:/tmp/so/vendor/minify]$ svn status
M       README.txt
[andy@laptop:/tmp/so/vendor/minify]$

Nếu bạn sử dụng git-svnđể tương tác với kho lưu trữ phụ thuộc svn của mình, có thể giữ đồng bộ hóa với các thay đổi bạn đã thực hiện trong dự án git cha mẹ bằng cách sử dụng git-filter-branchvà do đó không cần phải cam kết với từng kho lưu trữ riêng lẻ.

Bên cạnh đó: từ kinh nghiệm giữ một dự án git và svn đồng bộ thường khá có vấn đề trừ khi cái này hoặc cái kia chỉ đọc.


Tôi nghĩ vấn đề là tôi không muốn Git theo dõi bản sao làm việc của SVN, vì điều đó sẽ là dư thừa.
Giô-na

Sẽ không, trừ khi bạn rõ ràng thêm chúng vào git repo jonah
AD7six

1

Git có một trình bao bọc svn. Dưới đây là một cách nhanh chóng: Sử dụng hiệu quả Git với Subversion

Giống như nhiều tổ chức sử dụng Rails, chúng tôi đã bắt được sóng git và đang trong trạng thái chuyển đổi giữa git và Subversion. Công việc nguồn mở của chúng tôi được lưu trữ trong kho git, nhưng công việc khách hàng của chúng tôi vẫn được lưu trữ trong kho Subversion và có thể sẽ có một thời gian. Mặc dù git là tuyệt vời, Subversion vẫn có những phẩm chất tốt của nó, và tạo ra một kho lưu trữ tập trung tuyệt vời, đặc biệt là với hệ sinh thái của các công cụ thân thiện với người dùng.

Việc tích hợp giữa git và Subversion (git-svn) được thực hiện tốt đến mức một số người trong chúng ta đã sử dụng git làm giao diện cho tất cả các kho Subversion của chúng tôi. Làm điều này khá đơn giản, nhưng có một số thủ thuật thú vị, và vì vậy tôi nghĩ rằng mình sẽ chia sẻ một ngày trong cuộc sống của Viget với git-svn ...


1
Tôi đã tìm thấy liên kết đó trước đây, nhưng dường như là về việc sử dụng Git để quản lý một bản sao làm việc Subversion. Tôi muốn đặt bản sao hoạt động Subversion bên trong kho Git.
Giô-na

bạn có phiền giải thích thêm về những gì nó làm và những gì nó tốt cho? "Câu trả lời chỉ liên kết" không được chào đón tại Stack Exchange
gnat
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.