Đẩy kho lưu trữ Git hiện có sang SVN


384

Tôi đã làm tất cả công việc của mình trong Git và đẩy sang GitHub. Tôi đã rất hài lòng với cả phần mềm và trang web và tôi không muốn thay đổi cách làm việc của mình vào thời điểm này.

Cố vấn tiến sĩ của tôi đang yêu cầu tất cả sinh viên giữ công việc của họ trong kho SVN được lưu trữ tại trường đại học. Tôi đã tìm thấy vô số tài liệu và hướng dẫn về việc kéo một kho lưu trữ SVN hiện có vào Git, nhưng không có gì về việc đẩy một kho lưu trữ Git sang một kho lưu trữ SVN mới. Tôi hy vọng phải có một số cách để làm điều này với sự kết hợp của git-svn và một nhánh mới và nổi loạn và tất cả những điều khoản tuyệt vời đó, nhưng tôi là một người mới chơi Git và không cảm thấy tự tin với bất kỳ ai trong số họ.

Sau đó tôi muốn chạy một vài lệnh để đẩy các xác nhận vào kho SVN đó khi tôi chọn. Tôi muốn tiếp tục sử dụng Git và chỉ cần có kho lưu trữ SVN nhân bản những gì trong Git.

Tôi sẽ là người duy nhất từng cam kết với SVN, nếu điều này tạo ra sự khác biệt.


1
Lưu ý: Bạn có thể sẽ mất tem ngày gốc khi bạn làm điều này. Ngày mới sẽ dựa trên thời gian nhập vào Subversion.
tộc

Đối với những người tìm kiếm thông tin cập nhật hơn một số có thể tìm thấy những hữu ích sau đây đăng trong thời gian tìm kiếm của họ để tự động hóa: deliciousbrains.com/deploying-wordpress-plugins-travis
Josh Habdas

Câu trả lời:


402

Tôi cũng cần điều này, và với sự giúp đỡ của câu trả lời của Bombe + một số vấn đề xung quanh, tôi đã làm cho nó hoạt động. Đây là công thức:

Nhập Git -> lật đổ

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

Sau # 3, bạn sẽ nhận được một tin nhắn khó hiểu như thế này:

Sử dụng cấp độ URL cao hơn: protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

Chỉ cần bỏ qua điều đó.

Khi bạn chạy số 5, bạn có thể gặp xung đột. Giải quyết những điều này bằng cách thêm các tệp với trạng thái "chưa được trộn" và tiếp tục rebase. Cuối cùng, bạn sẽ được thực hiện; sau đó đồng bộ hóa trở lại kho SVN, sử dụng dcommit. Đó là tất cả.

Giữ các kho lưu trữ đồng bộ

Bây giờ bạn có thể đồng bộ hóa từ SVN sang Git, sử dụng các lệnh sau:

git svn fetch
git rebase trunk

Và để đồng bộ hóa từ Git sang SVN, hãy sử dụng:

git svn dcommit

Lưu ý cuối cùng

Bạn có thể muốn thử điều này trên một bản sao cục bộ, trước khi đăng ký vào kho lưu trữ trực tiếp. Bạn có thể tạo một bản sao của kho Git của bạn đến một nơi tạm thời; chỉ cần sử dụng cp -r, vì tất cả dữ liệu nằm trong chính kho lưu trữ. Sau đó, bạn có thể thiết lập kho lưu trữ thử nghiệm dựa trên tệp bằng cách sử dụng:

svnadmin create /home/name/tmp/test-repo

Và kiểm tra một bản sao làm việc, sử dụng:

svn co file:///home/name/tmp/test-repo svn-working-copy

Điều đó sẽ cho phép bạn chơi xung quanh với mọi thứ trước khi thực hiện bất kỳ thay đổi lâu dài nào.

Phụ lục: Nếu bạn gây rối git svn init

Nếu bạn vô tình chạy git svn initsai URL và bạn không đủ thông minh để sao lưu công việc của mình (đừng hỏi ...), bạn không thể chạy lại cùng một lệnh. Tuy nhiên, bạn có thể hoàn tác các thay đổi bằng cách phát hành:

rm -rf .git/svn
edit .git/config

Và loại bỏ phần [svn-remote "svn"]phần.

Sau đó bạn có thể chạy git svn initlại.


2
Câu trả lời tốt đẹp. Điều này cũng làm rối tung ngày cam kết?
vẽ Noakes

4
Câu hỏi hay - Thật không may, tôi cũng không biết câu trả lời. Đây là một hướng dẫn thực tế về những gì tôi tìm thấy để làm việc. Tôi không hiểu đầy đủ tất cả các chi tiết. Về ngày cam kết, tôi đoán bạn có thể làm một bài kiểm tra và tìm hiểu. Hãy nhớ rằng bạn có thể khởi tạo repo svn cục bộ (dựa trên fs) để thử nghiệm mọi thứ.
troelskn

10
Tôi đã làm theo các bước tương tự sử dụng "git rebase --onto thân --root" ở vị trí của bước 5 và có nhiều thành công hơn. Chỉ một số ít các xung đột hợp nhất để giải quyết, thay vì tấn.
kubi

5
Trong trường hợp của tôi, trình tự này đã không làm việc. Luôn có thông báo "Không thể xác định thông tin SVN ngược dòng từ lịch sử CHÍNH" được hiển thị. Vì vậy, không có dcommit có thể.
Fedir RYKHTIK

2
Mặc dù vậy, tôi đã cố gắng để có được thông minh và bỏ qua các -s vì tôi không muốn tuân theo thiết lập tiêu chuẩn SVN (thân cây / nhánh / thẻ /). Không thể làm cho nó hoạt động được nếu không có điều đó.
James McMahon

33

Đây là cách chúng tôi làm cho nó hoạt động:

Sao chép kho Git của bạn ở đâu đó trên máy của bạn.

Mở .git / config và thêm phần sau (từ Duy trì bản sao SVN chỉ đọc của kho Git ):

[svn-remote "svn"]
    url = https://your.svn.repo
    fetch = :refs/remotes/git-svn

Bây giờ, từ một cửa sổ giao diện điều khiển, gõ:

git svn fetch svn
git checkout -b svn git-svn
git merge master

Bây giờ, nếu nó bị hỏng ở đây vì bất kỳ lý do gì, hãy nhập ba dòng sau:

git checkout --theirs .
git add .
git commit -m "some message"

Và cuối cùng, bạn có thể cam kết với SVN:

git svn dcommit

Lưu ý: Tôi luôn loại bỏ thư mục đó sau đó.


6
+1 điều này thực sự hiệu quả với tôi (không có thân cây / cơ sở nào cả), trái ngược với các câu trả lời khác tiếp tục đưa raUnable to determine upstream SVN information from HEAD history.
stijn


2
Tôi đã thử kỹ thuật này, nhưng nó không nhập lịch sử. Btw, "git merge master" hiện là "git merge - master -allow-không liên quan đến lịch sử"
Berend de Boer

1
Nếu bạn hoàn toàn muốn ghi đè lên những gì trong SVN bằng những gì trong git, hãy sử dụng git merge -s recursive -Xtheirs --allow-unrelated-histories master.
dùng1485814

28

Sử dụng git rebasetrực tiếp sẽ mất cam kết đầu tiên. Git đối xử với nó khác nhau và không thể bắt bẻ nó.

Có một quy trình sẽ lưu giữ toàn bộ lịch sử: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034

Tôi sẽ phiên âm giải pháp ở đây, nhưng các khoản tín dụng dành cho Bjorn.

Khởi tạo git-svn:

git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2

--Prefix cung cấp cho bạn các nhánh theo dõi từ xa như "svn / trunk", điều này thật tuyệt vì bạn không nhận được tên mơ hồ nếu bạn gọi chi nhánh địa phương của mình chỉ là "thân cây". Và -slà một lối tắt cho bố trí thân cây / thẻ / chi nhánh tiêu chuẩn.

Lấy nội dung ban đầu từ SVN:

git svn fetch

Bây giờ hãy tìm hàm băm của cam kết gốc của bạn (sẽ hiển thị một cam kết duy nhất):

git rev-list --parents master | grep '^.\{40\}$'

Sau đó nhận được hàm băm của cam kết rỗng:

git rev-parse svn/trunk

Tạo mảnh ghép:

echo <root-commit-hash> <svn-trunk-commit-hash> >> .git/info/grafts

Bây giờ, "gitk" sẽ hiển thị svn/trunknhư là cam kết đầu tiên mà nhánh chính của bạn dựa trên.

Làm cho mảnh ghép vĩnh viễn:

git filter-branch -- ^svn/trunk --all

Thả mảnh ghép:

rm .git/info/grafts

gitk vẫn nên hiển thị svn/trunktrong tổ tiên của chủ.

Tuyến tính hóa lịch sử của bạn trên đỉnh của thân cây:

git svn rebase

Và bây giờ "git svn dcommit -n" sẽ cho bạn biết rằng nó sẽ cam kết với thân cây.

git svn dcommit

Bạn có thể giải thích làm thế nào kỹ thuật này khác với ở trên rõ ràng hơn.
cmcginty

3
Khi tôi thử "git rev-parse svn / trunk", nó báo cáo sửa đổi không xác định hoặc đường dẫn không có trong cây làm việc.
Adam Ness

Đây là câu trả lời duy nhất có hiệu quả với tôi, ngoại trừ các bước git lọc nhánh và thả ghép không cần thiết: Tôi đã thực hiện một rebase sau khi tạo mảnh ghép, và sau đó git svn dcommit.
fc7

8

Tạo một thư mục mới trong kho Subversion cho dự án của bạn.

# svn mkdir --parents svn://ip/path/project/trunk

Thay đổi dự án do Git quản lý của bạn và khởi tạo git-svn.

# git svn init svn://ip/path/project -s
# git svn fetch

Điều này sẽ tạo ra một cam kết duy nhất vì thư mục dự án SVN của bạn vẫn trống. Bây giờ rebase tất cả mọi thứ trên cam kết đó, git svn dcommitvà bạn nên được thực hiện. Nó sẽ nghiêm túc làm rối ngày cam kết của bạn, mặc dù.


Tôi đã sử dụng câu trả lời này với hướng dẫn tại hassox.blogspot.com/2007/12/using-git-with-svn.html Tôi đi theo các lệnh này, sau đó "chi nhánh -a #git" để xem tên thân cây. Sau đó: # git checkout -b local-svn trunk # git merge master # git svn dcommit Hãy nhớ .gitignore thư mục .svn!
cflewis

Khi tôi vừa thực hiện thao tác tương tự, tôi muốn làm rõ rằng bây giờ (tháng 1 năm nay), git có thể thực hiện thao tác rebase trên cam kết gốc. Điều này làm cho quá trình này đơn giản hơn rất nhiều so với các bài báo cũ chỉ ra, xem bình luận trên của nó.arubything.com/2009/1/4/ Kẻ
Louis Jacomet

Tùy chọn git svn init "-s" làm gì? Tôi không thể thấy điều này trong các trang dành cho git svn.
Nathan

Đọc trang người đàn ông một lần nữa, có thể tìm kiếm cho -s-vì vì nó ở trong đó. Đó là một bí danh cho trang web --stdlayout.
Bombe

7

Git -> SVN với lịch sử cam kết hoàn thành

Tôi đã có một dự án Git và phải chuyển nó sang SVN. Đây là cách tôi thực hiện nó, giữ toàn bộ lịch sử cam kết. Điều duy nhất bị mất là thời gian cam kết ban đầu vì libSVN sẽ đặt giờ địa phương khi chúng tôi thực hiện git svn dcommit.

Làm thế nào để:

  1. Có kho lưu trữ SVN nơi chúng tôi muốn nhập nội dung của mình vào và sao chép nó với git-svn:

    git svn clone https://path.to/svn/repository repo.git-svn`
    
  2. Đến đó:

    cd repo.git-svn
    
  3. Thêm điều khiển từ xa của kho Git (trong ví dụ này tôi đang sử dụng C: /Projects/repo.git ). Bạn muốn đẩy sang SVN và đặt tên cũ là git:

    git remote add old-git file:///C/Projects/repo.git/
    
  4. Lấy thông tin từ nhánh chính từ kho lưu trữ cũ-git đến kho lưu trữ hiện tại:

    git fetch old-git master
    
  5. Kiểm tra nhánh chính của điều khiển từ xa cũ vào một nhánh mới gọi là cũ trong kho lưu trữ hiện tại:

    git checkout -b old old-git/master`
    
  6. Rebase để đặt ĐẦU trên đầu cũ / git. Điều này sẽ duy trì tất cả các cam kết của bạn. Điều này về cơ bản là lấy tất cả công việc của bạn được thực hiện trong Git và đặt nó lên trên công việc bạn đang truy cập từ SVN.

    git rebase master
    
  7. Bây giờ hãy quay lại chi nhánh chính của bạn:

    git checkout master
    

    Và bạn có thể thấy rằng bạn có một lịch sử cam kết sạch sẽ. Đây là những gì bạn muốn đẩy đến SVN.

  8. Đẩy công việc của bạn lên SVN:

    git svn dcommit
    

Đó là tất cả. Nó rất sạch sẽ, không hack, và mọi thứ hoạt động hoàn hảo. Thưởng thức.


Quá trình tương tự cũng được nêu chi tiết tại chani.wordpress.com/2012/01/11/áng
TWiStErRob

Giống như. Tuy nhiên, tôi thấy cách của cô ấy khá khó hiểu và của tôi thì ngắn hơn nhiều (8 bước so với 19/23). Có thể tôi không hiểu cô ấy một cách chính xác nhưng tôi nghĩ cô ấy trộn các lệnh svn và git ở viên đạn thứ hai.
mã hóa

À, vâng, sự khác biệt là quy trình của bạn nhập git vào gốc của repo SVN, cô ấy nhập nó vào thư mục con, đó là lý do tại sao cần có một vài giao diện git svn.
TWiStErRob

Trong bước 7, không nên có một git merge cũ? Đối với tôi, có vẻ như bạn đang tạo ra một chủ nhân mà bạn chưa thay đổi?!
Alexander

@Alexander sử dụng 'git rebase master', chúng tôi mang lại một sự hợp nhất nhanh chóng, đó là một sự hợp nhất tuyến tính mà không có một cam kết hợp nhất có hai cha mẹ. Chúng tôi muốn có một lịch sử tuyến tính ở đây.
mã hóa


3

Tôi cần phải cam kết kho Git hiện tại của mình với kho SVN trống.

Đây là cách tôi quản lý để làm điều này:

$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit

Nó làm việc mà không có vấn đề. Tôi hi vọng điêu nay se giup được ai đo.

Vì tôi phải ủy quyền cho mình một tên người dùng khác cho kho lưu trữ SVN (tôi originsử dụng xác thực khóa riêng / công khai), tôi phải sử dụng thuộc --usernametính này.


bạn có thể cần phải cài đặt git-svntrước khi có thể, xem stackoverflow.com/questions/527037/git-svn-not-a-git-command
linh hoạt

2

Nếu bạn muốn tiếp tục làm việc với Git làm kho lưu trữ chính của mình và chỉ cần thỉnh thoảng "xuất" các bản sửa đổi sang SVN, bạn có thể sử dụng Tailor để giữ cho kho lưu trữ SVN được đồng bộ hóa. Nó có thể sao chép các sửa đổi giữa các hệ thống kiểm soát nguồn khác nhau và sẽ cập nhật SVN với những thay đổi bạn thực hiện trong Git.

Tôi chưa thử chuyển đổi Git-S-SVN, nhưng đối với ví dụ SVN -> SVN, hãy xem câu trả lời này .


2

Một trình tự khác đã hoạt động (với một số nhận xét về mỗi bước):

  1. Cài đặt git-svnsubversionbộ công cụ:

    sudo apt-get install git-svn subversion
    
  2. Chuyển bên trong PROJECT_FOLDER

    cd PROJECT_FOLDER
    
  3. Tạo đường dẫn dự án trên máy chủ Subversion (không may là git-svnplugin hiện tại có khiếm khuyết so với TortoiseSVN). Nó không thể lưu trữ mã nguồn trực tiếp vào PROJECT_FOLDER. Thay vào đó, theo mặc định, nó sẽ tải lên tất cả các mã vào PROJECT_FOLDER/trunk.

    svn mkdir - giao thức chi tiết: /// path / to / repo / PRO DỰ_FOLDER / trunk -m "tạo git repo giữ chỗ"

Đây là nơi bắt buộctrunk ở cuối con đường

  1. Khởi tạo git-svnbối cảnh plugin bên trong .gitthư mục

    git svn init -s protocol:///path/to/repo/PROJECT_FOLDER
    

    Đây là nơi trunkở cuối con đường là không cần thiết

  2. Lấy Subversionthông tin kho lưu trữ trống

    git svn fetch
    

    Bước này giúp đồng bộ hóa máy chủ Subversion với git-svnplugin. Đây là thời điểm khi git-svnplugin thiết lập remotes/originđường dẫn và liên kết nó với trunkthư mục con ở phía máy chủ.

  3. Rebase cam kết Git cũ đã xảy ra trước khi git-svnplugin tham gia vào quá trình (bước này là tùy chọn )

    git rebase origin/trunk
    
  4. Thêm tệp mới / sửa đổi để cam kết (bước này là thường xuyên cho các hoạt động Git và là tùy chọn )

    git add .
    
  5. Cam kết các tệp mới được thêm vào kho Git cục bộ (bước này là tùy chọn và chỉ được áp dụng nếu bước 7 đã được sử dụng):

    git commit -m "Importing Git repository"
    
  6. Đẩy tất cả dự án thay đổi lịch sử vào máy chủ Subversion:

    git svn dcommit
    

1

Bạn có thể tạo một kho lưu trữ SVN mới. Xuất dự án Git của bạn (khai thác các tệp .git). Thêm nó vào kho lưu trữ SVN (khởi tạo kho lưu trữ với những gì bạn đã có trong Git). Sau đó sử dụng các hướng dẫn để nhập kho SVN trong dự án Git mới.

Nhưng điều này sẽ mất lịch sử Git trước đây của bạn.


1

Nếu bạn không phải sử dụng bất kỳ SVN cụ thể nào và bạn đang sử dụng GitHub, bạn có thể sử dụng trình kết nối SVN của họ.

Thêm thông tin ở đây: Cộng tác trên GitHub với Subversion


SVN gì? Trong ( "... bất kỳ SVN cụ thể và ..." ). Phiên bản SVN? SVN khách hàng? Hay cái gì khác?
Peter Mortensen

1

Tôi muốn chia sẻ một công cụ tuyệt vời đang được sử dụng trong cộng đồng WordPress có tên là Scatter

Git WordPress plugin và một chút phân tán sanity

Điều này cho phép người dùng có thể tự động gửi kho Git của họ tới wordpress.org SVN. Về lý thuyết, mã này có thể được áp dụng cho bất kỳ kho lưu trữ SVN nào.


Liên kết dường như bị phá vỡ một cách hiệu quả ( "Máy chủ tại evansolomon.me đang mất quá nhiều thời gian để phản hồi." ).
Peter Mortensen

1

Gần đây tôi đã phải di chuyển một số kho Git sang SVN và sau khi thử tất cả các giải pháp tôi có thể tìm thấy, thứ cuối cùng có hiệu quả với tôi là Mercurial (vâng, sử dụng VCS thứ ba ). Sử dụng hướng dẫn này , tôi đã đưa ra quy trình sau (trên Linux, nhưng ý tưởng cơ bản cũng sẽ hoạt động trên Windows).

  1. Các gói cần thiết:

    $ sudo apt-get install git subversion mercurial python-subversion
    
  2. Mercurial cần được cấu hình bằng cách thêm vào sau ~/.hgrc:

    [extensions]
    hgext.convert=
    
  3. Tạo một số thư mục hoạt động tạm thời (tôi có một số kho lưu trữ để di chuyển vì vậy tôi đã tạo các thư mục cho các phiên bản SVN và Git, để tách chúng ra):

    $ mkdir svn
    $ mkdir git
    
  4. Tạo một kho lưu trữ SVN cục bộ trống:

    $ svnadmin create svn/project
    
  5. Sao chép kho Git hiện có:

    $ git clone server/path/project.git git/project
    
  6. Hãy để Mercurial làm việc của nó:

    $ hg convert --dest-type svn git/project svn/project
    
  7. Bây giờ kho lưu trữ SVN sẽ chứa toàn bộ lịch sử cam kết, nhưng không có dấu thời gian ban đầu. Nếu đây không phải là vấn đề, hãy bỏ qua phần tiếp theo sang bước 11.

  8. Với một chút công việc, ngày và giờ của mỗi lần cam kết có thể được thay đổi . Vì kho lưu trữ của tôi khá nhỏ, nên tôi có thể thực hiện thủ công. Đầu tiên, tạo một pre-revprop-changehook trong kho SVN với các nội dung sau, để cho phép sửa đổi thuộc tính cần thiết:

    #!/bin/bash
    exit 0;
    

    Kịch bản này phải được thực hiện:

    $ chmod +x svn/project/hooks/pre-revprop-change
    
  9. Mercurial đã tạo một bản sao hoạt động của kho SVN, được đặt tên là project -wc, vì vậy hãy chuyển sang nó và chỉnh sửa thời gian cam kết:

    $ cd project-wc
    $ svn propedit svn:date --revprop -r 1
    

    Nhập ngày giờ chính xác (chú ý đến múi giờ!) Và lưu lại. Bạn sẽ nhận được thông báo "Đặt giá trị mới cho thuộc tính svn: ngày trên phiên bản 1".
    Bây giờ rửa sạch và lặp lại cho mỗi sửa đổi khác.

  10. Tùy chọn kiểm tra lịch sử cam kết để đảm bảo mọi thứ đều ổn:

    $ svn log -r 1:HEAD
    

    Sau đó quay trở lại một cấp:

    $ cd ..
    
  11. Kết xuất kho lưu trữ:

    $ svnadmin dump svn/project > project.dump
    
  12. Và tải kết xuất trên máy chủ Subversion của bạn. Làm xong!

Quá trình này có thể cũng sẽ hoạt động trực tiếp giữa các kho từ xa, nhưng tôi thấy làm việc với các kho cục bộ dễ dàng hơn. Sửa thời gian cam kết là rất nhiều công việc, nhưng nhìn chung quá trình này đơn giản hơn nhiều so với bất kỳ phương pháp nào tôi tìm thấy.


1

Có ba phương pháp

  1. rebase lại như những câu trả lời khác

  2. cam kết id: tìm svn đầu tiên cam kết id và git đầu tiên cam kết id, echo của họ vào .git / info / ghép: echo "git_id svn_id}" > .git/info/graftssau đógit svn dcommit

  3. kiểm tra mọi cam kết git, sao chép tệp vào svn numpo, svn commit

bash demo demo github demo

v1.xay sử dụng rebase và commit id

v2.x: sử dụng tệp sao chép, sau đó svn commit


0

Trong trường hợp của tôi, tôi đã phải bắt đầu một dự án sạch từ SVN

$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch

thêm tất cả các nguồn dự án của bạn ...

$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit

0

Tôi chỉ muốn chia sẻ một số kinh nghiệm của tôi với câu trả lời được chấp nhận. Tôi đã làm tất cả các bước và tất cả đều ổn trước khi tôi chạy bước cuối cùng:

git svn dcommit

$ git svn dcommit

Sử dụng giá trị chưa được khởi tạo $ u thay thế (s ///) tại /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm dòng 101.

Sử dụng giá trị chưa được khởi tạo $ u trong nối (.) Hoặc chuỗi tại /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm dòng 101. refs / remotes / origin / HEAD: ' https://192.168.2.101/ svn / PRO DỰ_NAME 'không tìm thấy trong' '

Tôi đã tìm thấy chủ đề https://github.com/nirvdrum/svn2git/issues/50 và cuối cùng là giải pháp mà tôi đã áp dụng trong tệp sau trong dòng 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm

tôi đã thay thế

$u =~ s!^\Q$url\E(/|$)!! or die

với

if (!$u) {
    $u = $pathname;
} 
else {
       $u =~ s!^\Q$url\E(/|$)!! or die
      "$refname: '$url' not found in '$u'\n";
}

Điều này đã khắc phục vấn đề của tôi.


-1

Điều gì nếu bạn không muốn cam kết mỗi cam kết mà bạn thực hiện trong Git, với kho lưu trữ SVN? Điều gì nếu bạn chỉ muốn chọn lọc gửi cam kết lên đường ống? Vâng, tôi có một giải pháp tốt hơn.

Tôi giữ một kho lưu trữ Git cục bộ nơi tất cả những gì tôi từng làm là tìm nạp và hợp nhất từ ​​SVN. Bằng cách đó, tôi có thể chắc chắn rằng mình bao gồm tất cả các thay đổi tương tự như SVN, nhưng tôi hoàn toàn tách biệt lịch sử cam kết của mình với SVN.

Sau đó, tôi giữ một bản sao làm việc cục bộ SVN riêng trong một thư mục riêng. Đó là thứ tôi thực hiện cam kết trở lại SVN và tôi chỉ đơn giản sử dụng tiện ích dòng lệnh SVN cho việc đó.

Khi tôi sẵn sàng cam kết trạng thái kho lưu trữ Git cục bộ của mình với SVN, tôi chỉ cần sao chép toàn bộ mớ hỗn độn của tệp vào bản sao làm việc SVN cục bộ và cam kết nó từ đó bằng SVN chứ không phải Git.

Bằng cách này, tôi không bao giờ phải thực hiện bất kỳ cuộc nổi loạn nào, bởi vì việc nổi loạn cũng giống như hoạt động tự do.

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.