Có thể có một kho lưu trữ Subversion như một mô hình con Git không?


154

Có cách nào để thêm kho lưu trữ Subversion dưới dạng mô hình con Git trong kho lưu trữ Git của tôi không?

Cái gì đó như:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

Trong đó https://svn.foo.com/svn/projtrỏ đến một kho lưu trữ Subversion.

Tôi biết có git-svncái cho phép một người tương tác với kho Subversion. Vì vậy, tôi nghĩ rằng, có thể có một cách để kiểm tra kho lưu trữ Subversion git-svnvà sau đó sử dụng nó như một mô hình con.

Câu trả lời:


127

Không. Đặt cược tốt nhất của bạn là thiết lập một bản sao của kho svn trong kho git chuyên dụng.

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com:project.git
git push origin master

Sau đó, bạn có thể thêm kho git dưới dạng mô hình con vào dự án ban đầu

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

Có một sự khác biệt về khái niệm giữa svn: externals và git subodule có thể làm bạn vấp ngã nếu bạn tiếp cận điều này từ quan điểm lật đổ. Subodule git được chốt vào bản sửa đổi mà bạn cung cấp cho nó. Nếu "ngược dòng" thay đổi, thì bạn phải cập nhật tham chiếu của mô hình con.

Vì vậy, khi chúng tôi đồng bộ lại với lật đổ ngược dòng:

cd /path/to/mysvnclone
git svn rebase
git push

... Dự án git vẫn sẽ sử dụng bản sửa đổi ban đầu mà chúng tôi đã cam kết trước đó. Để cập nhật lên svn Head, bạn sẽ phải sử dụng

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"

1
Bạn đã thử các mã này trước khi gửi nó đến đây? mô hình con không thể hoạt động đúng tại git svn.
xhan

4
@xhan có, và tôi không ủng hộ việc trộn git-svn và các mô hình con trong cùng một kho lưu trữ. Bản sao sử dụng git-svn chỉ là cầu nối để tạo bản sao git gốc của kho svn.
richq

lấy làm tiếc. Tôi đã không tìm thấy bạn sử dụng hai thư mục để hoạt động như mô hình con. Bí quyết đẹp.
xhan

Kỹ thuật đẹp. Bạn không cần một bước 'git init --bare' trên máy chủ, trước khi đẩy repo git-svn ở đó? Tôi phải làm điều này.
Clayton Stanley

Đây có thể không phải là mặc định nhưng bạn có thể liên kết svn: externals với một phiên bản cụ thể giống như các mô đun con git làm.
MarcH

8

Tôi chỉ cần đi qua này. Tôi đang làm một cái gì đó tương tự như rq, nhưng hơi khác nhau. Tôi thiết lập một trong các máy chủ của mình để lưu trữ các bản sao git này của các repos svn mà tôi cần. Trong trường hợp của tôi, tôi chỉ muốn các phiên bản chỉ đọc và cần một bản repo trần trên máy chủ.

Trên máy chủ tôi chạy:

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

Điều này thiết lập repo trần của tôi, sau đó tôi có một kịch bản cron để cập nhật nó:

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

Điều này cũng yêu cầu fix-svn-refs.sh từ http://www.shatow.net/fix-svn-refs.sh Điều này chủ yếu được lấy cảm hứng từ: http://gsocblog.jsharpe.net/archives/12

Tôi không chắc tại sao git gccần thiết ở đây, nhưng tôi không thể làm git pullmà không có nó.

Vì vậy, sau tất cả điều này, sau đó bạn có thể sử dụng mô hình con git theo hướng dẫn của rq.


Người ta sẽ nghĩ bạn thậm chí có thể làm điều này như một cái móc cam kết.
Andres Jaan Tack

6

Hiện tại git-svn không hỗ trợ svn: externals . Nhưng có hai công cụ khác có thể giúp bạn:

  1. SubGit

    SubGit là giải pháp phía máy chủ, nó cho phép Git truy cập vào kho lưu trữ Subversion và ngược lại. Bạn có thể tham khảo documenation để biết thêm chi tiết, nhưng nói chung nó là khá dễ dàng để sử dụng SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Lệnh trên sẽ phát hiện bố trí các nhánh trong dự án SVN và sau đó sẽ tạo kho lưu trữ Git trống rỗng sẵn sàng để phản chiếu dự án SVN. Bạn có thể được yêu cầu thông tin đăng nhập trừ khi những thông tin đó đã được lưu trong bộ đệm thông tin đăng nhập SVN tại thư mục ~ / .subversion. Bạn cũng có thể điều chỉnh $GIT_REPO/subgit/authors.txtđể ánh xạ tên tác giả SVN sang danh tính Git.

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    Tại thời điểm này, bạn có kho lưu trữ Subversion được kết nối với kho Git mới được tạo. SubGit chuyển bản sửa đổi SVN thành cam kết Git trên mỗi svn commitvà Git cam kết thành sửa đổi SVN trên mỗi git push.

Tất cả mọi thứ bạn cần thêm là làm cho kho Git có sẵn cho các ủy viên. Hãy xem git-http-backend cho điều đó. Sau đó, bạn có thể thêm kho Git đã tạo như một mô hình con thông thường. SubGit cũng có sẵn như là một tiện ích bổ sung cho Máy chủ Bitbucket, để tìm hiểu thêm kiểm tra tại đây . Vì vậy, không cần sử dụng bất kỳ công cụ bên ngoài nào như git-svn hoặc bất kỳ công cụ nào khác.

SubGit là phần mềm độc quyền nhưng nó miễn phí cho các công ty nhỏ (tối đa 10 ủy viên), các dự án học thuật và nguồn mở.

  1. SmartGit

    SmartGit thay thế git-svn ở phía máy khách. Thông tin thêm về các tính năng của nó bạn có thể tìm thấy ở đây .

    Cụ thể, SmartGit hỗ trợ cả hai mô đun con gitsvn: externals , bạn có thể trộn chúng vào kho lưu trữ của mình.

    SmartGit là phần mềm độc quyền nhưng nó miễn phí cho sử dụng phi thương mại.


Cả subgit( subgit.com/documentation/ trên ) và smartgithỗ trợ svn:externalstheo cùng một cách bởi một .gitsvnextmodulestệp rõ ràng trong một bản sao làm việc. Điều đó có nghĩa là bạn vẫn phải sử dụng các phần mềm này để kiểm tra các phần bên ngoài và bạn không thể sử dụng gittiện ích cơ bản để kiểm tra các phần bên ngoài đó trực tiếp từ một máy chủ trung tâm git bên ngoài như githubhoặc gitlab. Vì vậy, các nguồn liên quan đến một snv:externalsmáy chủ trung tâm git bên ngoài sẽ không thể quan sát và tải xuống được nếu không có các phần mềm này vẫn là một vấn đề quan trọng.
Andry

4

Ngoài những gì rq đã nói, một phương pháp khác sẽ là sử dụng dự án "bên ngoài" của bên thứ ba ( http://nopugs.com/ext-tutorial ), mô phỏng tốt hơn cách hoạt động của các tham chiếu bên ngoài svn. Với các phần bên ngoài, bạn có thể theo dõi các kho git hoặc svn, và có thể dễ dàng hơn để đẩy các thay đổi của bạn ngược dòng lên các repos đó. Tuy nhiên, nó yêu cầu các thành viên dự án tải xuống và cài đặt gói riêng.

Tôi chưa sử dụng mô hình con hoặc bên ngoài nào; tuy nhiên, tôi đã dành vài giờ để đọc về tất cả các lựa chọn thay thế và có vẻ như bên ngoài sẽ phù hợp hơn với nhu cầu của tôi. Có một cuộc thảo luận tuyệt vời về những phương pháp này và các phương pháp tùy chỉnh khác trong Chương 15 của "Kiểm soát phiên bản với Git" của Jon Loeliger ( http://oreilly.com/catalog/9780596520120 ), mà tôi đặc biệt khuyến nghị.


0

Piston đang được viết lại để hỗ trợ điều này và ngược lại, cộng với URL Subversion hiện có trong repoistory Subvresion và git + git.

Kiểm tra kho Github piston .

Thật không may, nó dường như không được phát hành.


3
Piston sẽ thất bại khi bạn cần nó nhất;), vì vậy tôi không khuyên bạn như vậy. Thêm vào đó, không có bất kỳ lỗi nào cho piston nữa.
Henrik

0

Vâng, có git-remote-testsvn, vì vậy tôi đoán một cái gì đó như

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

nên làm việc. Phải không?

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.