Câu hỏi Làm thế nào để di chuyển một kho lưu trữ SVN với lịch sử đến một kho lưu trữ Git mới?


Tôi đọc hướng dẫn Git, FAQ, Git - SVN crash course, vv và tất cả đều giải thích điều này và điều đó, nhưng không nơi nào bạn có thể tìm thấy một hướng dẫn đơn giản như:

Kho lưu trữ SVN trong: svn://myserver/path/to/svn/repos

Kho lưu trữ Git trong: git://myserver/path/to/git/repos

git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos

Tôi không mong đợi nó đơn giản như thế, và tôi không nghĩ đó là một mệnh lệnh duy nhất. Nhưng tôi hy vọng nó không cố gắng giải thích bất cứ điều gì - chỉ để nói những bước cần thực hiện ví dụ này.


1392
2017-09-17 02:08


gốc


Nó trở nên dễ dàng hơn, tôi vừa hoàn thành bản thân và ghi lại những phát hiện của mình với sự trợ giúp của SO jmoses.co/2014/03/21/moving-from-svn-to-git.html - John Moses
Sử dụng câu trả lời của Casey bên dưới, nhưng trước khi bạn chạy lệnh "svn clone ...", hãy xem cách thêm dòng "Visual SVN Server" bổ sung vào tệp user.txt của bạn ... tại đây: stackoverflow.com/questions/8971208/… - MacGyver
Ngoài ra, nếu bạn có tùy chọn "đặt email riêng tư được chọn trong hồ sơ GitHub của bạn, hãy sử dụng tùy chọn này làm địa chỉ email của bạn trong users.txt để khớp. Yourgituser@users.noreply.github.com, vì vậy địa chỉ email thực của bạn không hiển thị trên cam kết. - MacGyver


Các câu trả lời:


Ma thuật:

$ git svn clone http://svn/repo/here/trunk

Git và SVN hoạt động rất khác nhau. Bạn cần phải học Git, và nếu bạn muốn theo dõi những thay đổi từ phía trên SVN, bạn cần phải học git-svn. Các git-svn trang người đàn ông có một phần ví dụ hay:

$ git svn --help

495
2017-09-17 18:20



Câu trả lời từ @Casey trả lời câu hỏi gốc tốt hơn nhiều. - Doug Wilson
Điều này sẽ giữ cho các chi nhánh và tất cả mọi thứ? hoặc chỉ sao chép thân cây? - Eildosa
@Eildosa: Điều này sẽ chỉ nhân bản thân cây. Xem câu trả lời của Casey để thay thế. - sleske
@ DougWilson nhưng tôi không thể nhìn thấy bất kỳ câu trả lời của Casey ở đây. Có phải câu trả lời bên dưới có 13 tác giả bắt đầu bằng "Tạo tệp người dùng" không? - Andrey Regentov
Đối với bất cứ ai khác tự hỏi đó là "câu trả lời của Casey" được tham chiếu trong rất nhiều ý kiến ​​xung quanh đây, đó là cái này (Casey đổi nick thành cmcginty). - Stefan Monov


Tạo tệp người dùng (tức là users.txt) để ánh xạ người dùng SVN tới Git:

user1 = First Last Name <email@address.com>
user2 = First Last Name <email@address.com>
...

Bạn có thể sử dụng một lớp lót này để xây dựng một khuôn mẫu từ kho lưu trữ SVN hiện có của bạn:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt

SVN sẽ dừng nếu nó tìm thấy một người dùng SVN bị thiếu trong tệp. Nhưng sau đó bạn có thể cập nhật các tập tin và pick-up nơi bạn rời đi.

Bây giờ kéo dữ liệu SVN từ kho lưu trữ:

git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp

Lệnh này sẽ tạo một kho lưu trữ Git mới trong dest_dir-tmp và bắt đầu kéo kho SVN. Lưu ý rằng cờ "--stdlayout" ngụ ý bạn có bố cục chung "trunk /, branches /, tags /" SVN. Nếu bố cục của bạn khác, hãy làm quen với --tags, --branches, --trunk tùy chọn (nói chung git svn help).

Tất cả các giao thức phổ biến đều được cho phép: svn://, http://, https://. URL nên nhắm mục tiêu đến kho lưu trữ cơ sở, giống như http://svn.mycompany.com/myrepo/repository. Điều đó phải không phải bao gồm /trunk, /tag hoặc là /branches.

Lưu ý rằng sau khi thực hiện lệnh này nó thường trông giống như hoạt động là "treo / đóng băng", và nó khá bình thường rằng nó có thể bị mắc kẹt trong một thời gian dài sau khi khởi tạo kho lưu trữ mới. Cuối cùng, bạn sẽ thấy các thông điệp tường trình cho biết rằng nó đang di chuyển.

Cũng lưu ý rằng nếu bạn bỏ qua --no-metadata cờ, Git sẽ nối thêm thông tin về bản sửa đổi SVN tương ứng với thông điệp cam kết (tức là git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>)

Nếu không tìm thấy tên người dùng, hãy cập nhật users.txt tệp sau đó:

cd dest_dir-tmp
git svn fetch

Bạn có thể phải lặp lại lệnh cuối cùng đó nhiều lần, nếu bạn có một dự án lớn, cho đến khi tất cả các cam kết Subversion đã được tìm nạp:

git svn fetch

Khi hoàn thành, Git sẽ kiểm tra SVN trunk vào một chi nhánh mới. Bất kỳ chi nhánh nào khác được thiết lập làm điều khiển từ xa. Bạn có thể xem các chi nhánh SVN khác với:

git branch -r

Nếu bạn muốn giữ các nhánh từ xa khác trong kho lưu trữ của mình, bạn muốn tạo một nhánh nội bộ cho từng nhánh một cách thủ công. (Bỏ qua trunk / master.) Nếu bạn không làm điều này, các nhánh sẽ không được nhân bản trong bước cuối cùng.

git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name

Thẻ được nhập dưới dạng nhánh. Bạn phải tạo một chi nhánh địa phương, tạo một thẻ và xóa chi nhánh để có chúng dưới dạng các thẻ trong Git. Để làm điều đó với thẻ "v1":

git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1

Sao chép kho lưu trữ GIT-SVN của bạn vào kho lưu trữ Git sạch:

git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir

Các nhánh địa phương mà bạn đã tạo trước đó từ các nhánh từ xa sẽ chỉ được sao chép như các nhánh từ xa vào kho lưu trữ nhân bản mới. (Bỏ qua trunk / master.) Đối với mỗi nhánh bạn muốn giữ lại:

git checkout -b local_branch origin/remote_branch

Cuối cùng, loại bỏ điều khiển từ xa khỏi kho lưu trữ Git sạch của bạn trỏ tới kho lưu trữ tạm thời đã bị xóa:

git remote rm origin

1467
2017-09-17 17:09



Bài đăng trên blog này của Eelke là một tham chiếu chéo tuyệt vời cho câu trả lời ở trên. blokspeed.net/blog/2010/09/converting-from-subversion-to-git - kgriffs
Điều này là tuyệt vời 99%, theo các bước này, tôi có mọi thứ theo thứ tự ngoại trừ các nhánh: sau bước cuối cùng, chúng chỉ ở xa (và như vậy biến mất khi tôi thực hiện lệnh: git remote rm origin) - Dirty Henry
Tôi chỉ sử dụng quy trình này và nó hoạt động khá tốt. Quan sát của tôi là: 1) quá trình chuyển đổi "các chi nhánh thẻ" thành các thẻ vẫn rời khỏi nhánh (mặc dù không được gắn nhãn). Nếu bạn đã tạo thẻ trong SVN mà không sửa đổi nội dung, thì bạn thực sự có thể gắn thẻ cam kết trước đó và xóa "thẻ-chi nhánh" cho lịch sử rõ ràng hơn. 2) không có đề cập đến được thực hiện di chuyển các thuộc tính svn: ignore. Điều này được đề cập đến ở nơi khác trên Internet. Xem thêm 'git svn show-ignore'. 3) bản sao cuối cùng không có lợi cho tôi. Thật vậy, tôi đã kết thúc với refs từ xa để các thư mục gốc, đó là lẻ. - dty
GitHub có một bước rất thuận tiện theo từng bước: github.com/nirvdrum/svn2git#readme - Dan Nissenbaum
Đối với những người trong Windows, tôi đã tạo một kịch bản PowerShell dựa trên phương pháp này: gist.github.com/Gimly/90df046dc38181bb18de - Gimly


Chuyển sạch kho lưu trữ Subversion của bạn sang kho lưu trữ Git. Trước tiên, bạn phải tạo một tệp ánh xạ Subversion của bạn cam kết tên tác giả cho người cam kết Git, nói ~/authors.txt:

jmaddox = Jon Maddox <jon@gmail.com>
bigpappa = Brian Biggs <bigpappa@gmail.com>

Sau đó, bạn có thể tải xuống dữ liệu Subversion vào kho lưu trữ Git:

mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch

Nếu bạn đang sử dụng máy Mac, bạn có thể nhận được git-svn từ MacPorts bằng cách cài đặt git-core +svn.

Nếu kho lưu trữ subversion của bạn nằm trên cùng một máy như kho lưu trữ git mong muốn của bạn, sau đó bạn có thể sử dụng cú pháp này cho bước init, nếu không tất cả giống nhau:

git svn init file:///home/user/repoName --no-metadata

183
2017-09-21 02:15



Như tôi đã nhận xét về câu trả lời khác, tôi phải loại bỏ các khoảng trống xung quanh = trong users.txt bởi vì quá trình nhập đã bị hủy và tôi đã nhận được một kho lưu trữ trống. - Sebastián Grignoli
Ah! Giải thích đơn giản và hiệu quả. Trong trường hợp của tôi file:/// từ chối làm việc, chỉ là tôi đã sử dụng svnserve.exe --daemon và sau đó được sử dụng svn://localhost/home/user/repo thay thế. - Daniel Reis
Trên máy Mac của tôi chạy Mountain Lion, git svn sẽ không hoạt động cho đến khi tôi đi vào Xcode và cài đặt Công cụ dòng lệnh được tìm thấy trong tab Tải xuống của ngăn Tuỳ chọn. Ngoài ra, tôi có thể đã cài đặt chỉ các công cụ dòng lệnh cho OS X Mountain Lion được tìm thấy trên trang web dành cho nhà phát triển của Apple. - Drew
Đối với trường hợp của tôi, tôi đã phải chuyển đổi tập tin authors.txt đến utf-8 without BOM. - Silvan
Liên kết đó dường như thiếu một số thông tin - Aran Mulholland


Tôi đã sử dụng kịch bản svn2git và hoạt động như một nét duyên dáng! https://github.com/nirvdrum/svn2git


67
2017-09-26 13:13



Q: điều này sửa chữa không gian trong thẻ và tên chi nhánh (cho phép trong svn và không được phép trong git)? - spazm
Hướng dẫn sử dụng này hữu ích: troyhunt.com/2014/08/migrating-from-subversion-to-git-with.html - Morten Holmgaard
Điều này không thành công cho tôi với một vấn đề: groups.google.com/forum/#!topic/msysgit/7MQVwRO-2N4  - Xem thêm: github.com/nirvdrum/svn2git/issues/50  Giải pháp là ở đây: stackoverflow.com/questions/3009738/… - HDave
Tốt hơn là nên giải thích các câu trả lời nếu không chúng tôi sẽ tạo ra các kịch bản lệnh. - Josh Habdas
Điều gì về nếu các chi nhánh của bạn là tất cả trong thư mục gốc của SVN và bạn không có thân cây hoặc thẻ? - Kal


Tôi khuyên bạn nên thoải mái với Git trước khi cố gắng sử dụng git-svn liên tục, tức là giữ SVN làm repo tập trung và sử dụng Git cục bộ.

Tuy nhiên, để di chuyển đơn giản với tất cả lịch sử, dưới đây là một vài bước đơn giản:

Khởi tạo repo cục bộ:

mkdir project
cd project
git svn init http://svn.url

Đánh dấu khoảng cách bạn muốn bắt đầu nhập các bản sửa đổi:

git svn fetch -r42

(hoặc chỉ "git svn fetch" cho tất cả các vòng quay)

Thực sự tìm nạp mọi thứ từ đó:

git svn rebase

Bạn có thể kiểm tra kết quả của việc nhập bằng Gitk. Tôi không chắc chắn nếu điều này hoạt động trên Windows, nó hoạt động trên OSX và Linux:

gitk

Khi bạn đã có repo SVN nhân bản cục bộ, bạn có thể muốn đẩy nó vào một repo Git tập trung để cộng tác dễ dàng hơn.

Đầu tiên tạo repo trống từ xa của bạn (có thể trên GitHub?):

git remote add origin git@github.com:user/project-name.git

Sau đó, tùy chọn đồng bộ hóa nhánh chính của bạn để thao tác kéo sẽ tự động hợp nhất chủ từ xa với tổng thể cục bộ của bạn, khi cả hai chứa nội dung mới:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Sau đó, bạn có thể quan tâm đến việc cố gắng hết sức mình git_remote_branch công cụ giúp xử lý các nhánh từ xa:

Bài giải thích đầu tiên: "Git remote branch"

Theo dõi phiên bản mới nhất: "Thời gian để git cộng tác với git_remote_branch"


56



Vô cùng hữu ích, điều này làm việc hoàn hảo. Tôi sẽ thêm rằng có một bước cuối cùng cần thực hiện nếu bạn đang đồng bộ hóa với một kho lưu trữ từ xa. Sau các bước cấu hình git, tôi cần git push origin master - mag382


Có một giải pháp mới để di chuyển trơn tru từ Subversion sang Git (hoặc để sử dụng đồng thời cả hai): SubGit (http://subgit.com/).

Tôi đang làm việc cho dự án này. Chúng tôi sử dụng SubGit trong kho của chúng tôi - một số đồng đội của tôi sử dụng Git và một số Subversion và cho đến nay nó hoạt động rất tốt.

Để di chuyển từ Subversion sang Git bằng SubGit bạn cần chạy:

$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL 

Sau đó bạn sẽ nhận được kho Git trong svn_repos / .git và có thể sao chép nó, hoặc chỉ tiếp tục sử dụng Subversion và kho lưu trữ Git mới này với nhau: SubGit sẽ đảm bảo rằng cả hai đều được giữ đồng bộ.

Trong trường hợp kho lưu trữ Subversion của bạn chứa nhiều dự án, thì nhiều kho lưu trữ Git sẽ được tạo trong thư mục svn_repos / git. Để tùy chỉnh bản dịch trước khi chạy, hãy làm như sau:

$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos

Với SubGit bạn có thể di chuyển đến Git thuần túy (không phải git-svn) và bắt đầu sử dụng nó trong khi vẫn giữ Subversion miễn là bạn cần nó (ví dụ như các công cụ xây dựng đã được cấu hình của bạn).

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


29



Lưu ý rằng nhập một lần (sử dụng subgit import lệnh) dường như không yêu cầu giấy phép. Bản dịch chính xác của svn:ignore tài sản để .gitignore các tệp cũng được bao gồm. - krlmlr
SubGit sẽ không nhận ra khóa riêng của tôi, cũng không phải bất kỳ cờ nào tôi đặt trong dòng lệnh. Tài liệu rất nghèo. Đây không phải là một lựa chọn khả thi cho git svn. - pfnuesel
lỗi: 'svn_repos' không phải là vị trí được định cấu hình hợp lệ; Thiếu tệp cấu hình SubGit. - Jon Davis


Xem quan chức git-svn manpage. Cụ thể, hãy xem trong "Ví dụ cơ bản":

Theo dõi và đóng góp cho toàn bộ dự án do Subversion quản lý (hoàn thành       với một thân cây, thẻ và các nhánh):

# Clone a repo (like git clone):
    git svn clone http://svn.foo.org/project -T trunk -b branches -t tags

16