Is it possible to have a Subversion repository as a Git submodule?
No. Your best bet would be to set up a mirror of the svn repository in a dedicated git repository.
git svn clone -s http://subversion.example.com/ mysvnclonecd mysvnclonegit remote add origin git@example.com:project.gitgit push origin master
Then you can add the git repository as a submodule to the original project
cd /path/to/gitprojectgit submodule add git://example.com/project.git -- svn-projectgit add svn-projectgit commit -m "Add submodule"
There is one conceptual difference between svn:externals and git submodule that may trip you up if you approach this from a subversion point of view. The git submodule is pegged to the revision that you give it. If "upstream" changes, then you have to update your submodule's reference.
So when we resync with the upstream subversion:
cd /path/to/mysvnclonegit svn rebasegit push
... the git project will still use the original revision that we committed earlier. To update to the svn HEAD, you would have to use
cd /path/to/gitproject/svn-projectgit checkout mastergit pullcd ..git add svn-projectgit commit -m"Update submodule"
I just went through this. I'm doing something similar to rq, but slightly different.I setup one of my servers to host these git clones of the svn repos I need. In my case I only want read-only versions, and need a bare repo on the server.
On the server I run:
GIT_DIR=<projectname>.git git initcd <projectname>.git/GIT_DIR=. git svn init svn://example.com/trunkGIT_DIR=. git svn fetchgit gc
This sets up my bare repo, then I have a cron script to update it:
#!/usr/bin/pythonimport os, globGIT_HOME='/var/www/git'os.chdir(GIT_HOME)os.environ['GIT_DIR']='.'gits = glob.glob('*.git')for git in gits: if not os.path.isdir(git): continue os.chdir(os.path.join(GIT_HOME, git)) if not os.path.isdir('svn/git-svn'): #Not a git-svn repo continue #Pull in svn updates os.system('git svn fetch && git gc --quiet') #fix-svn-refs.sh makes all the svn branches/tags pullable os.system('fix-svn-refs.sh') #Update the master branch os.system('git fetch . +svn/git-svn:master && git gc --quiet')`
This also requires fix-svn-refs.sh from http://www.shatow.net/fix-svn-refs.sh This was mostly inspired by: http://gsocblog.jsharpe.net/archives/12
I'm not sure why the git gc
is needed here, but I wasn't able to do a git pull
without it.
So after all this you can then use git submodule following rq's instructions.
Currently git-svn doesn't support svn:externals. But there are two other tools which can help you:
SubGit is server-side solution, it enables Git access to Subversion repository and vice versa. You may refer to documenation for more details, but in general it is fairly easy to use SubGit:
$ subgit configure --layout auto $SVN_URL $GIT_REPO
Above command will detect branches layout in the SVN project and then will create empty bare Git repository ready to mirror SVN project. You may be asked for credentials unless those are already stored in the SVN credentials cache at ~/.subversion directory. You can also adjust
$GIT_REPO/subgit/authors.txt
to map SVN author names to Git identities.$ subgit install $GIT_REPO$ ... let initial translation complete ... $ TRANSLATION SUCCESSFUL
At this moment you have Subversion repository connected to newly created Git repository. SubGit translates SVN revision into Git commit on every
svn commit
and Git commit into SVN revision on everygit push
.
Everything you need further is to make Git repository available to committers. Take a look at git-http-backend for that. Then you can add created Git repository as a usual submodule. SubGit is also availale as an add-on for the Bitbucket Server, to find out more check out here. So, there is no need to use any external tools like git-svn or any other.
SubGit is proprietary software but it's free for small companies (up to 10 committers), academic and open-source projects.