SVN Users and Git Authors

Both Subversion and Git keep authors in commits, but those authors differ.

In SVN, the author is being stored as an unversioned revision property svn:author. Every time a Subversion user makes a commit, SVN creates a new revision and sets this revision svn:author property to that exact user's name, for example, johndoe:

------------------------------------------------------------------------
r163 | johndoe | 2017-06-07 20:22:15 +0500 (Wed, 07 Jun 2017) | 1 line
Changed paths:
   A /project
   A /project/branches
   A /project/tags
   A /project/trunk

initial layout for the project
------------------------------------------------------------------------

????

$ svn proplist -v --revprop --revision 163

Unversioned properties on revision 163:
  svn:author
    johndoe
  svn:date
    2017-06-07T15:22:15.655243Z
  svn:log
    initial layout for the project

Git also stores author name along with commits, but this name differs from that in SVN: whereas SVN stores actual username, Git user identity consists of a name and email:

Git User <gituser@domain.com>

Those name and email don't relate to an actual username that is used to login to Git repository, they are being set in Git configuration, for example, they may be set by the commands:

$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

The Git user John Doe is then referred as

John Doe <johndoe@example.com>

 This exact line then appears as the author name in every commit that John Doe makes.

It worth to mention that Git holds not only author name, but also a committer name:

$ git cat-file commit HEAD
    tree 905df23db37b33320483fc6676bfc684078ed248
    parent 4a0cf06baa9aefaa20a13820265ef401d7b1c2b6
    author John Doe <johndoe@example.com> 1496849115 +0000
    committer Jane Doe <janedoe@example.com> 1496849115 +0000

Pro Git book describes the difference between those names as follows: the author is the person who originally wrote the work, whereas the committer is the person who last applied the work. So, if you send in a patch to a project and one of the core members applies the patch, both of you get credit – you as the author, and the core member as the committer.

SubGit translates Git author name, so committer name doesn't mean much for the SVN-to-Git translation process.

Note, that SubGit uses authors names to count licensed users, see Licensing manual for details.

Configuration options

All the configuration options reside in SubGit configuration file, that is situated in subgit subdirectory inside a newly created Git repository:

GIT_REPOS_PATH/subgit/config

There are two configuration options that relate to authors:

If you are using SVN server 1.7.20, 1.8.12 or 1.9.0 or later, and the SVN repository is being accessed over http(s):// protocol, then pre-revprop-change hook may need to be enabled in SVN repository, see SVN authors are not being set correctly article.


Automatic Authors Mapping

When SubGit starts translation between SVN and Git, it looks for authors mapping files or authors helper programs. If none of them present, it generates the mapping automatically, following these rules for the translation:

defaultDomain here stands for the core.defaultDomain SubGit configuration option. 

During initial subgit configure call, this setting is being set to the hostname. Also, if subgit configure is invoked with --layout auto option, SubGit connects to specified SVN project, checks its history and generates authors mapping using found SVN usernames and given defaultDomain. Then SubGit fills up the default authors file with the resulting mapping.

For example, suppose, the defaultDomain is set like follows:

[core]
   defaultDomain = example.com

A user made commits in SVN under john_doe SVN account.

When SubGit translates these commits to Git, it sets author name in Git commits in the following way:

Author: john_doe <john_doe@git.example.com>

Similarly, Git commits that made by John Doe <johndoe@example.com> Git user appears in SVN with John Doe author name.


Authors File

The authors mapping file is a text file filled with SVN username - Git author pairs. Each pair maps SVN username to Git author like:

svn_user_name = Git Name <gitname@domain.name>

For example, a mapping for a user John Doe may look like this:

john_doe = John Doe <john_doe@example.com>

Each mapping pair must appear on a new line.

During SVN to Git translation, SubGit searches all specified authors files for a mapping pair. If the matching pair is found, SubGit uses appropriate author name. If there is no match, then SubGit generates author name according to automatic mapping rules.

It is possible to map more than one SVN username to the same Git author:

john_doe = John Doe <john_doe@example.com>
johndoe = John Doe <john_doe@example.com>

Revisions that are created either by john_doe or johndoe are being translated to Git commits with author name John Doe <john_doe@example.com>. However, Git commits that are made by John Doe <john_doe@example.com> are being translated to SVN revision using first SVN username in authros files that matches particular Git name – john_doe in this case.

Similarly, one SVN username can be mapped to different Git authors:

jdoe = John Doe <john_doe@example.com>
jdoe = Jane Doe <jane_doe@example.com>
jdoe = James Doe <james_doe@example.com>

Again, every Git commit made by those authors will be translated with author set to jdoe. SVN revisions made by jdoe is always set to first matching Git user in the authors files – John Doe <john_doe@example.com> in this particular case.

Scriptable Authors Mapping

In addition to the authors file, there's another way to provide SVN to Git authors mapping using authors helper program. The authors helper is an executable - script or binary - that is able to read data from standard input and provide its work result to the standard output. The data helper reads from input and the data helper provides to output must fulfill certain format:

Every time SubGit finds an author name during translation, it invokes the authors mapping helper program, passes the name to it and expects the helper to answer with matching author name.

The authors helper program might be extremely useful especially when you have many authors and the authors list is constantly changing - new users are being added, names and emails changes and so on. If you use some catalog to store accounts - LDAP, Active Directory, OpenID and so forth - you can create a script that will gather needed information from the catalog and provide it to SubGit.

During configuration or installation phase SubGit places simple authors.sh script into subgit/samples directory. This script doesn't do much useful, it's just some 'proof of concept' that demonstrates how input data is being read and output data provided. The script as simple as:

while read input
    do
      if [ -z "$name" ]; then
        name="$input"
      elif [ -z "$email" ]; then
       email="$input"
      fi
    done

    if [ -z "$email" ]; then
      echo Full Name
      echo author@email.com
    else
      echo shortSvnUserName
    fi

    exit 0;

Depending on what was sent to its input script returns either Git author name and email or SVN short name. It can be extended to, say, receive the data from catalog or database thereby facilitate the authors mapping.