The JGit SCM implementation only works if the path passed to its commands points to a Git repository directory or a directory that contains a Git repository directory. This behavior is different from the Git executable, which can be run in any subdirectory and will find the Git repository by searching parent directories.
This difference creates a problem for the maven-release-plugin when used on flat multi-module projects. The prepare goal needs to check for SCM changes, and the JGit implementation will throw an exception, causing the release to fail. This happens because the path provided is the basedir of the project you invoke the plugin on, which is not the directory that contains the Git repository. As far as I can tell, there is no way to change the directory that maven-release-plugin passes during prepare. (The workingDirectory configuration option only affects the perform goal.)
So I have created this patch to make the JGit implementation better mimic the GitExe implementation. It alters most of the commands (with the exception of CheckOut) to search parent directories for the repository and respect Git environment variables.