Làm cách nào để di chuyển kho lưu trữ SVN có lịch sử sang kho lưu trữ Git mới?


1509

Tôi đã đọc hướng dẫn sử dụng Git, FAQ, khóa học Git - SVN, v.v. và tất cả họ đề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 SVN trong: svn://myserver/path/to/svn/repos

Kho 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ư vậy và tôi không hy vọng nó sẽ là một lệnh duy nhất. Nhưng tôi thực sự mong nó không cố gắng giải thích bất cứ điều gì - chỉ cần nói những bước cần thực hiện trong ví dụ này.


6
Mọi thứ trở nên dễ dàng hơn, tôi chỉ tự mình hoàn thành và ghi lại những phát hiện của mình với sự 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/ Tiết
kiệm

1
Ngoài ra, nếu bạn có "tùy chọn tạo email riêng tư được kiểm tra 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 sẽ không hiển thị trên các cam kết.
MacGyver

Câu trả lời:


529

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 học Git và nếu bạn muốn theo dõi các thay đổi từ SVN ngược dòng, bạn cần học git-svn. Các git-svn trang chính có một phần ví dụ tốt :

$ git svn --help

140
Câu trả lời từ @Casey trả lời câu hỏi ban đầu tốt hơn nhiều.
Doug Wilson

3
Điều này sẽ giữ các chi nhánh và tất cả mọi thứ? hay chỉ nhân bản thân cây?
Eildosa

7
@Eildosa: Cái này sẽ chỉ nhân bản thân cây. Xem câu trả lời của Casey cho một sự thay thế.
sleske

3
@DougWilson nhưng tôi không thể thấy bất kỳ câu trả lời nào của Casey ở đây. Đây có phải là câu trả lời dưới đây với 13 tác giả bắt đầu bằng "Tạo tệp người dùng" không?
Andrey Regentov

68
Đối với bất kỳ ai khác đang tự hỏi đó là "câu trả lời của Casey" được tham chiếu trong rất nhiều bình luận quanh đây, thì đây là (Casey đã đổi nick của mình thành cmcginty).
Stefan Monov

1560

Tạo tệp người dùng (nghĩa là users.txt) để ánh xạ người dùng SVN sang 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 mẫu từ kho SVN hiện tại 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 tìm thấy người dùng SVN bị thiếu không có trong tệp. Nhưng sau đó, bạn có thể cập nhật tệp và chọn nơi bạn rời đi.

Bây giờ hãy 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 Git mới trong dest_dir-tmpvà bắt đầu kéo kho SVN. Lưu ý rằng cờ "--stdlayout" ngụ ý rằng bạn có bố cục "trunk /, cành /, tags /" SVN chung. Nếu khác với cách bố trí của bạn, làm quen với --tags, --branches, --trunktùy chọn (nói chung git svn help).

Tất cả các giao thức phổ biến được phép: svn://, http://, https://. URL phải nhắm mục tiêu vào kho lưu trữ cơ sở, một cái gì đó như http://svn.mycompany.com/myrepo/reposeective . Chuỗi URL không được bao gồm /trunk, /taghoặc /branches.

Lưu ý rằng sau khi thực hiện lệnh này, nó thường trông giống như thao tác bị "treo / đóng băng" và điều khá bình thường là nó có thể bị 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 nó đang di chuyển.

Cũng lưu ý rằng nếu bạn bỏ qua --no-metadatacờ, Git sẽ nối thông tin về sửa đổi SVN tương ứng vào thông báo cam kết (nghĩa 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.txttệp của bạn 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 trunkthành một chi nhánh mới. Bất kỳ chi nhánh khác được thiết lập như đ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 cục bộ cho từng nhánh theo cách thủ công. (Bỏ qua thân cây / chủ.) 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 chi nhánh. Bạn phải tạo một nhánh cục bộ, tạo một thẻ và xóa 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 cục bộ mà bạn đã tạo trước đó từ các nhánh từ xa sẽ chỉ được sao chép dưới dạng các nhánh từ xa vào kho lưu trữ nhân bản mới. (Bỏ qua thân cây / chủ.) Đối với mỗi nhánh bạn muốn giữ:

git checkout -b local_branch origin/remote_branch

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

git remote rm origin

36
Bài đăng blog này của Eelke là một tài liệu tham khảo 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

4
Điều này thật 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

4
GitHub có một bước rất thuận tiện: github.com/nirvdrum/svn2git#readme
Dan Nissenbaum

8
Đối với những người dùng Windows, tôi đã tạo tập lệnh PowerShell dựa trên phương pháp này: gist.github.com/Gimly/90df046dc38181bb18de
Gimly

5
Cảnh báo cho các repos lớn với rất nhiều lịch sử, điều này là chậm và tẻ nhạt . Tôi đã từ bỏ việc cố gắng di chuyển tất cả các nhánh cũ và chỉ đơn giản là di chuyển thân cây.
Jess

195

Di chuyển sạch kho lưu trữ lật đổ 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ạ tên tác giả cam kết Subversion của bạn tới những 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 dùng Mac, bạn có thể lấy git-svntừ MacPorts bằng cách cài đặt git-core +svn.

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

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

1
Như tôi đã nhận xét về câu trả lời khác, tôi đã phải loại bỏ các không gian xung quanh =trong users.txtvì việc nhập khẩu đã được hủy bỏ và tôi đã nhận được một kho trống.
Sebastián Grignoli

8
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ỉ cần tôi sử dụng svnserve.exe --daemonvà sau đó sử dụng svn://localhost/home/user/repothay thế.
Daniel Reis

Trên máy Mac đang chạy Mountain Lion, git svn sẽ không hoạt động cho đến khi tô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 Tùy chọn. Ngoài ra, tôi có thể đã cài đặt chỉ Công cụ dòng lệnh cho OS X Mountain Lion được tìm thấy trên trang web Nhà phát triển của Apple.
vẽ

3
Đối với trường hợp của tôi, tôi đã phải chuyển đổi tập tin authors.txtsang utf-8 without BOM.
Silvan

Nó hiệu quả tuyệt vời đối với tôi! Khi tôi có kho lưu trữ cục bộ, tôi đã sử dụng bài đăng của cmcginty bắt đầu từ "Sao chép kho lưu trữ GIT-SVN của bạn vào kho lưu trữ Git sạch:" Tôi nghĩ lý do chính mà tôi thích câu trả lời của @zoul là sử dụng git svn init, git svn configsau đó cuối cùng git svn fetchvì nó dễ dàng hơn để làm theo cách này, tôi đã phải tìm nạp nhiều lần để làm cho đúng. Một dòng của cmcginty git svn clone, mà cả ba, đã quá rối rắm đối với tôi.
mike

70

Tôi đã sử dụng tập lệnh svn2git và hoạt động như một nét duyên dáng.


4
Q: điều này có sửa các khoảng trắng trong tên thẻ và tên nhánh (được phép trong svn và không được phép trong git) không?
spazm


Điều này không thành công đối với 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 đã có tại đây: stackoverflow.com/questions / 3009738 / Hoài
HDave

Tốt hơn là nên giải thích câu trả lời nếu không chúng tôi sản xuất kịch bản kịch bản.
Josh Habdas

Còn nếu các chi nhánh của bạn đều nằm trong thư mục gốc của SVN và bạn không có thân cây hoặc thẻ thì sao?
Kal

58

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, đối với việc di chuyển đơn giản với tất cả lịch sử, đâ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 thời gian bạn muốn bắt đầu nhập 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 tế lấy mọi thứ kể từ đó:

git svn rebase

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

gitk

Khi bạn đã sao chép lại SVN của mình tại địa phương, bạn có thể muốn đẩy nó sang một repo Git tập trung để cộng tác dễ dàng hơn.

Đầu tiên tạo repo từ xa trống 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 chủ cục bộ của bạn, khi cả hai đều 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 dùng thử git_remote_branchcông cụ rất riêng của tôi , giúp xử lý các chi nhánh từ xa:

Bài giải thích đầu tiên: " Git chi nhánh từ xa "

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


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 phảigit push origin master
mag382

31

Có một giải pháp mới để chuyển đổi suôn sẻ từ Subversion sang Git (hoặc sử dụng đồng thời cả hai): SubGit .

Tôi đang làm việc trên dự án này bản thân mình. 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 lưu trữ Git trong svn numpose / .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 cùng nhau: SubGit sẽ đảm bảo rằng cả hai luôn đượ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 Git sẽ được tạo trong thư mục svn_Vpose / 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 sang 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ụ, đối với 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!


4
Lưu ý rằng nhập một lần (sử dụng subgit importlệnh) thậm chí dường như không yêu cầu giấy phép. Bản dịch chính xác của svn:ignoretài sản vào .gitignorecác tập tin cũng được bao gồm.
krlmlr

1
SubGit sẽ không nhận ra khóa riêng của tôi, cũng như bất kỳ cờ nào tôi đặt trong dòng lệnh. Tài liệu rất kém. Đây không phải là một thay thế khả thi cho git svn.
pfnuesel

1
lỗi: 'svn_Vpose' không phải là vị trí được định cấu hình hợp lệ; Tập tin cấu hình SubGit bị thiếu.
Jon Davis

19

Xem trang chính thức của git-svn . Cụ thể, 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à chi nhánh):

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

Lệnh clone của bạn đã làm việc, những người ở trên đã cho tôi không có gì ngoài repos git trống. Sự khác biệt duy nhất dường như là "thân cây" rõ ràng.
dùng1984717


14

SubGit (vs Blue Screen of Death)

subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Đó là tất cả.

+ Để cập nhật từ SVN, kho Git được tạo bởi lệnh đầu tiên.

subgit import  directory/path/Local.git.Repo

Tôi đã sử dụng một cách để di chuyển đến Git ngay lập tức cho một kho lưu trữ khổng lồ.
Tất nhiên bạn cần một số chuẩn bị.
Nhưng bạn có thể không dừng quá trình phát triển.

Đây là cách của tôi.

Giải pháp của tôi trông như:

  • Di chuyển SVN sang kho Git
  • Cập nhật kho Git ngay trước khi nhóm chuyển sang .

Di chuyển mất rất nhiều thời gian cho một kho lưu trữ SVN lớn.
Nhưng cập nhật di chuyển hoàn thành chỉ trong vài giây.

Tất nhiên là tôi đang sử dụng SubGit , mẹ . git-svn làm cho tôi màn hình xanh chết chóc . Chỉ cần liên tục. Và git-svn làm tôi nhàm chán với lỗi nghiêm trọng " tên tệp quá dài " của Git .

BƯỚC

1. Tải xuống SubGit

2. Chuẩn bị di chuyển và cập nhật lệnh.

Giả sử chúng ta làm điều đó cho Windows (việc chuyển sang Linux) không quan trọng.
Trong thư mục bin cài đặt của SubGit (subgit-2.XX \ bin), tạo hai tệp .bat.

Nội dung của tệp / lệnh cho việc di chuyển:

start    subgit import --svn-url url://svn.serv/Bla/Bla  directory/path/Local.git.Repo

Lệnh "bắt đầu" là tùy chọn ở đây (Windows). Nó sẽ cho phép nhìn thấy lỗi khi bắt đầu và để lại một vỏ được mở sau khi hoàn thành SubGit.

Bạn có thể thêm vào đây các tham số bổ sung tương tự như git-svn . Tôi chỉ sử dụng --default-domain myCompanyDomain.com để sửa tên miền của địa chỉ email của các tác giả SVN.
Tôi có cấu trúc của kho lưu trữ SVN tiêu chuẩn (thân cây / nhánh / thẻ) và chúng tôi không gặp rắc rối với "ánh xạ tác giả". Vì vậy, tôi không làm gì nữa.

(Nếu bạn muốn di chuyển các thẻ như chi nhánh hoặc SVN của bạn có nhiều thư mục chi nhánh / thẻ bạn có thể xem xét để sử dụng phương pháp SubGit dài dòng hơn )

Mẹo 1 : Sử dụng - tối đa sửa đổi YourSvnRevNumber để xem nhanh mọi thứ diễn ra như thế nào (một loại gỡ lỗi). Đặc biệt hữu ích là để xem tên tác giả hoặc email được giải quyết.
Hoặc để giới hạn độ sâu lịch sử di chuyển.

Mẹo 2 : Di chuyển có thể bị gián đoạn ( Ctrl+ C) và được khôi phục bằng cách chạy lệnh / tệp cập nhật tiếp theo.
Tôi không khuyên làm điều này cho các kho lớn. Tôi đã nhận được "Ngoại lệ bộ nhớ Java + Windows".

Mẹo 3 : Tốt hơn để tạo một bản sao của kho lưu trữ kết quả của bạn.

Nội dung của tệp / lệnh để cập nhật:

start    subgit import  directory/path/Local.git.Repo

Bạn có thể chạy nó bất kỳ số lần nào khi bạn muốn nhận được cam kết của nhóm cuối cùng vào kho Git của mình.

Cảnh báo! Đừng chạm vào kho lưu trữ trần của bạn (ví dụ: tạo chi nhánh).
Bạn sẽ nhận được lỗi nghiêm trọng tiếp theo:

Lỗi không thể phục hồi: không đồng bộ hóa và không thể được đồng bộ hóa ... Dịch các bản sửa đổi Subversion sang Git ...

3. Chạy lệnh / tập tin đầu tiên. Sẽ mất một thời gian cho một kho lưu trữ lớn. 30 giờ cho kho lưu trữ khiêm tốn của tôi.

Đó là tất cả.
Bạn có thể cập nhật kho Git của mình từ SVN bất cứ lúc nào bằng cách chạy tệp / lệnh thứ hai. Và trước khi chuyển đổi nhóm phát triển của bạn sang Git.
Nó sẽ chỉ mất vài giây.



Có thêm một nhiệm vụ hữu ích.

Đẩy kho Git cục bộ của bạn sang kho Git từ xa

Có phải trường hợp của bạn? Hãy tiếp tục.

  1. Định cấu hình điều khiển từ xa của bạn

Chạy:

$ git remote add origin url://your/repo.git
  1. Chuẩn bị gửi ban đầu kho lưu trữ Git cục bộ khổng lồ của bạn đến kho lưu trữ từ xa

Theo mặc định, Git của bạn không thể gửi khối lớn. gây tử vong: Kết thúc từ xa treo lên bất ngờ

Hãy chạy cho nó:

git config --global http.postBuffer 1073741824

524288000 - 500 MB 1073741824 - 1 GB, v.v.

Khắc phục sự cố chứng chỉ cục bộ của bạn . Nếu máy chủ git của bạn sử dụng chứng chỉ bị hỏng.

Tôi đã bị vô hiệu hóa chứng chỉ .

Ngoài ra, máy chủ Git của bạn có thể có giới hạn số lượng yêu cầu cần được sửa chữa .

  1. Đẩy tất cả di chuyển đến kho lưu trữ Git từ xa của nhóm.

Chạy với Git cục bộ:

git push origin --mirror

( git đẩy gốc '*: *' cho các phiên bản Git cũ)

Nếu bạn gặp phải các lỗi sau: error: could spawn git: Không có tệp hoặc thư mục như vậy ... Đối với tôi, việc giải trí đầy đủ kho lưu trữ của tôi sẽ giải quyết lỗi này (30 giờ). Bạn có thể thử các lệnh tiếp theo

git push origin --all
git push origin --tags

Hoặc cố gắng cài đặt lại Git ( vô dụng đối với tôi ). Hoặc bạn có thể tạo các nhánh từ tất cả các thẻ của bạn và đẩy chúng. Hoặc, hoặc, hoặc ...


10

bác sĩ phẫu thuật

Đối với các trường hợp phức tạp, reposurgeon của Eric S. Raymond là công cụ được lựa chọn. Ngoài SVN, nó hỗ trợ nhiều hệ thống kiểm soát phiên bản khác thông qua fast-exportđịnh dạng và CVS . Tác giả báo cáo chuyển đổi thành công các kho lưu trữ cổ xưa như EmacsFreeBSD .

Công cụ rõ ràng nhằm mục đích chuyển đổi gần như hoàn hảo (chẳng hạn như chuyển đổi các svn:ignorethuộc tính của SVN sang .gitignoretệp) ngay cả đối với các bố cục kho lưu trữ khó khăn với lịch sử lâu dài. Đối với nhiều trường hợp, các công cụ khác có thể dễ sử dụng hơn.

Trước khi đi sâu vào tài liệu của reposurgeondòng lệnh, hãy nhớ đọc hướng dẫn di chuyển DVCS tuyệt vời, từng bước thực hiện quy trình chuyển đổi.


8

Hướng dẫn này trên trang web của atlassian là một trong những hướng dẫn tốt nhất tôi đã tìm thấy:

https://www.atlassian.com/git/migration

Công cụ này - https://bitbucket.org/atlassian/svn-migration-scripts - cũng thực sự hữu ích để tạo Author.txt của bạn trong số những thứ khác.


Trang này là tuyệt vời, và IMHO là câu trả lời tốt nhất! Nó làm hầu hết các công việc nặng nề cho bạn.
PfunnyGuy

8

Bạn phải cài đặt

git
git-svn

Sao chép từ liên kết này http://john.albin.net/git/convert-subversion-to-git .

1. Truy xuất danh sách tất cả các ủy viên Subversion

Subversion chỉ đơn giản là liệt kê tên người dùng cho mỗi cam kết. Cam kết của Git có dữ liệu phong phú hơn nhiều, nhưng đơn giản nhất, tác giả cam kết cần phải có tên và email được liệt kê. Theo mặc định, công cụ git-svn sẽ chỉ liệt kê tên người dùng SVN trong cả trường tác giả và email. Nhưng với một chút công việc, bạn có thể tạo một danh sách tất cả người dùng SVN và tên và email Git tương ứng của họ là gì. Danh sách này có thể được sử dụng bởi git-svn để chuyển đổi tên người dùng svn đơn giản thành các ủy viên Git thích hợp.

Từ thư mục gốc của kiểm tra Subversion cục bộ của bạn, hãy chạy lệnh này:

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

Điều đó sẽ lấy tất cả các thông điệp tường trình, lấy ra tên người dùng, loại bỏ bất kỳ tên người dùng trùng lặp nào, sắp xếp tên người dùng và đặt chúng vào một tập tin của tác giả-Transform.txt. Bây giờ chỉnh sửa từng dòng trong tập tin. Ví dụ: chuyển đổi:

jwilkins = jwilkins <jwilkins>

vào đây:

jwilkins = John Albin Wilkins <johnalbin@example.com>

2. Sao chép kho lưu trữ Subversion bằng git-svn

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

Điều này sẽ thực hiện chuyển đổi git-svn tiêu chuẩn (sử dụng tệp tác giả-Transform.txt mà bạn đã tạo ở bước 1) và đặt kho lưu trữ git trong thư mục của Thư mục ~ / temp trong thư mục chính của bạn.

3. Chuyển đổi svn: bỏ qua các thuộc tính thành .gitignore

Nếu repo svn của bạn đang sử dụng svn: bỏ qua các thuộc tính, bạn có thể dễ dàng chuyển đổi tệp này thành tệp .gitignore bằng cách sử dụng:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

4. Đẩy kho lưu trữ đến kho lưu trữ git trần

Đầu tiên, tạo một kho lưu trữ trống và làm cho nhánh nhánh mặc định của nó khớp với tên nhánh nhánh nhánh của svn.

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

Sau đó đẩy kho lưu trữ tạm thời sang kho lưu trữ mới.

cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

Bây giờ bạn có thể xóa kho lưu trữ ~ / temp một cách an toàn.

5. Đổi tên nhánh nhánh cây ăn quả của Pháp

Chi nhánh phát triển chính của bạn sẽ được đặt tên là thân cây thân cây phù hợp với tên của nó trong Subversion. Bạn sẽ muốn đổi tên nó thành chi nhánh tiêu chuẩn chính của Git bằng cách sử dụng:

cd ~/new-bare.git
git branch -m trunk master

6. Dọn dẹp cành cây và thẻ

git-svn làm cho tất cả các thẻ Subversions thành các nhánh rất ngắn trong Git của biểu mẫu Thẻ tags / tên tên. Bạn sẽ muốn chuyển đổi tất cả các nhánh đó thành các thẻ Git thực tế bằng cách sử dụng:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

Bước này sẽ mất một chút gõ. :-) Nhưng, đừng lo lắng; shell unix của bạn sẽ cung cấp một dấu nhắc thứ cấp cho lệnh siêu dài bắt đầu bằng git for-Each-ref.


7

GitHub hiện có một tính năng để nhập từ kho SVN . Tôi chưa bao giờ thử nó, mặc dù.


3
Đề xuất hiện tại của GitHub là sử dụng svn2gitchương trình được đề xuất trong câu trả lời khác .
ntc2

Nhập khẩu hai dự án khá lớn bây giờ hoàn hảo. Tất cả các chi nhánh SVN đã được nhập (chỉ cần nhớ KHÔNG sử dụng phần thân cây trong đường dẫn repo). Một điều tôi chưa biết là liệu Github có theo dõi các cam kết mới hay không.
Fr0sT

7

Một câu trả lời có phần mở rộng chỉ sử dụng git, SVN và bash. Nó bao gồm các bước cho kho lưu trữ SVN không sử dụng bố cục thông thường với bố cục thư mục trunk / cành / tags (SVN hoàn toàn không có gì để thực thi kiểu bố trí này).

Trước tiên, hãy sử dụng tập lệnh bash này để quét repo SVN của bạn cho những người khác nhau đã đóng góp và tạo mẫu cho tệp ánh xạ:

#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
  echo "${author} = NAME <USER@DOMAIN>";
done

Sử dụng điều này để tạo một authorstệp trong đó bạn ánh xạ tên người dùng svn thành tên người dùng và email do nhà phát triển của bạn đặt bằng các git configthuộc tính user.nameuser.email(lưu ý rằng đối với một dịch vụ như GitHub chỉ cần có email phù hợp là đủ).

Sau đó, git svnsao chép kho svn vào kho git, nói với nó về ánh xạ:

git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot

Điều này có thể mất nhiều thời gian, vì git svn sẽ kiểm tra riêng từng bản sửa đổi cho mỗi thẻ hoặc chi nhánh tồn tại. (lưu ý rằng các thẻ trong SVN chỉ là các nhánh thực sự, vì vậy chúng kết thúc như vậy trong Git). Bạn có thể tăng tốc độ này bằng cách xóa các thẻ và nhánh cũ trong SVN mà bạn không cần.

Chạy cái này trên một máy chủ trong cùng một mạng hoặc trên cùng một máy chủ cũng có thể thực sự tăng tốc độ này. Ngoài ra, nếu vì lý do nào đó, quá trình này bị gián đoạn, bạn có thể tiếp tục sử dụng

git svn rebase --continue

Trong rất nhiều trường hợp bạn được thực hiện ở đây. Nhưng nếu repo SVN của bạn có bố cục độc đáo, nơi bạn chỉ cần có một thư mục trong SVN bạn muốn đặt trong một nhánh git, bạn có thể thực hiện một số bước bổ sung.

Đơn giản nhất là chỉ cần tạo một repo SVN mới trên máy chủ của bạn theo quy ước và sử dụng svn copyđể đặt thư mục của bạn trong thân cây hoặc một nhánh. Đây có thể là cách duy nhất nếu thư mục của bạn hoàn toàn nằm ở thư mục gốc của repo, khi tôi thử lần cuối, điều này git svnchỉ đơn giản là từ chối thực hiện kiểm tra.

Bạn cũng có thể làm điều này bằng cách sử dụng git. Để git svn cloneđơn giản sử dụng thư mục bạn muốn đặt trong một nhánh git.

Sau khi chạy

git branch --set-upstream master git-svn
git svn rebase

Lưu ý rằng điều này yêu cầu Git 1.7 trở lên.


Tôi sẽ đề xuất kết hợp thông tin này với liên kết này: sailmaker.co.uk/blog/2013/05/05/ Khăn
Joan PS

7

Tôi đã đăng một hướng dẫn từng bước ( tại đây ) để chuyển đổi svn sang git, bao gồm chuyển đổi thẻ svn sang thẻ git và các nhánh svn thành các nhánh git.

Phiên bản ngắn:

1) clone svn từ một số sửa đổi cụ thể. (số sửa đổi phải là số cũ nhất bạn muốn di chuyển)

git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame

2) tìm nạp dữ liệu svn. Bước này là một trong những mất nhiều thời gian nhất.

cd gitreponame
git svn fetch

lặp lại git svn tìm nạp cho đến khi kết thúc mà không có lỗi

3) cập nhật chi nhánh chính

git svn rebase

4) Tạo các nhánh cục bộ từ các nhánh svn bằng cách sao chép các tham chiếu

cp .git/refs/remotes/origin/* .git/refs/heads/

5) chuyển đổi thẻ svn thành thẻ git

git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done

6) Đặt kho lưu trữ ở nơi tốt hơn như github

git remotes add newrepo git@github.com:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo

Nếu bạn muốn biết thêm chi tiết, đọc bài viết của tôi hoặc hỏi tôi.


6

Chúng ta có thể sử dụng git svn clonecác lệnh như dưới đây.

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

Lệnh trên sẽ tạo tập tin tác giả từ các cam kết SVN.

  • svn log --stop-on-copy <SVN_URL>

Lệnh trên sẽ cung cấp cho bạn số sửa đổi đầu tiên khi dự án SVN của bạn được tạo.

  • git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>

Lệnh trên sẽ tạo kho Git trong local.

Vấn đề là nó sẽ không chuyển đổi các nhánh và thẻ để đẩy. Bạn sẽ phải làm chúng bằng tay. Ví dụ dưới đây cho các chi nhánh:

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$

Đối với thẻ:

$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
  MyDevBranch
  master
  remotes/origin/MyDevBranch
  remotes/origin/tags/MyDevBranch-1.0
  remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$

Bây giờ đẩy master, nhánh và thẻ vào kho git từ xa.

$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
 * [new branch]      master -> master
 * [new branch]      MyDevBranch -> MyDevBranch
 * [new tag]         MyDevBranch-1.0 -> MyDevBranch-1.0
$

tiện ích svn2git

svn2gittiện ích loại bỏ các nỗ lực thủ công với các nhánh và thẻ.

Cài đặt nó bằng lệnh sudo gem install svn2git. Sau đó chạy bên dưới lệnh.

  • $ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>

Bây giờ bạn có thể liệt kê các nhánh, thẻ và đẩy chúng dễ dàng.

$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
  MyDevBranch
* master
  remotes/svn/MyDevBranch
  remotes/svn/trunk
$ git tag
  MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0

Hãy tưởng tượng bạn có 20 nhánh và thẻ, rõ ràng svn2git sẽ giúp bạn tiết kiệm rất nhiều thời gian và đó là lý do tại sao tôi thích nó hơn các lệnh gốc. Đó là một trình bao bọc đẹp xung quanh git svn clonelệnh gốc .

Để có một ví dụ đầy đủ, hãy tham khảo mục blog của tôi .



3

Tôi đánh giá cao loạt phim ngắn này tôi mới phát hiện ra. Tác giả sẽ hướng dẫn bạn qua các thao tác cơ bản và giới thiệu một số cách sử dụng nâng cao hơn.


3

Nếu bạn đang sử dụng SourceTree, bạn có thể thực hiện việc này trực tiếp từ ứng dụng. Goto File -> New / Clone, sau đó làm như sau:

  1. Nhập URL SVN từ xa dưới dạng "Đường dẫn / URL nguồn".
  2. Nhập thông tin đăng nhập của bạn khi được nhắc.
  3. Nhập vị trí thư mục cục bộ là "Đường dẫn đích".
  4. Đặt tên cho nó.
  5. Trong các tùy chọn nâng cao, chọn "Git" từ danh sách thả xuống trong "Tạo kho lưu trữ cục bộ kiểu".
  6. Bạn có thể tùy ý chỉ định một bản sửa đổi để sao chép từ.
  7. Lượt nhân bản.

Mở repo trong SourceTree và bạn sẽ thấy các thông điệp cam kết của mình cũng đã được di chuyển.

Bây giờ, hãy vào Kho lưu trữ -> Cài đặt kho lưu trữ và thêm chi tiết repo từ xa mới. Xóa điều khiển từ xa SVN nếu bạn muốn (Tôi đã thực hiện điều này thông qua tùy chọn "Chỉnh sửa tệp cấu hình".

Đẩy mã vào repo từ xa mới khi bạn đã sẵn sàng và mã tự do.


Cảm ơn bạn, siêu nhanh và nhanh chóng!
Rikard

Cảm ơn bạn. Điều này đã làm việc cho tôi. Tôi đang sử dụng SourceTree và Stash.
VK_217

3

Dành cho GitLab người dùng tôi đã đưa ra ý chính về cách tôi di chuyển từ SVN tại đây:

https://gist.github.com/leftclickben / 32b7a3042cbe97ed2af

Các bước để di chuyển từ SVN sang GitLab

Thiết lập

  • SVN được lưu trữ tại svn.domain.com.au.
  • SVN có thể truy cập thông qua http(các giao thức khác sẽ hoạt động).
  • GitLab được lưu trữ tại git.domain.com.auvà:
    • Một nhóm được tạo với không gian tên dev-team.
    • Ít nhất một tài khoản người dùng được tạo, thêm vào nhóm và có khóa SSH cho tài khoản đang được sử dụng để di chuyển (sử dụng thử nghiệm ssh git@git.domain.com.au).
    • Dự án favourite-projectđược tạo ra trong dev-teamkhông gian tên.
  • Tệp users.txtnày chứa các chi tiết người dùng có liên quan, một người dùng trên mỗi dòng, của biểu mẫu username = First Last <address@domain.com.au>, trong đó usernametên người dùng được cung cấp trong nhật ký SVN. (Xem liên kết đầu tiên trong phần Tài liệu tham khảo để biết chi tiết, cụ thể là câu trả lời của người dùng Casey).

Phiên bản

  • phiên bản lật đổ 1.6.17 (r1128011)
  • phiên bản git 1.9.1
  • Phiên bản GitLab 7.2.1 ff1633f
  • Máy chủ Ubuntu 14.04

Các lệnh

bash
git svn clone --stdlayout --no-metadata -A users.txt 
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab git@git.domain.com.au:dev-team/favourite-project.git
git push --set-upstream gitlab master

Đó là nó! Tải lại trang dự án trong giao diện người dùng web GitLab và bạn sẽ thấy tất cả các cam kết và tệp hiện được liệt kê.

Ghi chú

  • Nếu có người dùng chưa biết, các git svn clonelệnh sẽ dừng lại, trong trường hợp đó, cập nhật users.txt, cd favourite-projectgit svn fetchsẽ tiếp tục từ nơi nó dừng lại.
  • Bố cục chuẩn trunk- tags- branchescho kho SVN là bắt buộc.
  • URL SVN trao cho các git svn clonelệnh dừng lại ở mức độ ngay lập tức ở trên trunk/, tags/branches/.
  • Các git svn clone lệnh sản xuất rất nhiều sản lượng, trong đó có một số cảnh báo ở phía trên; Tôi bỏ qua những lời cảnh báo.

Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
Hố đen

1
Tôi không đồng ý. Nội dung được liên kết có thể thay đổi và nội dung được sao chép ở đây sẽ không được cập nhật và do đó có thể bị lỗi thời (và thực tế tôi tin rằng nó đã thay đổi kể từ khi tôi đăng câu trả lời này). Các hướng dẫn chỉ nói để bao gồm một số bối cảnh có liên quan cho một liên kết, mà tôi đã làm - câu hỏi thực tế đã được trả lời bán buôn bởi liên kết. Sao chép toàn bộ tài nguyên được liên kết ở đây là không cần thiết hoặc không cần thiết. Có phải tôi đã bị hạ thấp vì điều này?!
leftclickben

2

Mặt khác, lệnh git-stash là một ơn trời khi cố gắng git với dcommits git-svn.

Một quy trình điển hình:

  1. thiết lập repo git
  2. làm một số công việc trên các tập tin khác nhau
  3. quyết định kiểm tra một số công việc trong, sử dụng git
  4. quyết định svn-dcommit
  5. nhận được lỗi "không thể cam kết với một chỉ mục bẩn".

Giải pháp (yêu cầu git 1.5.3+):

git stash; git svn dcommit ; git stash apply

2

Đây là một tập lệnh shell đơn giản không có phụ thuộc sẽ chuyển đổi một hoặc nhiều kho SVN thành git và đẩy chúng sang GitHub.

https://gist.github.com/NathanSweet/7327535

Trong khoảng 30 dòng script, nó nhân bản bằng git SVN, tạo tệp .gitignore từ SVN :: bỏ qua các thuộc tính, đẩy vào kho lưu trữ git trần, đổi tên thân SVN thành chủ, chuyển đổi thẻ SVN thành thẻ git và đẩy nó sang GitHub trong khi bảo quản các thẻ

Tôi đã trải qua rất nhiều đau đớn khi chuyển hàng tá kho lưu trữ SVN từ Google Code sang GitHub. Nó không giúp tôi sử dụng Windows. Ruby là tất cả các loại bị hỏng trên hộp Debian cũ của tôi và làm cho nó hoạt động trên Windows là một trò đùa. Các giải pháp khác không hoạt động với các đường dẫn Cygwin. Ngay cả khi tôi đã làm được điều gì đó, tôi không thể tìm ra cách để các thẻ hiển thị trên GitHub (bí mật là - thẻ theo dõi).

Cuối cùng, tôi đã ghép lại hai tập lệnh ngắn và đơn giản, được liên kết ở trên và nó hoạt động rất tốt. Giải pháp không cần phức tạp hơn thế!


2
Tôi đã sử dụng kịch bản này. Sau một chút dấu vết và lỗi, nó đã làm việc cho tôi. Xin lưu ý rằng bạn cần Git 1.8.3+ cho việc này, vì - thẻ theo dõi chỉ được hỗ trợ sau đó.
nrobey

2

Tôi cài đặt trên một máy tính windows và tạo một lô nhỏ để chuyển một repo SVN có lịch sử (nhưng không có chi nhánh) sang repo GIT chỉ bằng cách gọi

transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo

Có lẽ ai cũng có thể sử dụng nó. Nó tạo một thư mục TMP kiểm tra repo SVN ở đó bằng git và thêm nguồn gốc mới và đẩy nó ... và xóa thư mục một lần nữa.

@echo off 
SET FROM=%1 
SET TO=%2 
SET TMP=tmp_%random%

echo from:  %FROM% 
echo to:    %TO% 
echo tmp:   %TMP%

pause

git svn clone  --no-metadata --authors-file=users.txt %FROM% %TMP%  
cd %TMP% 
git remote add origin %TO% 
git push --set-upstream origin master


cd .. 
echo delete %TMP% ... 
pause

rmdir /s /q %TMP%

Bạn vẫn cần user.txt với ánh xạ người dùng của bạn như

User1 = User One <u.1@xxx.com>

Câu trả lời này đã giúp tôi chuyển tất cả các kho lưu trữ của mình sang BitBucket mà không gặp vấn đề gì.
Gonzalingui

Vui mừng khi nghe. Tôi chỉ có kinh nghiệm với Gitea ... nhưng đã yên tâm ~ ~ 40 repos theo cách này.
cljk

Rất đẹp! Thnx
b3wii

cảnh báo; Tôi đã trải qua các vấn đề charset xấu. Tôi nhận ra điều này thực sự quá muộn nhưng tôi phải mất vài giờ để sửa chữa. Vui lòng kiểm tra xem repo kết quả của bạn có chứa các nguồn dự kiến ​​chính xác (!)
cljk

1

Tôi chỉ muốn thêm đóng góp của mình cho cộng đồng Git. Tôi đã viết một tập lệnh bash đơn giản để tự động nhập toàn bộ. Không giống như các công cụ di chuyển khác, công cụ này dựa trên git gốc thay vì jGit. Công cụ này cũng hỗ trợ các kho lưu trữ với lịch sử sửa đổi lớn hoặc các đốm màu lớn. Nó có sẵn thông qua github:

https://github.com/onepremise/SGMS

Tập lệnh này sẽ chuyển đổi các dự án được lưu trữ trong SVN với định dạng sau:

/trunk
  /Project1
  /Project2
/branches
     /Project1
     /Project2
/tags
 /Project1
 /Project2

Chương trình này cũng phổ biến và được hỗ trợ:

/Project1
     /trunk
     /branches
     /tags
/Project2
     /trunk
     /branches
     /tags

Mỗi dự án sẽ được đồng bộ hóa theo tên dự án:

Ex: ./migration https://svnurl.com/basepath project1

Nếu bạn muốn chuyển đổi toàn bộ repo qua, hãy sử dụng cú pháp sau:

Ex: ./migration https://svnurl.com/basepath .

0

Sử dụng hiệu quả Git với Subversion là một giới thiệu nhẹ nhàng về git-svn. Đối với các kho lưu trữ SVN hiện có, git-svn làm cho việc này trở nên siêu dễ dàng. Nếu bạn đang bắt đầu một kho lưu trữ mới, trước tiên, việc tạo một kho lưu trữ SVN trống sẽ dễ dàng hơn và sau đó nhập bằng git-svn so với hướng ngược lại. Tạo một kho lưu trữ Git mới sau đó nhập vào SVN có thể được thực hiện, nhưng hơi khó khăn, đặc biệt nếu bạn chưa quen với Git và hy vọng sẽ lưu giữ lịch sử cam kết.


0

Tải xuống trình cài đặt Ruby cho Windows và cài đặt phiên bản mới nhất với nó. Thêm thực thi Ruby vào đường dẫn của bạn.

  • Cài đặt svn2git
  • Menu bắt đầu -> Tất cả chương trình -> Ruby -> Bắt đầu một dấu nhắc lệnh với Ruby
  • Sau đó, gõ gem gem cài đặt svn2git và nhập

    Di chuyển kho lưu trữ Subversion

  • Mở một dấu nhắc lệnh của Ruby và đi đến thư mục chứa các tệp sẽ được di chuyển

    Sau đó svn2git http: // [tên miền ] / svn / [kho lưu trữ gốc]

  • Có thể mất vài giờ để di chuyển dự án sang Git tùy thuộc vào kích thước mã dự án.

  • Bước quan trọng này giúp tạo ra cấu trúc kho lưu trữ Git như được đề cập dưới đây.

    Đường trung kế SVN (/ Project_components) -> nhánh Git SVN (/ Project_components) -> nhánh Git Thẻ SVN (/ Project_components) -> thẻ Git

Tạo kho lưu trữ từ xa và đẩy các thay đổi.


0

GitHub có một nhà nhập khẩu. Khi bạn đã tạo kho lưu trữ, bạn có thể nhập từ kho lưu trữ hiện có, thông qua URL của kho lưu trữ. Nó sẽ yêu cầu thông tin đăng nhập của bạn nếu có và đi từ đó.

Khi nó chạy, nó sẽ tìm các tác giả và bạn có thể chỉ cần ánh xạ chúng tới người dùng trên GitHub.

Bây giờ tôi đã sử dụng nó cho một vài kho lưu trữ và nó cũng khá chính xác và nhanh hơn nhiều! Phải mất 10 phút cho một kho lưu trữ với ~ 4000 lần xác nhận và sau khi bạn tôi mất bốn ngày!


0

Một số câu trả lời ở đây tham khảo https://github.com/nirvdrum/svn2git , nhưng đối với các kho lưu trữ lớn thì điều này có thể chậm. Tôi đã thử sử dụng https://github.com/svn-all-fast-export/svn2git thay vào đó là một công cụ có cùng tên nhưng được sử dụng để di chuyển KDE từ SVN sang Git.

Hơi nhiều công việc để thiết lập nó nhưng khi thực hiện chuyển đổi, tôi mất vài phút để tập lệnh khác mất hàng giờ.


0

Có nhiều phương pháp khác nhau để đạt được mục tiêu này. Tôi đã thử một vài trong số chúng và thấy thực sự hoạt động một cái chỉ với git và svn được cài đặt trên HĐH Windows.

Điều kiện tiên quyết:

  1. git trên windows (Tôi đã sử dụng cái này) https://git-scm.com/
  2. svn với các công cụ giao diện điều khiển được cài đặt (Tôi đã sử dụng rùa svn)
  3. Tệp kết xuất của kho SVN của bạn. svnadmin dump /path/to/repository > repo_name.svn_dump

Các bước để đạt được mục tiêu cuối cùng (di chuyển tất cả kho lưu trữ có lịch sử sang git, trước tiên là git cục bộ, sau đó từ xa)

  1. Tạo kho lưu trữ trống (sử dụng các công cụ bảng điều khiển hoặc tort tortSVN) trong thư mục REPO_NAME_FOLDER cd REPO_NAME_PARENT_FOLDER, đặt dumpfile.dump vào REPO_NAME_PARENT_FOLDER

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Đợi thao tác này, nó có thể dài

  3. Lệnh này im lặng, vì vậy hãy mở cửa sổ cmd thứ hai: svnserve -d -R --root REPO_NAME_FOLDER Tại sao không chỉ sử dụng tệp: /// ......? Nguyên nhân lệnh tiếp theo sẽ thất bại với Unable to open ... to URL:, nhờ câu trả lời https://stackoverflow.com/a/6300968/4953065

  4. Tạo thư mục mới SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. git svn clone svn: // localhost / Đợi thao tác này.

Cuối cùng, chúng ta có gì?

Hãy kiểm tra kho lưu trữ cục bộ của chúng tôi:

git log

Xem các cam kết trước đó của bạn? Nếu có - được

Vì vậy, bây giờ bạn có kho lưu trữ git cục bộ đầy đủ chức năng với các nguồn và lịch sử svn cũ của bạn. Bây giờ, nếu bạn muốn di chuyển nó đến một số máy chủ, hãy sử dụng các lệnh sau:

git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags

Trong trường hợp của tôi, tôi không cần lệnh thẻ vì repo của tôi không có thẻ.

Chúc may mắn!


0

Chuyển đổi thư mục con / thư mục svn 'MyModule' thành git với lịch sử không có thẻ cũng như các nhánh.

Để giữ lại danh sách bỏ qua svn, hãy sử dụng các ý kiến ​​trên sau bước 1

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.