# [PATCH] Add SVN->Git conversion example to documentation

4 messages from 2008-06-14 to 2008-06-18. Participants: Heikki Orsila, Miklos Vajna, Junio C Hamano.
Thread: https://gitlist.dev/t/13959

## Heikki Orsila, 2008-06-14 21:58

Subject: [PATCH] Add SVN->Git conversion example to documentation
Message-ID: <20080614215812.GA28574@zakalwe.fi>
URL: https://gitlist.dev/e/20080614215812.GA28574%40zakalwe.fi

```
Signed-off-by: Heikki Orsila <heikki.orsila@iki.fi>
---
This is the third round. Added some commands to clean up the repository, 
and set fetch heads. Thanks to Miklos Vajna for feedback.

 Documentation/git-svn.txt |   41 ++++++++++++++++++++++++++++++++++++++---
 1 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
index f4cbd2f..26e00c5 100644
--- a/Documentation/git-svn.txt
+++ b/Documentation/git-svn.txt
@@ -11,9 +11,12 @@ SYNOPSIS
 
 DESCRIPTION
 -----------
-git-svn is a simple conduit for changesets between Subversion and git.
-It is not to be confused with linkgit:git-svnimport[1], which is
-read-only.
+git-svn is a simple bidirectional conduit for changesets between
+Subversion and git. It is used to develop projects with Git tools,
+but commit changes to a Subversion repository. It can also be used to
+convert a Subversion repository to a Git repository. It should not
+be confused with linkgit:git-svnimport[1], which does Subversion to
+Git conversion, but not the other direction.
 
 git-svn was originally designed for an individual developer who wants a
 bidirectional flow of changesets between a single branch in Subversion
@@ -520,6 +523,38 @@ have each person clone that repository with 'git clone':
 	git-svn rebase
 ------------------------------------------------------------------------
 
+CONVERTING A SUBVERSION REPOSITORY TO A GIT REPOSITORY
+------------------------------------------------------
+
+When converting a Subversion repository to a Git repository
+--no-metadata removes "git-svn-id:" comments from the log.
+-A option is used to convert SVN pseudonyms to real names
+and email addresses. The whole repository, or a part of it can be
+converted. Two examples below show how to convert the whole repo
+with all branches, or only the SVN trunk.
+
+------------------------------------------------------------------------
+# Convert all branches of an SVN repository to a Git repository:
+
+	git svn clone --no-metadata -A authors.txt SVN_URL foo.git
+
+# Convert only the trunk of an SVN repository to a Git repository:
+
+	git svn clone --no-metadata -A authors.txt SVN_URL/trunk foo.git
+------------------------------------------------------------------------
+After that, the new repository should be cleaned, and fetch heads should
+be set.
+------------------------------------------------------------------------
+	cd foo.git/.git
+	rm -rf svn
+	git config --remove-section svn-remote.svn
+	git config remote.origin.url .
+	git config remote.origin.fetch +refs/remotes/tags/*:refs/tags/*
+	git config --add remote.origin.fetch +refs/remotes/*:refs/heads/*
+	git fetch
+	git gc
+------------------------------------------------------------------------
+
 REBASE VS. PULL/MERGE
 ---------------------
 
-- 
1.5.5.1.1.ga5e5c

```

## Miklos Vajna, 2008-06-14 22:47

Subject: Re: [PATCH] Add SVN->Git conversion example to documentation
Message-ID: <20080614224758.GL29404@genesis.frugalware.org>
URL: https://gitlist.dev/e/20080614224758.GL29404%40genesis.frugalware.org
In-Reply-To: <20080614215812.GA28574@zakalwe.fi>

```
On Sun, Jun 15, 2008 at 12:58:12AM +0300, Heikki Orsila <heikki.orsila@iki.fi> wrote:
> +After that, the new repository should be cleaned, and fetch heads should
> +be set.
> +------------------------------------------------------------------------
> +	cd foo.git/.git

Heh, I was confused. foo.git is usually a bare repo, if the repo has a
working directory as well, then just call it foo.

And then: if you convert an svn repo to a git one, don't you want to
convert it to a bare repo?

I haven't tried git-svn clone but the following will work for sure:

git --bare init
git --bare svn init -s URL
git --bare svn fetch

> +	rm -rf svn
> +	git config --remove-section svn-remote.svn
> +	git config remote.origin.url .
> +	git config remote.origin.fetch +refs/remotes/tags/*:refs/tags/*
> +	git config --add remote.origin.fetch +refs/remotes/*:refs/heads/*
> +	git fetch
> +	git gc

If you remove the svn dir, why don't you remove refs/remotes as well?
(Probably via update-ref since git svn will pack refs before it ends for
big repos, I think.)

Also I think it would be a good idea to give a hint how to do
incremental updates. Something like not deleting the svn dir and using
git --bare svn fetch; git fetch.

PS: I'm not a git-svn contributor or anything, just thought I give you
some advices, I hope it helped. :-)

```

## Junio C Hamano, 2008-06-17 23:21

Subject: Re: [PATCH] Add SVN->Git conversion example to documentation
Message-ID: <7viqw74phb.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7viqw74phb.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <20080614215812.GA28574@zakalwe.fi>

```
Heikki Orsila <heikki.orsila@iki.fi> writes:

> Signed-off-by: Heikki Orsila <heikki.orsila@iki.fi>
> ---
> This is the third round. Added some commands to clean up the repository, 
> and set fetch heads. Thanks to Miklos Vajna for feedback.
>
>  Documentation/git-svn.txt |   41 ++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 38 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
> index f4cbd2f..26e00c5 100644
> --- a/Documentation/git-svn.txt
> +++ b/Documentation/git-svn.txt
> @@ -11,9 +11,12 @@ SYNOPSIS
>  
>  DESCRIPTION
>  -----------
> -git-svn is a simple conduit for changesets between Subversion and git.
> -It is not to be confused with linkgit:git-svnimport[1], which is
> -read-only.
> +git-svn is a simple bidirectional conduit for changesets between
> +Subversion and git. It is used to develop projects with Git tools,
> +but commit changes to a Subversion repository. It can also be used to

That is correct but doesn't the above give a false impression that commits
are only made on subversion side and never on git side?

> +convert a Subversion repository to a Git repository. It should not
> +be confused with linkgit:git-svnimport[1], which does Subversion to
> +Git conversion, but not the other direction.

We do not ship nor document svnimport anymore and linkgit: there is
actively wrong.  People seem to be confused with ancient documents still
floating on the Web that talk about svnimport, and I think it is a good
idea to try to clear the confusion here, but perhaps...

	... with the deprecated `git-svnimport`, which was used for
	one-way conversion from Subversion to git.

> @@ -520,6 +523,38 @@ have each person clone that repository with 'git clone':
>  	git-svn rebase
>  ------------------------------------------------------------------------
>  
> +CONVERTING A SUBVERSION REPOSITORY TO A GIT REPOSITORY
> +------------------------------------------------------
> +
> +When converting a Subversion repository to a Git repository
> +--no-metadata removes "git-svn-id:" comments from the log.
> +-A option is used to convert SVN pseudonyms to real names

Anything that user usually would type on the command line it is preferred
to typeset with `quoted like this`, so "`--no-metadata`" and "`-A` option".

It is not `--no-metadata` "removes".  git-svn adds cruft because it wants
to use it for bidi operation, but --no-metadata prevents it from doing
so.

```

## Heikki Orsila, 2008-06-18 00:55

Subject: Re: [PATCH] Add SVN->Git conversion example to documentation
Message-ID: <20080618005555.GB5930@jolt.modeemi.cs.tut.fi>
URL: https://gitlist.dev/e/20080618005555.GB5930%40jolt.modeemi.cs.tut.fi
In-Reply-To: <7viqw74phb.fsf@gitster.siamese.dyndns.org>

```
On Tue, Jun 17, 2008 at 04:21:36PM -0700, Junio C Hamano wrote:
> > -git-svn is a simple conduit for changesets between Subversion and git.
> > -It is not to be confused with linkgit:git-svnimport[1], which is
> > -read-only.
> > +git-svn is a simple bidirectional conduit for changesets between
> > +Subversion and git. It is used to develop projects with Git tools,
> > +but commit changes to a Subversion repository. It can also be used to
> 
> That is correct but doesn't the above give a false impression that commits
> are only made on subversion side and never on git side?

Hmm.. I'll try to make it more explicity. Will send another patch soon.

> > +convert a Subversion repository to a Git repository. It should not
> > +be confused with linkgit:git-svnimport[1], which does Subversion to
> > +Git conversion, but not the other direction.
> 
> We do not ship nor document svnimport anymore and linkgit: there is
> actively wrong.  People seem to be confused with ancient documents still
> floating on the Web that talk about svnimport, and I think it is a good
> idea to try to clear the confusion here, but perhaps...

OK, I will not mention svnimport in the next patch.

> 	... with the deprecated `git-svnimport`, which was used for
> 	one-way conversion from Subversion to git.
> 
> > @@ -520,6 +523,38 @@ have each person clone that repository with 'git clone':
> >  	git-svn rebase
> >  ------------------------------------------------------------------------
> >  
> > +CONVERTING A SUBVERSION REPOSITORY TO A GIT REPOSITORY
> > +------------------------------------------------------
> > +
> > +When converting a Subversion repository to a Git repository
> > +--no-metadata removes "git-svn-id:" comments from the log.
> > +-A option is used to convert SVN pseudonyms to real names
> 
> Anything that user usually would type on the command line it is preferred
> to typeset with `quoted like this`, so "`--no-metadata`" and "`-A` option".
> 
> It is not `--no-metadata` "removes".  git-svn adds cruft because it wants
> to use it for bidi operation, but --no-metadata prevents it from doing
> so.

OK

-- 
Heikki Orsila
heikki.orsila@iki.fi
http://www.iki.fi/shd

```
