2009-02-20 37 views
16

Tôi có cây làm việc 'git-svn'. Tôi muốn sao chép một "tinh khiết" git repo off này, và sau đó sử dụng git push/pull để di chuyển thay đổi giữa cây git-svn và cây git, trong khi cũng sử dụng 'git svn dcommit/rebase' để di chuyển thay đổi giữa cây git-svn và repo SVN dựa trên nó. Điều này dường như làm việc tốt như xa như di chuyển mọi thứ qua lại giữa các cây git bằng cách sử dụng các phương pháp git, nhưng ngay sau khi tôi tương tác với repo SVN trong cây git-svn, mọi thứ trở nên chiến thắng - tôi nhận được lỗi khi đẩy hoặc kéo giữa các cây git, hoặc tôi mất các cam kết trong cây git-svn, hoặc sự kỳ quặc khác.git clone của cây git-svn?

Đây có phải là loại SVN < -> git-svn < -> git workflow được hỗ trợ ở tất cả hay nên tôi chỉ cần bỏ vỏ cây lên?

Trả lời

5

Dựa trên những gì tôi đã nhìn thấy, công việc này không được hỗ trợ với git-svn, và sẽ không được, do cách SVN đại diện sáp nhập.

+0

Vì vậy, câu hỏi này nằm ở đây với một câu trả lời trong gần một năm, và cuối cùng tôi thêm một cái gì đó để tôi có một cái gì đó hợp lý chính xác để chấp nhận (không vi phạm với Christoph), và sau đó hai người bật ra khỏi đồ gỗ để cung cấp các phiên bản của cùng một điều Tôi đã đăng lên. Tuyệt vời. – genehack

9

Tôi có một thiết lập cầu cho một số dự án của mình, nhưng nó chỉ là một chiều từ git đến svn (cung cấp một gương SVN chỉ đọc công khai của nhánh git master). Tuy nhiên, vì nó hoạt động tốt, nó có thể giúp bạn hoặc chỉ cho bạn đúng hướng trong kịch bản hai chiều của bạn, như tôi cho rằng đó là git-> svn gây ra vấn đề, không phải svn-> git:

My one- kịch bản cách: kho git hiện tại github, cần một tấm gương svn readonly của git thạc sĩ ngành

  • Tạo và khởi tạo kho mục tiêu lật đổ trên server:

    svnadmin create svnrepo 
    mkdir trunk 
    svn import trunk svn://yoursvnserver/svnrepo 
    rmdir -rf trunk 
    
  • Tạo một Git- hỗn hợp Svn checkout và khởi tạo kho lưu trữ subversion

    git svn clone svn://yoursvnserver/svnrepo/trunk 
    cd trunk 
    git remote add github git://github.com/yourname/repo.git 
    git fetch github 
    git branch tmp $(cat .git/refs/remotes/github/master) 
    git tag -a -m "Last fetch" last tmp 
    INIT_COMMIT=$(git log tmp --pretty=format:%H | tail -1) 
    git checkout $INIT_COMMIT . 
    git commit -C $INIT_COMMIT 
    git rebase master tmp 
    git branch -M tmp master 
    git svn dcommit --rmdir --find-copies-harder 
    
  • Cập nhật gương

    git fetch github 
    git branch tmp $(cat .git/refs/remotes/github/master) 
    git tag -a -m "Last fetch" newlast tmp 
    git rebase --onto master last tmp 
    git branch -M tmp master 
    git svn dcommit --rmdir --find-copies-harder 
    mv .git/refs/tags/newlast .git/refs/tags/last 
    

này hai bài báo từ googlecode có thể giúp đỡ cũng như:

+0

Tôi đã bỏ phiếu cho câu trả lời này, vì tôi nghĩ rằng nó thường hữu ích, tuy nhiên nó dựa trên tiền đề thiếu sót. Vấn đề gần như chắc chắn không phải là git-> svn, cũng không phải svn-> git, ít nhất là không trực tiếp. Thay vào đó git-svn-> git bước sẽ là vấn đề, vì lịch sử đang được viết lại bởi svn-> git, có nghĩa là hai kho lưu trữ sẽ không còn có cùng một lịch sử, và cuộc sống sẽ trở nên khó hiểu. –

3

Như tôi đã thường nói trên #git:

git-svn cũng giống như một chiếc xe bay. Mọi người đều muốn một chiếc xe hơi bay, cho đến khi họ nhận ra một chiếc xe hơi bay là khá xấu như một chiếc xe hơi hoặc một chiếc máy bay.

Giải pháp thực sự là thoát khỏi SVN hoàn toàn, nhanh nhất có thể. Sử dụng git-svn để di chuyển một lần, sau đó di chuyển mọi người. Git là không phải là khó học.

+9

Giải pháp thực sự của bạn giả định rằng lựa chọn di chuyển ra khỏi Subversion có sẵn. Ngắn "di chuyển sang một công việc mới", đôi khi nó không phải là. – genehack

9

git svn dcommit sẽ viết lại tất cả các cam kết mà nó gửi tới SVN- ít nhất là nếu nó được cấu hình để thêm ghi chú siêu dữ liệu SVN vào cuối thư cam kết. Vì vậy, bạn sẽ phải thông qua một dòng chảy mà bất kỳ kho chứa cam kết từ rebit git-svn workspace của bạn chống lại nó, mất tất cả lịch sử hợp nhất mà không thể được lưu trữ trong SVN anyway.

+0

đã bỏ phiếu, vì đây có thể là nguyên nhân thực sự của vấn đề, ít nhất là dựa trên sự hiểu biết của tôi về vấn đề này. –

1

Sử dụng git và git-svn 1.7.1, có vẻ như bài kiểm tra tôi vừa làm dường như chỉ hoạt động tốt.

git svn init [url] 
git svn fetch 

bạn phải tạo và thanh toán nhánh giả để có thể đẩy tới nhánh chính.

git checkout -b dummy 

Sau đó, bạn có thể sao chép nó (git clone ...) vào một git repo tinh khiết, sửa đổi nó, cam kết sau đó nó (git commit) đẩy (git push) vào repo git-svn.

trở lại repo git svn:

git checkout master 
git svn dcommit 

sẽ cam kết tất cả các cam kết git đã được đẩy.

+0

Điều này không giải quyết được câu hỏi. Bạn không có một thư mục git riêng biệt khi bạn làm như bạn viết. –

2

Nếu bạn có thể cài đặt móc tùy chỉnh vào kho lưu trữ Subversion, hãy xem xét sử dụng SubGit.

SubGit là giải pháp phía máy chủ tự động đồng bộ hóa SVN và kho Git. Để cài đặt SubGit thực hiện như sau:

$ subgit configure $SVN_REPOS 
    $ # Adjust $SVN_REPOS/conf/subgit.conf 
    $ #  to specify your branches and tags 
    $ # Adjust $SVN_REPOS/conf/authors.txt 
    $ #  to introduce svn author names to their git counterparts 
    $ subgit install $SVN_REPOS 
    $ ... 
    $ INSTALLATION SUCCESSFUL 

Tại SubGit thời điểm này đã được cài đặt móc được kích hoạt bởi mỗi svn commitgit push. Bằng cách này SubGit chuyển đổi mọi sửa đổi đến.

Xem thêm so sánh với git-svn.

Các vấn đề liên quan