how to convert svn repository to git on Windows

前端 未结 4 1300
陌清茗
陌清茗 2021-02-09 18:17

We have remote svn repository and we want it to convert to git. Could you please tell me how is it possible to do it on Windows? Thank.

相关标签:
4条回答
  • 2021-02-09 18:59

    I ended up doing this so much, I made a batch script to help out:

    usage: SvnToGit <path/to/svn-repo> <local-checkout-dir> <remote-git-url>

    Prerequisites

    • You should already have the URL to the empty git remote repository.
    • You should have a pre-existing authors.txt file at the root ready to go.
    • Unless Git understands your svn format, you will need to run svnserve to 'serve' the repo. You can create a window service to do, something like this:

      c:>sc create svnserve binpath="\"svnserve.exe\" --service -r C:\Users\UserName\Repositories\Svn" displayname="Subversion Server" depend=Tcpip start=auto

    Caveats:

    • Check the intermediate results, occasionally something may fail
      (especially svn clone).
    • Note the section for manual changes if needed for tags. Perhaps, this could be done in batch file, but it seemed complex and not a high priority for me. There is a PAUSE here, so
      you can make these changes manually.
    • I have not tested this on many systems, you might need to tweak the script a bit to adjust to your system.

    The actual batch file:

    REM Argument 1: Path to your repository
    REM Argument 2: Path to your new Git working directory
    REM Create authors.txt file
    REM It will contain lines like:
    REM SomeCoder = Some Guy <some.guy@example.com>
    REM If Git is now aware of the format of svn repository, you will need to use svnserve:
    REM svnserve -d -R --root path/to/your/repository
    PAUSE
    
    IF EXIST bare.git\NUL RD /S /Q bare.git
    IF EXIST GitTemp\NUL RD /S /Q GitTemp
    
    REM The following will not work, if SVN is using a newer FS than what Git is aware of
    REM git svn clone file:///%1 --prefix=svn/ --no-metadata -A authors.txt --stdlayout GitTemp
    REM So, use
    git svn clone svn://localhost/%1 --prefix=svn/ --no-metadata -A authors.txt --stdlayout GitTemp
    PAUSE
    
    REM GitIgnore
    cd GitTemp
    git svn show-ignore > .gitignore
    git add .gitignore
    git commit -m "Convert svn:ignore properties to .gitignore."
    cd ..
    
    REM Bare Repo
    git init --bare bare.git
    cd bare.git
    git symbolic-ref HEAD refs/heads/trunk
    cd ..
    
    cd GitTemp
    git remote add bare ../bare.git
    git config remote.bare.push 'refs/remotes/*:refs/heads/*'
    git push bare master
    cd ..
    
    REM clean up SVN type stuff
    cd bare.git
    REM git branch -m trunk master
    git branch -m svn/trunk master
    git symbolic-ref HEAD refs/heads/master
    cd ..
    
    REM Manual changes if needed for tags
    REM git for-each-ref --format='%(refname)' refs/heads/tags |
    REM cut -d / -f 4 |
    REM while read ref
    REM do
    REM   git tag "$ref" "refs/heads/tags/$ref";
    REM   git branch -D "tags/$ref";
    REM done
    PAUSE
    
    REM Working Directory
    git clone bare.git %2
    
    cd %2
    git checkout master
    
    git remote remove origin
    PAUSE
    
    git remote add origin %3
    REM Then
    git push -u origin master
    
    0 讨论(0)
  • 2021-02-09 19:01

    Context: Remote svn server with HUGE repository of several projects. However I only wanted to migrate one project from SVN to Git

    Here's how I did it:

    Requirements:

    1. Git Extensions - Git Extensions
    2. Visual SVN Server (also get eval license) - Visual SVN Server
    3. Chocolatey windows package manager - Chocolatey
    4. Git version 2.6.2 (use chocolatey in cmd: choco install git --version 2.6.2 )

    What to do:

    1. Get users who committed into authors file

    Open cmd to root of local svn project copy and run:

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

    Put the resulting authors file somewhere you can find it

    Open and Edit the authors-transform.txt file by adding the name and the email into the <> line by line for each committer


    2. Copy your SVN repository from the server to a local on your working drive (example: c:/repo/Repository


    3. Install Visual SVN and point the storage of the server to the /repo folder

    Also find an open port for it to run on

    Set permissions on the authentication to windows for the server You may have to create a user for the server as well Also set permissions for the specific project within the server to your user

    4. In the destination folder for your new cloned SVN repo hold shift and click Git Browse to open Git Extensions, go to Start, and click Clone SVN

    Point to the local svn server you created for the destination (example http://localhost/svn/repo/Repository/Development/ProjectName)

    I unchecked the trunk, tags, and branches but YMMV

    Point the authors file to wherever it is saved

    Click clone


    Reasons:

    Git 2.6.2 because it was the latest version that didn't cause an address issue

    Git Extensions because it minimized all the command line work for the cloning

    Visual SVN because I was having permissions issues on the server and the "git svn" commands responded better to an http://localhost..... address than the file:// that was suggested in the many places I researched

    Chocolatey because I didn't see any other way to get that version of Git

    0 讨论(0)
  • 2021-02-09 19:05

    You can use git-svn which is a tool that lets you convert svn repositories to git repositories. See the git documentation for more information.

    0 讨论(0)
  • 2021-02-09 19:08

    Install application on Windows:

    • Git for Windows.
    • TortoiseGit

    Find out the svn repository URL and copy it

    Something like this:

    Invoke TortoiseGit Clone dialog

    Right click on destination folder, e.g. D:\SVN\ToGit, and Click Git Clone...

    Check the From SVN repository checkbox

    If you copied the URL first, then invoke the clone dialog, TortoiseGit will get the copied URL from clipboard and paste it into the URL text field for you. So, you don't paste it by yourself. Just have look at it to see if it's correct.

    And if you right click on destination folder, TortoiseGit also fill the Directory text field for you. Also, take a look to see if it's what you want.

    So, just check the From SVN repository checkbox.

    And if the svn repository has the standard layout, say trunk, tags, branches, you don't need to do anything further.

    Click the OK button to go

    Then, starting to clone a svn repository to git repository.
    Something like this:

    As you can see, TortoiseGit just properly uses Git for Windows command git svn clone to clone it.

    git.exe svn clone "svn://svn.code.sf.net/p/tortoisesvn/code/" "D:\SVN\ToGit\tsvn" -T trunk -b branches -t 
    

    So, basically, you can go Git Bash/CMD and re-use that command line, and also get the same result.

    NOTE: If you can see the r1, r2, r3..., you can stop the cloning anytime, and resume it later by using the same command line.


    Clone a local svn repository

    With TortoiseGit 2.4.4+

    Just copy the svn local path into URL of Clone dialog. See:

    Again, Check the From SVN repository checkbox

    Cloning:

    TortoiseGit 2.4.4+ will use file:/// protocol to clone a local svn repository.


    After you get a git repository, you can commit there. And push the commit back to origin svn repository by using TortoiseGit ->SVN DCommit..., something like svn commit.

    As you can see, the command is git svn dcommit.

    And if the origin svn repository has some new commit(s) need to update, you can use TortoiseGit ->SVN Rebase to fetch the svn commit and then merge/rebase on the latest commit. Something like svn update.

    It uses git svn fetch then uses git rebase to merge/rebase the fetched changes.

    For command line, you could just use git svn rebase.


    Read Pro Git v2 - Chapter 9 for more information and examples.

    0 讨论(0)
提交回复
热议问题