Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Cloning a Non-Standard Svn Repository with Git-Svn

I'm relatively new to Git, but I've found it so easy to work with at home that I'd like to use it at work where our projects are stored in Svn repositories. Unfortunately, the repositories are slightly non-standard and I'm having trouble getting them cloned. Sure, they all have trunk, branches/ and tags/, but branches/ and tags/ have subdirectories before hitting the real project directories:

trunk/ branches/maintenance/release1 branches/maintenance/release2 ... branches/development/feature1 branches/development/feature2 ... tags/build/build1 tags/build/build2 ... tags/release/release1 tags/release/release2 

After cloning:

$ git svn clone -s --prefix=svn/ https://mydomain.com/svnproject $ git branch -r   development   development@1340   maintenance   maintenance@1340   tags/build   tags/build@1340   tags/release   tags/release@1340   trunk   trunk@1340  

I get none of the actual project branches or tags. I actually need to be able to work on the trunk, one maintenance branch and one development branch. I've tried this approach in addition to several hacks at modifying the config, but nothing is working for me.

Is there any way I can get the key components of my non-standard Svn project into a local git repository so that I can easily move between them?

Many thanks.

UPDATE: I should add that I can't do a wholesale switch to Git (yet). There are other team members involved and an international presence. The logistics of the transition are more than I'm willing to undertake until I'm much more comfortable with Git; as I mentioned, I'm still pretty new. I've barely scratched the surface of its capabilities.

like image 496
Rob Wilkerson Avatar asked Feb 21 '09 12:02

Rob Wilkerson


People also ask

How do I clone a SVN repository?

# Clone a repo with standard SVN directory layout (like git clone): git svn clone http://svn.example.com/project --stdlayout --prefix svn/ # Or, if the repo uses a non-standard directory layout: git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/ # View all branches and tags you have ...

Can I use Git for SVN repository?

Use git-svn, it is really simple. First clone your repository with git svn clone then you can git svn dcommit your work or git svn rebase it on the latest changes. Make sure your history is always linear by always rebasing your local branches on master so that you can merge them with git merge --ff-only .

What does Git SVN clone do?

The git svn clone command transforms the trunk, branches, and tags in your SVN repository into a new Git repository. Depending on the structure of your SVN repo, the command needs to be configured differently.


2 Answers

Lee B was right. The answer, provided by doener in #git, is to upgrade Git to 1.6.x (I had been using 1.5.x). 1.6.x offers deep cloning so that multiple wildcards can be used with the --branches option:

$ git svn clone https://svn.myrepos.com/myproject web-self-serve \            --trunk=trunk --branches=branches/*/* --prefix=svn/ $ git branch -r   svn/development/sandbox1   svn/development/feature1   svn/development/sandbox2   svn/development/sandbox3   svn/development/model-associations   svn/maintenance/version1.0.0   svn/trunk 

Exactly what I needed. Thanks for the insight, all.

like image 86
Rob Wilkerson Avatar answered Oct 02 '22 11:10

Rob Wilkerson


Could you try nirvdrum's svn2git (seems the most up-to-date) in order to import your svn into a git repository ?
(Early 2009, Paul mentioned this iteman's svn2git in replacement of this original jcoglan's svn2git, which was, as his author mentioned: "a quick hack to get my code out of Subversion")

It is better than git svn clone because if you have this code in svn:

  trunk     ...   branches     1.x     2.x   tags     1.0.0     1.0.1     1.0.2     1.1.0     2.0.0 

git-svn will go through the commit history to build a new git repo.
It will import all branches and tags as remote svn branches, whereas what you really want is git-native local branches and git tag objects.
So after importing this project, you would get:

  $ git branch   * master   $ git branch -a   * master     1.x     2.x     tags/1.0.0     tags/1.0.1     tags/1.0.2     tags/1.1.0     tags/2.0.0     trunk   $ git tag -l   [ empty ] 

After svn2git is done with your project, you'll get this instead:

  $ git branch   * master     1.x     2.x   $ git tag -l     1.0.0     1.0.1     1.0.2     1.1.0     2.0.0 

Of course, this solution is not meant as a one-way trip.

You can always go back to your svn repository, with... git2svn (also present there)

The idea remain:

  • SVN at work as a central repository.

  • Git "elsewhere" to quickly experiment amongst multiple Git-private branches.

  • import back only consolidated Git branches into official SVN branches.

like image 32
VonC Avatar answered Oct 02 '22 10:10

VonC