[SoC RFC] libsvn-fs-git: A git backend for the subversion filesystem

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello,

I'm planning to apply for the git summer of code project. My proposal
is based on the project idea of a subversion gateway for git,
implemented with a new subversion filesystem layer. A draft of my
proposal follows; I'd appreciate any comments/questions on it before
the application period proper begins.

Thanks,

Bryan Donlan

=== Project Goals ===

I propose to implement a subversion filesystem driver (libsvn-fs-git) that
uses a git repository as its backing store. Commits will be supported either
directly in the git repository, or in the corresponding subversion repository,
and automatically mirrored to the other side as appropriate.

I intend to support the following:
* Full or near full (possibly forbidding modification of the toplevel
trunk/ branches/ tags/ structure) read/write access from subversion
* svnadmin create/dump/load to convert existing subversion repositories
* Support for wrapping a pre-existing git repository and presenting it
as a subversion repository
* Support for mapping git branches and tags onto subversion branches
and tags (and vice versa)
* Support for syncing svn:executable with git file mode information
* Representation of git merge data using svk:merge and/or svn:mergeinfo
* Syncing .gitignore and svn:ignore data

As both subversion and git are written in C, this driver will also be in C.

Here are some tentative milestones:
* Read-only access from SVN to the master branch (no trunk/ etc layout)
  = Conversion of git commit information into svn revprops
  = git mode/.gitignore -> svn property conversion here?
* Read-write access from SVN to the master branch
  = Map svn usernames to git full name/email according to a configuration map
    - how should git commits with names unknown to svn be handled? Just pass
      them through, spaces and <@> as well?
  = Bidirectional svn:execute and svn:ignore conversion.
  = Copyfrom and file property information needs to be recorded
  = Test importing a largish repository (without converting merge information)
    to git (the svn toplevel stuff would be left as-is in the git tree)
  = Consider developing git-svn-fs on a git-svn-fs repository itself for
    testing purposes
* Standard toplevel SVN layout (trunk/ tags/ branches/)
  = SVN branch creation might come a bit later
  = Test importing a largish repository with tags and branches carried across
    (might not efficiently support copy-from information)
* Merge information annotation (git->svn)
  = Try to guess the copy source for a new tag or branch - and for merges
* Merge information annotation (svn->git)
* Import of a largish repository with svk or similar merge information into git,
  and vice versa (eg, exporting git.git with merge tracking as a subversion
  repo)

=== Interfaces ===

As mentioned before, this driver will plug into the existing subversion stack
as a filesystem driver. This immediately allows access using any of subversion's
access methods (direct filesystem access, mod_dav_svn, svnserve).

On the git side I intend to use libgit for all git repository access. If I find
it lacking a necessary feature, I will attempt to add the missing interfaces
to libgit if at all feasable.

I anticipate svn-git-fs to live either in git.git's contrib or an outside
repository. There should be little if any changes to git itself.

=== About me ===
I am a sophomore computer science student at the University of Maine at Orono.
I have been programming since well before I entered college, and am experienced
in C, although I have not done much work in large (in terms of number of
developers) projects. I have experience in using Subversion, including doing
merges with svk, but I am somewhat less experienced with git. I hope to become
more familiar with git prior to, and as I progress in this project. I also have
some ability with Japanese... but possibly not enough yet to translate the
strings and documentation in this project :)

This particular project idea caught my eye partially because I have been hoping
to convert another open-source project that I hack on [1] to git, but as one
of the other developers is testing it primarily on windows, we've been reluctant
to move there. A git<->svn gateway would be ideal to help ease the transition.
(We haven't yet tried the cygwin port, so admittedly this may be moot already)

I have submitted a small documentation patch to git.git recently[2], and lurked
on the mailing lists for a while during its early days, but I have not yet
become actively involved in development.

[1] - http://openc2e.ccdevnet.org
[2] - commit 81fa145917c40b68a5e2cca6afc6a10cdfdbd25b

=== (Tentative) design notes ===

My current plan for storing the additional information the subversion side will
need (fileprops, revprops, copyfrom information...) is to create an additional
branch on the git repository (possibly .git-svn or similar) to hold the
necessary metadata. Configuration, including author maps, branch/tag maps,
etc, would be on another branch (git-svn-config or similar).

The layout might look like this:

/tree/{trunk/,branches/,tags/} - the tree as svn currently sees it
/props/{trunk/,branches/,tags/} - file properties; props on directories will be
  represented with a reserved filename (._GIT-SVN-DIRPROPS perhaps)
  copyfrom information might be in /props, or in a seperate tree
/revprops/NNN - revision properties for the given revision number
/revmap/NNN - a reference to the commit hash in the .git-svn branch
  corresponding to the given subversion revision number

Each subversion commit corresponds to two .git-svn commits; one to
update tree, props, and revprops, and one to update revmap. The first
commit will
additionally have the following metadata in its commit:
git-svn-revno NNN
git-svn-parent (commit hash of corresponding git-side commit)

If the commit was initiated from the svn side, the git-side commit will be
committed first, and will contain a git-svn-revno field as well. The overall
commit will be performed while holding a git-svn-fs-specific lock (also held
when replicating new git commits to the svn side).

If a commit is performed on the subversion side, the next query to the
subversion layer which checks the current youngest revision number will also
scan for updated git heads, assign revision numbers, and create the necessary
subversion metadata in the .git-svn branch.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux