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