Work-around for failing “git svn clone” (requiring full history)

前端 未结 5 1315
深忆病人
深忆病人 2021-01-31 09:47

I want to convert a Subversion repository sub-directory (denoted by module here) into a git repository with full history. There are many svn copy opera

5条回答
  •  囚心锁ツ
    2021-01-31 10:15

    I ran into this problem when I had identically-named subdirectories within branches or tags.

    For example, I had tags candidates/1.0.0 and releases/1.0.0, and this caused the documented error because subdirectory 1.0.0 appears within both candidates and releases.

    Per git-svn docs:

    When using multiple --branches or --tags, git svn does not automatically handle name collisions (for example, if two branches from different paths have the same name, or if a branch and a tag have the same name). In these cases, use init to set up your Git repository then, before your first fetch, edit the $GIT_DIR/config file so that the branches and tags are associated with different name spaces.

    So while the following command failed due to similarly named candidates and releases tags:

    git svn clone --authors-file=../authors.txt --no-metadata \
        --trunk=/trunk --branches=/branches --tags=/candidates \
        --tags=/releases --tags=/tags -r 100:HEAD \
        --prefix=origin/ \
        svn://example.com:3692/my-repos/path/to/project/
    

    the following sequence of commands did work:

    git svn init --no-metadata \
        --trunk=/trunk --branches=/branches --tags=/tags \
        --prefix=origin/ \
        'svn://example.com:3692/my-repos/path/to/project/'
    
    git config --add svn-remote.svn.tags \
        'path/to/project/candidates/*:refs/remotes/origin/tags/Candidates/*'
    
    git config --add svn-remote.svn.tags \
        'path/to/project/releases/*:refs/remotes/origin/tags/Releases/*'
    
    git svn fetch --authors-file=../authors.txt -r100:HEAD
    

    Note that this only worked because there were no other conflicts within branches and tags. If there were, I would have had to resolve them similarly.

    After successfully cloning the SVN repository, I then executed the following steps in order to: turn SVN tags into GIT tags; turn trunk into master; turn other references into branches; and relocate remote paths:

    # Make tags into true tags
    cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
    rm -Rf .git/refs/remotes/origin/tags
    
    # Make other references into branches
    cp -Rf .git/refs/remotes/origin/* .git/refs/heads/
    rm -Rf .git/refs/remotes/origin
    cp -Rf .git/refs/remotes/* .git/refs/heads/ # May be missing; that's okay
    rm -Rf .git/refs/remotes
    
    # Change 'trunk' to 'master'
    git checkout trunk
    git branch -d master
    git branch -m trunk master
    

提交回复
热议问题