Forum: Ruby on Rails Converting a Subversion repository to git

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Ffcb3570b25b8b5ddcd7adabff110331?d=identicon&s=25 Robert Walker (Guest)
on 2008-06-01 20:56
(Received via mailing list)
Hello,

I'm somewhat new to git and was trying to find the best way to convert
my Subversion repositories over to git. I have been looking at the git-
svn command, which seems to be the way to do it. However, git-svn
seems to be a two-way communication between svn and git. I don't want
two-way, I want a pure git repository that maintains the history from
a svn repository.

The repositories I'm converting are my own, and once they are moved
over to git the svn repository will no longer be maintained and will
likely be deleted completely from my system.

So can git-svn be used for this? Are there options to git-svn to just
use the tool as a one-way converter? What are other people doing in
this case?

I suppose I could simply export my svn repositories without version
history and just git init, but I'd rather not lose my change history
if there's a convenient way to do that.
171ea139761951336b844e708d1547ab?d=identicon&s=25 James Byrne (byrnejb)
on 2008-06-01 22:11
Robert Walker wrote:
> Hello,
>
> I'm somewhat new to git and was trying to find the best way to convert
> my Subversion repositories over to git. I have been looking at the git-
> svn command, which seems to be the way to do it. However, git-svn
> seems to be a two-way communication between svn and git. I don't want
> two-way, I want a pure git repository that maintains the history from
> a svn repository.
>

It is now the ONLY way, as of GiT 1.5.5 git-svnimport is depreciated.

> The repositories I'm converting are my own, and once they are moved
> over to git the svn repository will no longer be maintained and will
> likely be deleted completely from my system.
>
> So can git-svn be used for this? Are there options to git-svn to just
> use the tool as a one-way converter? What are other people doing in
> this case?
>
> I suppose I could simply export my svn repositories without version
> history and just git init, but I'd rather not lose my change history
> if there's a convenient way to do that.

Converting svn to a git master via git-svn is a two step process.
First, you import from svn into an interim git repository.  Second, you
clone that interim repository using the --bare command to break the link
to the original svn repository.

The process I wrote up for our internal use goes something like this:

GiT Version Control System for Rails Projects
To Import an Existing Subversion Project into GiT

1. Set up a directory structure to hold the GiT repositories. This
structure is very important if these are to be publicly published. It
may be desirable to have a master git repository holding many
sub-projects as submodules. This provides a great deal of flexibility
with respect to managing large scale development spread over many
distinct activities. An example of a suggested structure is:

/var/data/vcs-git
`-- hll
    `-- git-svn.users

In this example, the root of the master repository is
/var/data/vcs-git/hll and it contains but one file whose contents are
discussed below.

2. Switch to the master directory and create an authors file that maps
svn committor userids to a GiT user and eMail address.

$ vi git-svn.users
svn-userid = A. Git User <userga@mydomain.tld>

3. Use git-svn to clone the existing Subversion repository. The clone
option will create a subdirectory for the project within the master
directory. If the Subversion repository was not set using the
recommended directory structure (*--stdlayout*) of ./project_name/trunk,
./project_name/branches, and ./project_name/tags then you may have to
use the options *-T*, *-b* and *-t* to specify where these project
components reside within the repository. You must provide the checkout
protocol and uri to the Subversion project as the final argument. If you
ONLY want the trunk or a specific branch or tag in the new GiT
repository then you must specify it in the URI (note the convention of
'_tmp' suffix for a staging repository is only that, a convention):

$ git-svn clone --authors-file=git-svn.users --no-metadata \
  --stdlayout
https://svn.harte-lyne.ca/<master-project>/<sub-pr...]
<target/directory/filename>_tmp
$

4. If all of the arguments are correct and all of the userids in the
Subversion repository are mapped properly in the authors file then you
will see something like this:

$ git-svn clone --authors-file=git-svn.users --no-metadata
https://svn.harte-lyne.ca/hllsystem
Initialized empty Git repository in .git/
        A       trunk/README
W: +empty_dir: trunk/HP3K2linux
r11 = d97da2382e7c6e11a7107619d96c6214a2437942 (git-svn)
W: +empty_dir: trunk/data
r12 = 8ce38690b166128b90393a89fcea7ff115987210 (git-svn)
        A       trunk/HP3K2linux/hll-qpxfr.rb
        A       trunk/codemodel.rb
r13 = 49e3e692f7ddf9750a9a5b7b6cff83dcd6d4e1fa (git-svn)

...

Checked out HEAD:
  https://svn.harte-lyne.ca/hllsystem r59

Now create a clean bare clone of this converted repository into our
final new master GiT repository (note that the .git suffix is just a
local convention):

$ # Now clone from _tmp repository into bare repository
$ git-clone --bare --no-metadata <target/directory/filename>_tmp
<target/directory/filename>.git
$
$ # Perform some housekeeping to keep things sane when working via
remote.
$
$ git-update-server-info
$
$ # This lets members of the vcs group push commits to the master
$ chown -R vcs: <target/directory/filename>.git
#
$ # And this gives them permission to create temporary files to unpack
and sha1 the pushed commits
$ chmod -R g+w <target/directory/filename>.git
$

At the end of this you have a directory structure that contains the
project:

/target
`-- directory
    |-- <filename>.git
    `-- git-svn.users

5. To create a new empty master project simply initialize an empty git
repository in some arbitrary location and add any desired sub-projects
as submodules.

$ # Create an empty repository
$ git init
$
  # Add the submodule using the protocol and paths to the sub-project's
.git directory and
  # providing the relative path to the local copy
$ git submodule add protocol://path/to/subproject
./path/to/local/subproject
$ # Initialize the submodules just added
$ git submodule init
$ # keep up-to-date
$ git submodule update
$ git-commit # This step is rather important!


Note: submodules were added to Git in v.1.5.3 and as of v.1.5.5 still
are still a bit incomplete. See GiTWiki submodule for additional detail
171ea139761951336b844e708d1547ab?d=identicon&s=25 James Byrne (byrnejb)
on 2008-06-01 22:17
Note as well: Importing from subversion can take a very long time if the
project is large.
This topic is locked and can not be replied to.