it-swarm-vi.tech

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?

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 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ư 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.

1453
Milan Babuškov

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. Trang man git-svn có phần ví dụ hay:

$ git svn --help
513
jfm3

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

user1 = First Last Name <[email protected]>
user2 = First Last Name <em[email protected]>
...

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 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ụ ý rằng bạn có bố cục "trunk /, cành /, tags /" SVN chung. Nếu bố cục của bạn khác, hãy làm quen với các tùy chọn --tags, --branches, --trunk (nói chung là git svn help).

Tất cả các giao thức phổ biến được cho 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 . Điều đó phải không bao gồm /trunk, /tag hoặ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 cờ --no-metadata, Git sẽ nối thông tin về sửa đổi SVN tương ứng vào thông báo 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 tệp users.txt 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 trunk thà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
1512
cmcginty

Di 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ạ tên tác giả cam kết Subversion của bạn tới những người cam kết Git, giả sử ~/authors.txt:

jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>

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 sử dụng máy Mac, bạn có thể nhận 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 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
185
Eugene Yokota

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

69

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 [email protected]: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ử công cụ git_remote_branch của riêng 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 "

57
webmat

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_Vpose/.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 (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!

30
Alexander Kitaev

Xem trang chính thức 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
17
EfForEffort
13
kdahlhaus

SubGit ​​(so với màn hình xanh chết chóc)

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 chuẩn bị một chút.
[.__.] Nhưng bạn hoàn toàn không thể ngừ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 việc cập nhật quá trình di chuyển đã hoàn thành chỉ vài giây.

Tất nhiên tôi đang sử dụng SubGit , mama. git-svn khiến 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 " 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 cài đặt của SubGit bin (subgit-2.X.X\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à để Shell mở sau khi hoàn thành SubGit.

Bạn có thể thêm vào đây tham số bổ sung tương tự như git-svn . Tôi chỉ sử dụng - tên miền mặc định 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ư các nhánh hoặc SVN của bạn có nhiều thư mục nhánh/thẻ bạn có thể xem xét để sử dụng SubGit dài hơn cách tiếp cận )

Mẹo 1 : Sử dụng --minimal-revision 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 : Quá trình 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ưu trữ 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ống của bạn (ví dụ: tạo các 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 đầ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.
[.__.] Sẽ mất vài giây.



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

Đẩy kho lưu trữ Git cục bộ của bạn sang kho lưu trữ 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. fatal: Kết thúc từ xa bị 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.

Sửa lỗi cục bộ của bạn rắc rối chứng chỉ . Nếu máy chủ git của bạn sử dụng chứng chỉ bị hỏng.

Tôi đã tắt 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 .

  1. Đẩy tất cả di chuyển vào kho Git từ xa của nhóm.

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

git Push Origin --mirror

( git Push Origin '*: *' cho các phiên bản Git cũ)

Nếu bạn gặp phải các lỗi sau: : không thể sinh ra git: Không có tệp hoặc thư mục nào như vậ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 ...

13
it3xl

bác sĩ phẫu thuật

Đối với các trường hợp phức tạp, reposurgeon bởi Eric S. Raymond là công cụ được lựa chọn. Ngoài SVN, nó còn hỗ trợ nhiều hệ thống kiểm soát phiên bản khác thông qua định dạng fast-export và cả 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 hoàn hảo (chẳng hạn như chuyển đổi các thuộc tính svn:ignore của SVN thành các tệp .gitignore) 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 dòng lệnh reposurgeon, hãy nhớ đọc hướng dẫn di chuyển DVCS xuất sắc từng bước qua quy trình chuyển đổi.

9
krlmlr

Hướng dẫn này trên trang web của atlassian là một trong những điều 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.

7
Andrew B

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ỉ liệt kê tên người dùng cho mỗi cam kết. Cam kết Git sườn 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ả hai 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ả 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 <[email protected]>

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 git trong thư mục của ~.

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ữ lên kho lưu trữ git trần

Đầu tiên, tạo một kho lưu trữ trần và làm cho nhánh nhánh mặc định của nó khớp với tên 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 vặt thành nhánh 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 có thể đổi tên nó thành chi nhánh Gitùi tiêu chuẩn 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ác nhánh 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 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
Valarpirai

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/thẻ (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 <[email protected]>";
done

Sử dụng điều này để tạo tệp authors 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ách sử dụng git config property user.nameuser.email (lưu ý rằng đối với một dịch vụ như GitHub chỉ có email phù hợp là đủ).

Sau đó, có git svn sao 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 đã 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 thêm một số bước.

Đơ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 git svn này chỉ đơn giản 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. Đối với git svn clone chỉ cần sử dụng thư mục bạn muốn đặt trong 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.

6
thoutbeckers

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ù.

6
webmat

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 [email protected]: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, hãy đọc bài đăng của tôi hoặc hỏi tôi.

5
Pablo Belaustegui

Chúng ta có thể sử dụng các lệnh git svn clone 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ẻ thành Push. 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

svn2git tiệ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 Nice xung quanh lệnh git svn clone gốc.

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

5
Pankaj

RùaGit làm điều này. xem bài đăng trên blog này: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-USE-tortoir-clents

Vâng, tôi biết trả lời bằng các liên kết không phải là tuyệt vời nhưng đó là một giải pháp, eh?

4
CAD bloke

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.au và: [.__.]
    • 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 (kiểm tra bằng cách sử dụng ssh [email protected]).
    • Dự án favourite-project được tạo trong không gian tên dev-team.
  • Tệp users.txt 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ó dạng username = First Last <[email protected]>, trong đó usernamelà tê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 gi[email protected]: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 không xác định, lệnh git svn clone sẽ dừng, trong trường hợp đó, cập nhật users.txt, cd favourite-projectgit svn fetch sẽ tiếp tục từ nơi dừng.
  • Bố cục trunkname __-tagsname __-branchescho kho lưu trữ SVN là bắt buộc.
  • URL SVN được cung cấp cho lệnh git svn clone dừng ở cấp độ ngay trên trunk/, tags/branches/.
  • Lệnh git svn clone tạo ra rất nhiều đầu ra, bao gồm một số cảnh báo ở trên cùng; Tôi bỏ qua những lời cảnh báo.
3
leftclickben

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ộ của loại".
  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.

3
Craig Myles

Tôi đánh giá cao đề xuất này loạt screencasts ngắn Tôi mới phát hiện ra. Tác giả 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
ripper234

Đâ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 việc 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
NateS

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
Gregg Lind

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 Origin 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 <[email protected]>
2
cljk

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 vào 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 và các đốm màu lớn. Nó có sẵn thông qua github:

https://github.com/onepremise/SGMS

Kịch bản 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 .
1
Jason Huntley

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ô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, có thể lâu

  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
Ruslan Makrenko

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 cam kết, và sau khi bạn tôi mất bốn ngày!

0
Josh Benson

Hiệu quả sử dụng Git với Subversionlà 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 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
burkestar

Một số câu trả lời ở đây đề cập đến 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 đã dùng thử 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 hơn để 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
Zitrax

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 lệnh Nhắc với Ruby
  • Sau đó nhập loại đá quý cài đặt svn2git và nhập

    Di chuyển kho lưu trữ Subversion

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

    Sau đó svn2git http: // [domain name]/svn/[root root]

  • 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
Nanda

Tôi đã sử dụng tập lệnh sau để đọc tệp văn bản có danh sách tất cả các kho SVN của tôi và chuyển đổi chúng thành Git, và sau đó sử dụng git clone --bare để chuyển đổi sang kho Git trần:

#!/bin/bash
file="list.txt"
while IFS= read -r repo_name
do
 printf '%s\n' "$repo_name"
 Sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name
 Sudo git clone --bare /programs/git/$repo_name $repo_name.git
 Sudo chown -R www-data:www-data $repo_name.git
 Sudo rm -rf $repo_name
done <"$file"

list.txt có định dạng:

repo1_name
repo2_name

Và users.txt có định dạng:

(no author) = Prince Rogers <[email protected]>

dữ liệu www là người dùng máy chủ web Apache và cần có sự cho phép để đẩy các thay đổi qua HTTP.

0
Pedro Vicente

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

0
PShetty