Skip to content
Snippets Groups Projects
git-svn.txt 45.2 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    git-svn(1)
    ==========
    
    NAME
    ----
    git-svn - Bidirectional operation between a Subversion repository and Git
    
    SYNOPSIS
    --------
    [verse]
    
    'git svn' <command> [<options>] [<arguments>]
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    DESCRIPTION
    -----------
    'git svn' is a simple conduit for changesets between Subversion and Git.
    It provides a bidirectional flow of changes between a Subversion and a Git
    repository.
    
    'git svn' can track a standard Subversion repository,
    following the common "trunk/branches/tags" layout, with the --stdlayout option.
    It can also follow branches and tags in any layout with the -T/-t/-b options
    (see options to 'init' below, and also the 'clone' command).
    
    Once tracking a Subversion repository (with any of the above methods), the Git
    repository can be updated from Subversion by the 'fetch' command and
    Subversion updated from Git by the 'dcommit' command.
    
    COMMANDS
    --------
    
    'init'::
    	Initializes an empty Git repository with additional
    	metadata directories for 'git svn'.  The Subversion URL
    	may be specified as a command-line argument, or as full
    	URL arguments to -T/-t/-b.  Optionally, the target
    	directory to operate on can be specified as a second
    	argument.  Normally this command initializes the current
    	directory.
    
    -T<trunk_subdir>;;
    --trunk=<trunk_subdir>;;
    -t<tags_subdir>;;
    --tags=<tags_subdir>;;
    -b<branches_subdir>;;
    --branches=<branches_subdir>;;
    -s;;
    --stdlayout;;
    	These are optional command-line options for init.  Each of
    	these flags can point to a relative repository path
    	(--tags=project/tags) or a full url
    	(--tags=https://foo.org/project/tags).
    	You can specify more than one --tags and/or --branches options, in case
    	your Subversion repository places tags or branches under multiple paths.
    	The option --stdlayout is
    	a shorthand way of setting trunk,tags,branches as the relative paths,
    	which is the Subversion default. If any of the other options are given
    	as well, they take precedence.
    --no-metadata;;
    	Set the 'noMetadata' option in the [svn-remote] config.
    	This option is not recommended, please read the 'svn.noMetadata'
    	section of this manpage before using this option.
    --use-svm-props;;
    	Set the 'useSvmProps' option in the [svn-remote] config.
    --use-svnsync-props;;
    	Set the 'useSvnsyncProps' option in the [svn-remote] config.
    --rewrite-root=<URL>;;
    	Set the 'rewriteRoot' option in the [svn-remote] config.
    --rewrite-uuid=<UUID>;;
    	Set the 'rewriteUUID' option in the [svn-remote] config.
    --username=<user>;;
    	For transports that SVN handles authentication for (http,
    	https, and plain svn), specify the username.  For other
    	transports (e.g. `svn+ssh://`), you must include the username in
    	the URL, e.g. `svn+ssh://foo@svn.bar.com/project`
    --prefix=<prefix>;;
    	This allows one to specify a prefix which is prepended
    	to the names of remotes if trunk/branches/tags are
    	specified.  The prefix does not automatically include a
    	trailing slash, so be sure you include one in the
    	argument if that is what you want.  If --branches/-b is
    	specified, the prefix must include a trailing slash.
    	Setting a prefix (with a trailing slash) is strongly
    	encouraged in any case, as your SVN-tracking refs will
    	then be located at "refs/remotes/$prefix/*", which is
    	compatible with Git's own remote-tracking ref layout
    	(refs/remotes/$remote/*). Setting a prefix is also useful
    	if you wish to track multiple projects that share a common
    	repository.
    	By default, the prefix is set to 'origin/'.
    +
    NOTE: Before Git v2.0, the default prefix was "" (no prefix). This
    meant that SVN-tracking refs were put at "refs/remotes/*", which is
    incompatible with how Git's own remote-tracking refs are organized.
    If you still want the old default, you can get it by passing
    `--prefix ""` on the command line (`--prefix=""` may not work if
    your Perl's Getopt::Long is < v2.37).
    
    
    --ignore-refs=<regex>;;
    	When passed to 'init' or 'clone' this regular expression will
    	be preserved as a config key.  See 'fetch' for a description
    	of `--ignore-refs`.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    --ignore-paths=<regex>;;
    	When passed to 'init' or 'clone' this regular expression will
    	be preserved as a config key.  See 'fetch' for a description
    	of `--ignore-paths`.
    --include-paths=<regex>;;
    	When passed to 'init' or 'clone' this regular expression will
    	be preserved as a config key.  See 'fetch' for a description
    	of `--include-paths`.
    --no-minimize-url;;
    	When tracking multiple directories (using --stdlayout,
    	--branches, or --tags options), git svn will attempt to connect
    	to the root (or highest allowed level) of the Subversion
    	repository.  This default allows better tracking of history if
    	entire projects are moved within a repository, but may cause
    	issues on repositories where read access restrictions are in
    	place.  Passing `--no-minimize-url` will allow git svn to
    	accept URLs as-is without attempting to connect to a higher
    	level directory.  This option is off by default when only
    	one URL/branch is tracked (it would do little good).
    
    'fetch'::
    	Fetch unfetched revisions from the Subversion remote we are
    	tracking.  The name of the [svn-remote "..."] section in the
    	$GIT_DIR/config file may be specified as an optional
    	command-line argument.
    +
    This automatically updates the rev_map if needed (see
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    '$GIT_DIR/svn/\**/.rev_map.*' in the FILES section below for details).
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    --localtime;;
    	Store Git commit times in the local time zone instead of UTC.  This
    	makes 'git log' (even without --date=local) show the same times
    	that `svn log` would in the local time zone.
    +
    This doesn't interfere with interoperating with the Subversion
    repository you cloned from, but if you wish for your local Git
    repository to be able to interoperate with someone else's local Git
    repository, either don't use this option or you should both use it in
    the same local time zone.
    
    --parent;;
    	Fetch only from the SVN parent of the current HEAD.
    
    
    --ignore-refs=<regex>;;
    	Ignore refs for branches or tags matching the Perl regular
    	expression. A "negative look-ahead assertion" like
    	`^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$`
    	can be used to allow only certain refs.
    +
    [verse]
    config key: svn-remote.<name>.ignore-refs
    +
    If the ignore-refs configuration key is set, and the command-line
    option is also given, both regular expressions will be used.
    
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    --ignore-paths=<regex>;;
    	This allows one to specify a Perl regular expression that will
    	cause skipping of all matching paths from checkout from SVN.
    	The `--ignore-paths` option should match for every 'fetch'
    	(including automatic fetches due to 'clone', 'dcommit',
    	'rebase', etc) on a given repository.
    +
    [verse]
    config key: svn-remote.<name>.ignore-paths
    +
    If the ignore-paths configuration key is set, and the command-line
    option is also given, both regular expressions will be used.
    +
    Examples:
    +
    --
    Skip "doc*" directory for every fetch;;
    +
    ------------------------------------------------------------------------
    --ignore-paths="^doc"
    ------------------------------------------------------------------------
    
    Skip "branches" and "tags" of first level directories;;
    +
    ------------------------------------------------------------------------
    --ignore-paths="^[^/]+/(?:branches|tags)"
    ------------------------------------------------------------------------
    --
    
    --include-paths=<regex>;;
    	This allows one to specify a Perl regular expression that will
    	cause the inclusion of only matching paths from checkout from SVN.
    	The `--include-paths` option should match for every 'fetch'
    	(including automatic fetches due to 'clone', 'dcommit',
    	'rebase', etc) on a given repository. `--ignore-paths` takes
    	precedence over `--include-paths`.
    +
    [verse]
    config key: svn-remote.<name>.include-paths
    
    --log-window-size=<n>;;
    	Fetch <n> log entries per request when scanning Subversion history.
    	The default is 100. For very large Subversion repositories, larger
    	values may be needed for 'clone'/'fetch' to complete in reasonable
    	time. But overly large values may lead to higher memory usage and
    	request timeouts.
    
    'clone'::
    	Runs 'init' and 'fetch'.  It will automatically create a
    	directory based on the basename of the URL passed to it;
    	or if a second argument is passed; it will create a directory
    	and work within that.  It accepts all arguments that the
    	'init' and 'fetch' commands accept; with the exception of
    	`--fetch-all` and `--parent`.  After a repository is cloned,
    	the 'fetch' command will be able to update revisions without
    	affecting the working tree; and the 'rebase' command will be
    	able to update the working tree with the latest changes.
    
    --preserve-empty-dirs;;
    	Create a placeholder file in the local Git repository for each
    	empty directory fetched from Subversion.  This includes directories
    	that become empty by removing all entries in the Subversion
    	repository (but not the directory itself).  The placeholder files
    	are also tracked and removed when no longer necessary.
    
    --placeholder-filename=<filename>;;
    	Set the name of placeholder files created by --preserve-empty-dirs.
    	Default: ".gitignore"
    
    'rebase'::
    	This fetches revisions from the SVN parent of the current HEAD
    	and rebases the current (uncommitted to SVN) work against it.
    +
    This works similarly to `svn update` or 'git pull' except that
    it preserves linear history with 'git rebase' instead of
    'git merge' for ease of dcommitting with 'git svn'.
    +
    This accepts all options that 'git svn fetch' and 'git rebase'
    accept.  However, `--fetch-all` only fetches from the current
    [svn-remote], and not all [svn-remote] definitions.
    +
    Like 'git rebase'; this requires that the working tree be clean
    and have no uncommitted changes.
    +
    This automatically updates the rev_map if needed (see
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    '$GIT_DIR/svn/\**/.rev_map.*' in the FILES section below for details).
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    -l;;
    --local;;
    	Do not fetch remotely; only run 'git rebase' against the
    	last fetched commit from the upstream SVN.
    
    'dcommit'::
    	Commit each diff from the current branch directly to the SVN
    	repository, and then rebase or reset (depending on whether or
    	not there is a diff between SVN and head).  This will create
    	a revision in SVN for each commit in Git.
    +
    When an optional Git branch name (or a Git commit object name)
    is specified as an argument, the subcommand works on the specified
    branch, not on the current branch.
    +
    Use of 'dcommit' is preferred to 'set-tree' (below).
    +
    --no-rebase;;
    	After committing, do not rebase or reset.
    --commit-url <URL>;;
    	Commit to this SVN URL (the full path).  This is intended to
    	allow existing 'git svn' repositories created with one transport
    	method (e.g. `svn://` or `http://` for anonymous read) to be
    	reused if a user is later given access to an alternate transport
    	method (e.g. `svn+ssh://` or `https://`) for commit.
    +
    [verse]
    config key: svn-remote.<name>.commiturl
    config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
    +
    Note that the SVN URL of the commiturl config key includes the SVN branch.
    If you rather want to set the commit URL for an entire SVN repository use
    svn-remote.<name>.pushurl instead.
    +
    Using this option for any other purpose (don't ask) is very strongly
    discouraged.
    
    --mergeinfo=<mergeinfo>;;
    	Add the given merge information during the dcommit
    	(e.g. `--mergeinfo="/branches/foo:1-10"`). All svn server versions can
    	store this information (as a property), and svn clients starting from
    	version 1.5 can make use of it. To specify merge information from multiple
    	branches, use a single space character between the branches
    	(`--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8"`)
    +
    [verse]
    config key: svn.pushmergeinfo
    +
    This option will cause git-svn to attempt to automatically populate the
    svn:mergeinfo property in the SVN repository when possible. Currently, this can
    only be done when dcommitting non-fast-forward merges where all parents but the
    first have already been pushed into SVN.
    
    --interactive;;
    	Ask the user to confirm that a patch set should actually be sent to SVN.
    	For each patch, one may answer "yes" (accept this patch), "no" (discard this
    	patch), "all" (accept all patches), or "quit".
    +
    'git svn dcommit' returns immediately if answer is "no" or "quit", without
    committing anything to SVN.
    
    'branch'::
    	Create a branch in the SVN repository.
    
    -m;;
    --message;;
    	Allows to specify the commit message.
    
    -t;;
    --tag;;
    	Create a tag by using the tags_subdir instead of the branches_subdir
    	specified during git svn init.
    
    -d<path>;;
    --destination=<path>;;
    
    	If more than one --branches (or --tags) option was given to the 'init'
    	or 'clone' command, you must provide the location of the branch (or
    	tag) you wish to create in the SVN repository.  <path> specifies which
    	path to use to create the branch or tag and should match the pattern
    	on the left-hand side of one of the configured branches or tags
    	refspecs.  You can see these refspecs with the commands
    +
    	git config --get-all svn-remote.<name>.branches
    	git config --get-all svn-remote.<name>.tags
    +
    where <name> is the name of the SVN repository as specified by the -R option to
    'init' (or "svn" by default).
    
    --username;;
    	Specify the SVN username to perform the commit as.  This option overrides
    	the 'username' configuration property.
    
    --commit-url;;
    	Use the specified URL to connect to the destination Subversion
    	repository.  This is useful in cases where the source SVN
    	repository is read-only.  This option overrides configuration
    	property 'commiturl'.
    +
    	git config --get-all svn-remote.<name>.commiturl
    +
    
    --parents;;
    	Create parent folders. This parameter is equivalent to the parameter
    	--parents on svn cp commands and is useful for non-standard repository
    	layouts.
    
    'tag'::
    	Create a tag in the SVN repository. This is a shorthand for
    	'branch -t'.
    
    'log'::
    	This should make it easy to look up svn log messages when svn
    	users refer to -r/--revision numbers.
    +
    The following features from `svn log' are supported:
    +
    --
    -r <n>[:<n>];;
    --revision=<n>[:<n>];;
    	is supported, non-numeric args are not:
    	HEAD, NEXT, BASE, PREV, etc ...
    -v;;
    --verbose;;
    	it's not completely compatible with the --verbose
    	output in svn log, but reasonably close.
    --limit=<n>;;
    	is NOT the same as --max-count, doesn't count
    	merged/excluded commits
    --incremental;;
    	supported
    --
    +
    New features:
    +
    --
    --show-commit;;
    	shows the Git commit sha1, as well
    --oneline;;
    	our version of --pretty=oneline
    --
    +
    NOTE: SVN itself only stores times in UTC and nothing else. The regular svn
    client converts the UTC time to the local time (or based on the TZ=
    environment). This command has the same behaviour.
    +
    Any other arguments are passed directly to 'git log'
    
    'blame'::
    	Show what revision and author last modified each line of a file. The
    	output of this mode is format-compatible with the output of
    	`svn blame' by default. Like the SVN blame command,
    	local uncommitted changes in the working tree are ignored;
    	the version of the file in the HEAD revision is annotated. Unknown
    	arguments are passed directly to 'git blame'.
    +
    --git-format;;
    	Produce output in the same format as 'git blame', but with
    	SVN revision numbers instead of Git commit hashes. In this mode,
    	changes that haven't been committed to SVN (including local
    	working-copy edits) are shown as revision 0.
    
    'find-rev'::
    	When given an SVN revision number of the form 'rN', returns the
    	corresponding Git commit hash (this can optionally be followed by a
    	tree-ish to specify which branch should be searched).  When given a
    	tree-ish, returns the corresponding SVN revision number.
    +
    -B;;
    --before;;
    	Don't require an exact match if given an SVN revision, instead find
    	the commit corresponding to the state of the SVN repository (on the
    	current branch) at the specified revision.
    +
    -A;;
    --after;;
    	Don't require an exact match if given an SVN revision; if there is
    	not an exact match return the closest match searching forward in the
    	history.
    
    'set-tree'::
    	You should consider using 'dcommit' instead of this command.
    	Commit specified commit or tree objects to SVN.  This relies on
    
    	your imported fetch data being up to date.  This makes
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	absolutely no attempts to do patching when committing to SVN, it
    	simply overwrites files with those specified in the tree or
    	commit.  All merging is assumed to have taken place
    	independently of 'git svn' functions.
    
    'create-ignore'::
    	Recursively finds the svn:ignore property on directories and
    	creates matching .gitignore files. The resulting files are staged to
    	be committed, but are not committed. Use -r/--revision to refer to a
    	specific revision.
    
    'show-ignore'::
    	Recursively finds and lists the svn:ignore property on
    	directories.  The output is suitable for appending to
    	the $GIT_DIR/info/exclude file.
    
    'mkdirs'::
    	Attempts to recreate empty directories that core Git cannot track
    	based on information in $GIT_DIR/svn/<refname>/unhandled.log files.
    	Empty directories are automatically recreated when using
    	"git svn clone" and "git svn rebase", so "mkdirs" is intended
    	for use after commands like "git checkout" or "git reset".
    	(See the svn-remote.<name>.automkdirs config file option for
    	more information.)
    
    'commit-diff'::
    	Commits the diff of two tree-ish arguments from the
    
    	command-line.  This command does not rely on being inside a `git svn
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	init`-ed repository.  This command takes three arguments, (a) the
    	original tree to diff against, (b) the new tree result, (c) the
    	URL of the target Subversion repository.  The final argument
    	(URL) may be omitted if you are working from a 'git svn'-aware
    	repository (that has been `init`-ed with 'git svn').
    	The -r<revision> option is required for this.
    
    +
    The commit message is supplied either directly with the `-m` or `-F`
    option, or indirectly from the tag or commit when the second tree-ish
    denotes such an object, or it is requested by invoking an editor (see
    `--edit` option below).
    
    -m <msg>;;
    --message=<msg>;;
    	Use the given `msg` as the commit message. This option
    	disables the `--edit` option.
    
    -F <filename>;;
    --file=<filename>;;
    	Take the commit message from the given file. This option
    	disables the `--edit` option.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    'info'::
    	Shows information about a file or directory similar to what
    	`svn info' provides.  Does not currently support a -r/--revision
    	argument.  Use the --url option to output only the value of the
    	'URL:' field.
    
    'proplist'::
    	Lists the properties stored in the Subversion repository about a
    	given file or directory.  Use -r/--revision to refer to a specific
    	Subversion revision.
    
    'propget'::
    	Gets the Subversion property given as the first argument, for a
    	file.  A specific revision can be specified with -r/--revision.
    
    'propset'::
    	Sets the Subversion property given as the first argument, to the
    	value given as the second argument for the file given as the
    	third argument.
    +
    Example:
    +
    ------------------------------------------------------------------------
    git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile
    ------------------------------------------------------------------------
    +
    This will set the property 'svn:keywords' to 'FreeBSD=%H' for the file
    'devel/py-tipper/Makefile'.
    
    'show-externals'::
    	Shows the Subversion externals.  Use -r/--revision to specify a
    	specific revision.
    
    'gc'::
    	Compress $GIT_DIR/svn/<refname>/unhandled.log files and remove
    	$GIT_DIR/svn/<refname>/index files.
    
    'reset'::
    	Undoes the effects of 'fetch' back to the specified revision.
    	This allows you to re-'fetch' an SVN revision.  Normally the
    	contents of an SVN revision should never change and 'reset'
    	should not be necessary.  However, if SVN permissions change,
    	or if you alter your --ignore-paths option, a 'fetch' may fail
    	with "not found in commit" (file not previously visible) or
    	"checksum mismatch" (missed a modification).  If the problem
    	file cannot be ignored forever (with --ignore-paths) the only
    	way to repair the repo is to use 'reset'.
    +
    Only the rev_map and refs/remotes/git-svn are changed (see
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    '$GIT_DIR/svn/\**/.rev_map.*' in the FILES section below for details).
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    Follow 'reset' with a 'fetch' and then 'git reset' or 'git rebase' to
    move local branches onto the new tree.
    
    -r <n>;;
    --revision=<n>;;
    	Specify the most recent revision to keep.  All later revisions
    	are discarded.
    -p;;
    --parent;;
    	Discard the specified revision as well, keeping the nearest
    	parent instead.
    Example:;;
    Assume you have local changes in "master", but you need to refetch "r2".
    +
    ------------
        r1---r2---r3 remotes/git-svn
                    \
                     A---B master
    ------------
    +
    Fix the ignore-paths or SVN permissions problem that caused "r2" to
    be incomplete in the first place.  Then:
    +
    [verse]
    git svn reset -r2 -p
    git svn fetch
    +
    ------------
        r1---r2'--r3' remotes/git-svn
          \
           r2---r3---A---B master
    ------------
    +
    Then fixup "master" with 'git rebase'.
    Do NOT use 'git merge' or your history will not be compatible with a
    future 'dcommit'!
    +
    [verse]
    git rebase --onto remotes/git-svn A^ master
    +
    ------------
        r1---r2'--r3' remotes/git-svn
                    \
                     A'--B' master
    ------------
    
    OPTIONS
    -------
    
    --shared[=(false|true|umask|group|all|world|everybody)]::
    
    --template=<template-directory>::
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	Only used with the 'init' command.
    	These are passed directly to 'git init'.
    
    -r <arg>::
    --revision <arg>::
    	   Used with the 'fetch' command.
    +
    This allows revision ranges for partial/cauterized history
    to be supported.  $NUMBER, $NUMBER1:$NUMBER2 (numeric ranges),
    $NUMBER:HEAD, and BASE:$NUMBER are all supported.
    +
    This can allow you to make partial mirrors when running fetch;
    but is generally not recommended because history will be skipped
    and lost.
    
    -::
    --stdin::
    	Only used with the 'set-tree' command.
    +
    Read a list of commits from stdin and commit them in reverse
    order.  Only the leading sha1 is read from each line, so
    'git rev-list --pretty=oneline' output can be used.
    
    --rmdir::
    	Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
    +
    Remove directories from the SVN tree if there are no files left
    behind.  SVN can version empty directories, and they are not
    removed by default if there are no files left in them.  Git
    cannot version empty directories.  Enabling this flag will make
    the commit to SVN act like Git.
    +
    [verse]
    config key: svn.rmdir
    
    -e::
    --edit::
    	Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
    +
    Edit the commit message before committing to SVN.  This is off by
    default for objects that are commits, and forced on when committing
    tree objects.
    +
    [verse]
    config key: svn.edit
    
    -l<num>::
    --find-copies-harder::
    	Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
    +
    They are both passed directly to 'git diff-tree'; see
    linkgit:git-diff-tree[1] for more information.
    +
    [verse]
    config key: svn.l
    config key: svn.findcopiesharder
    
    -A<filename>::
    --authors-file=<filename>::
    
    	Syntax is compatible with the file used by 'git cvsimport' but
    	an empty email address can be supplied with '<>':
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    +
    ------------------------------------------------------------------------
    	loginname = Joe User <user@example.com>
    ------------------------------------------------------------------------
    +
    If this option is specified and 'git svn' encounters an SVN
    committer name that does not exist in the authors-file, 'git svn'
    will abort operation. The user will then have to add the
    appropriate entry.  Re-running the previous 'git svn' command
    after the authors-file is modified should continue operation.
    +
    [verse]
    config key: svn.authorsfile
    
    --authors-prog=<filename>::
    	If this option is specified, for each SVN committer name that
    	does not exist in the authors file, the given file is executed
    	with the committer name as the first argument.  The program is
    
    	expected to return a single line of the form "Name <email>" or
    	"Name <>", which will be treated as if included in the authors
    	file.
    +
    Due to historical reasons a relative 'filename' is first searched
    relative to the current directory for 'init' and 'clone' and relative
    to the root of the working tree for 'fetch'. If 'filename' is
    not found, it is searched like any other command in '$PATH'.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    +
    [verse]
    config key: svn.authorsProg
    
    -q::
    --quiet::
    	Make 'git svn' less verbose. Specify a second time to make it
    	even less verbose.
    
    -m::
    --merge::
    -s<strategy>::
    --strategy=<strategy>::
    -p::
    
    --rebase-merges::
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	These are only used with the 'dcommit' and 'rebase' commands.
    +
    Passed directly to 'git rebase' when using 'dcommit' if a
    'git reset' cannot be used (see 'dcommit').
    
    -n::
    --dry-run::
    	This can be used with the 'dcommit', 'rebase', 'branch' and
    	'tag' commands.
    +
    For 'dcommit', print out the series of Git arguments that would show
    which diffs would be committed to SVN.
    +
    For 'rebase', display the local branch associated with the upstream svn
    repository associated with the current branch and the URL of svn
    repository that will be fetched from.
    +
    For 'branch' and 'tag', display the urls that will be used for copying when
    creating the branch or tag.
    
    --use-log-author::
    	When retrieving svn commits into Git (as part of 'fetch', 'rebase', or
    
    	'dcommit' operations), look for the first `From:` line or `Signed-off-by` trailer
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	in the log message and use that as the author string.
    +
    [verse]
    config key: svn.useLogAuthor
    
    --add-author-from::
    
    	When committing to svn from Git (as part of 'set-tree' or 'dcommit'
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	operations), if the existing log message doesn't already have a
    
    	`From:` or `Signed-off-by` trailer, append a `From:` line based on the
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    	Git commit's author string.  If you use this, then `--use-log-author`
    	will retrieve a valid author string for all commits.
    +
    [verse]
    config key: svn.addAuthorFrom
    
    ADVANCED OPTIONS
    ----------------
    
    -i<GIT_SVN_ID>::
    --id <GIT_SVN_ID>::
    	This sets GIT_SVN_ID (instead of using the environment).  This
    	allows the user to override the default refname to fetch from
    	when tracking a single URL.  The 'log' and 'dcommit' commands
    	no longer require this switch as an argument.
    
    -R<remote name>::
    --svn-remote <remote name>::
    	Specify the [svn-remote "<remote name>"] section to use,
    	this allows SVN multiple repositories to be tracked.
    	Default: "svn"
    
    --follow-parent::
    	This option is only relevant if we are tracking branches (using
    	one of the repository layout options --trunk, --tags,
    	--branches, --stdlayout). For each tracked branch, try to find
    	out where its revision was copied from, and set
    	a suitable parent in the first Git commit for the branch.
    	This is especially helpful when we're tracking a directory
    	that has been moved around within the repository.  If this
    	feature is disabled, the branches created by 'git svn' will all
    	be linear and not share any history, meaning that there will be
    	no information on where branches were branched off or merged.
    	However, following long/convoluted histories can take a long
    	time, so disabling this feature may speed up the cloning
    	process. This feature is enabled by default, use
    	--no-follow-parent to disable it.
    +
    [verse]
    config key: svn.followparent
    
    CONFIG FILE-ONLY OPTIONS
    ------------------------
    
    svn.noMetadata::
    svn-remote.<name>.noMetadata::
    	This gets rid of the 'git-svn-id:' lines at the end of every commit.
    +
    This option can only be used for one-shot imports as 'git svn'
    will not be able to fetch again without metadata. Additionally,
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    if you lose your '$GIT_DIR/svn/\**/.rev_map.*' files, 'git svn' will not
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    be able to rebuild them.
    +
    The 'git svn log' command will not work on repositories using
    this, either.  Using this conflicts with the 'useSvmProps'
    option for (hopefully) obvious reasons.
    +
    This option is NOT recommended as it makes it difficult to track down
    old references to SVN revision numbers in existing documentation, bug
    
    reports, and archives.  If you plan to eventually migrate from SVN to
    Git and are certain about dropping SVN history, consider
    https://github.com/newren/git-filter-repo[git-filter-repo] instead.
    filter-repo also allows reformatting of metadata for ease-of-reading
    and rewriting authorship info for non-"svn.authorsFile" users.
    
    Jean-Noël Avila's avatar
    Jean-Noël Avila committed
    
    svn.useSvmProps::
    svn-remote.<name>.useSvmProps::
    	This allows 'git svn' to re-map repository URLs and UUIDs from
    	mirrors created using SVN::Mirror (or svk) for metadata.
    +
    If an SVN revision has a property, "svm:headrev", it is likely
    that the revision was created by SVN::Mirror (also used by SVK).
    The property contains a repository UUID and a revision.  We want
    to make it look like we are mirroring the original URL, so
    introduce a helper function that returns the original identity
    URL and UUID, and use it when generating metadata in commit
    messages.
    
    svn.useSvnsyncProps::
    svn-remote.<name>.useSvnsyncprops::
    	Similar to the useSvmProps option; this is for users
    	of the svnsync(1) command distributed with SVN 1.4.x and
    	later.
    
    svn-remote.<name>.rewriteRoot::
    	This allows users to create repositories from alternate
    	URLs.  For example, an administrator could run 'git svn' on the
    	server locally (accessing via file://) but wish to distribute
    	the repository with a public http:// or svn:// URL in the
    	metadata so users of it will see the public URL.
    
    svn-remote.<name>.rewriteUUID::
    	Similar to the useSvmProps option; this is for users who need
    	to remap the UUID manually. This may be useful in situations
    	where the original UUID is not available via either useSvmProps
    	or useSvnsyncProps.
    
    svn-remote.<name>.pushurl::
    
    	Similar to Git's `remote.<name>.pushurl`, this key is designed
    	to be used in cases where 'url' points to an SVN repository
    	via a read-only transport, to provide an alternate read/write
    	transport. It is assumed that both keys point to the same
    	repository. Unlike 'commiturl', 'pushurl' is a base path. If
    	either 'commiturl' or 'pushurl' could be used, 'commiturl'
    	takes precedence.
    
    svn.brokenSymlinkWorkaround::
    	This disables potentially expensive checks to workaround
    	broken symlinks checked into SVN by broken clients.  Set this
    	option to "false" if you track a SVN repository with many
    	empty blobs that are not symlinks.  This option may be changed
    	while 'git svn' is running and take effect on the next
    	revision fetched.  If unset, 'git svn' assumes this option to
    	be "true".
    
    svn.pathnameencoding::
    	This instructs git svn to recode pathnames to a given encoding.
    	It can be used by windows users and by those who work in non-utf8
    	locales to avoid corrupted file names with non-ASCII characters.
    	Valid encodings are the ones supported by Perl's Encode module.
    
    svn-remote.<name>.automkdirs::
    	Normally, the "git svn clone" and "git svn rebase" commands
    	attempt to recreate empty directories that are in the
    	Subversion repository.  If this option is set to "false", then
    	empty directories will only be created if the "git svn mkdirs"
    	command is run explicitly.  If unset, 'git svn' assumes this
    	option to be "true".
    
    Since the noMetadata, rewriteRoot, rewriteUUID, useSvnsyncProps and useSvmProps
    options all affect the metadata generated and used by 'git svn'; they
    *must* be set in the configuration file before any history is imported
    and these settings should never be changed once they are set.
    
    Additionally, only one of these options can be used per svn-remote
    section because they affect the 'git-svn-id:' metadata line, except
    for rewriteRoot and rewriteUUID which can be used together.
    
    
    BASIC EXAMPLES
    --------------
    
    Tracking and contributing to the trunk of a Subversion-managed project
    (ignoring tags and branches):
    
    ------------------------------------------------------------------------
    # Clone a repo (like git clone):
    	git svn clone http://svn.example.com/project/trunk
    # Enter the newly cloned directory:
    	cd trunk
    # You should be on master branch, double-check with 'git branch'
    	git branch
    # Do some work and commit locally to Git:
    	git commit ...
    # Something is committed to SVN, rebase your local changes against the
    # latest changes in SVN:
    	git svn rebase
    # Now commit your changes (that were committed previously using Git) to SVN,
    # as well as automatically updating your working HEAD:
    	git svn dcommit
    # Append svn:ignore settings to the default Git exclude file:
    	git svn show-ignore >> .git/info/exclude
    ------------------------------------------------------------------------
    
    Tracking and contributing to an entire Subversion-managed project
    (complete with a trunk, tags and branches):
    
    ------------------------------------------------------------------------
    # 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 cloned:
    	git branch -r
    # Create a new branch in SVN
    	git svn branch waldo
    # Reset your master to trunk (or any other branch, replacing 'trunk'
    # with the appropriate name):
    	git reset --hard svn/trunk
    # You may only dcommit to one branch/tag/trunk at a time.  The usage
    # of dcommit/rebase/show-ignore should be the same as above.
    ------------------------------------------------------------------------
    
    The initial 'git svn clone' can be quite time-consuming
    (especially for large Subversion repositories). If multiple
    people (or one person with multiple machines) want to use
    'git svn' to interact with the same Subversion repository, you can
    do the initial 'git svn clone' to a repository on a server and
    have each person clone that repository with 'git clone':
    
    ------------------------------------------------------------------------
    # Do the initial import on a server
    	ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
    # Clone locally - make sure the refs/remotes/ space matches the server
    	mkdir project
    	cd project
    	git init
    	git remote add origin server:/pub/project
    	git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
    	git fetch
    # Prevent fetch/pull from remote Git server in the future,
    # we only want to use git svn for future updates
    	git config --remove-section remote.origin
    # Create a local branch from one of the branches just fetched
    	git checkout -b master FETCH_HEAD
    # Initialize 'git svn' locally (be sure to use the same URL and
    # --stdlayout/-T/-b/-t/--prefix options as were used on server)
    	git svn init http://svn.example.com/project [options...]
    # Pull the latest changes from Subversion
    	git svn rebase
    ------------------------------------------------------------------------
    
    REBASE VS. PULL/MERGE
    ---------------------
    Prefer to use 'git svn rebase' or 'git rebase', rather than
    'git pull' or 'git merge' to synchronize unintegrated commits with a 'git svn'
    branch. Doing so will keep the history of unintegrated commits linear with
    respect to the upstream SVN repository and allow the use of the preferred
    'git svn dcommit' subcommand to push unintegrated commits back into SVN.
    
    Originally, 'git svn' recommended that developers pulled or merged from
    the 'git svn' branch.  This was because the author favored
    `git svn set-tree B` to commit a single head rather than the
    `git svn set-tree A..B` notation to commit multiple commits. Use of
    'git pull' or 'git merge' with `git svn set-tree A..B` will cause non-linear
    history to be flattened when committing into SVN and this can lead to merge
    commits unexpectedly reversing previous commits in SVN.
    
    MERGE TRACKING
    --------------
    While 'git svn' can track
    copy history (including branches and tags) for repositories adopting a
    standard layout, it cannot yet represent merge history that happened
    inside git back upstream to SVN users.  Therefore it is advised that
    users keep history as linear as possible inside Git to ease
    compatibility with SVN (see the CAVEATS section below).
    
    HANDLING OF SVN BRANCHES
    ------------------------
    If 'git svn' is configured to fetch branches (and --follow-branches
    is in effect), it sometimes creates multiple Git branches for one
    SVN branch, where the additional branches have names of the form
    'branchname@nnn' (with nnn an SVN revision number).  These additional
    branches are created if 'git svn' cannot find a parent commit for the
    first commit in an SVN branch, to connect the branch to the history of
    the other branches.
    
    Normally, the first commit in an SVN branch consists
    of a copy operation. 'git svn' will read this commit to get the SVN
    revision the branch was created from. It will then try to find the
    Git commit that corresponds to this SVN revision, and use that as the
    parent of the branch. However, it is possible that there is no suitable
    Git commit to serve as parent.  This will happen, among other reasons,
    if the SVN branch is a copy of a revision that was not fetched by 'git
    svn' (e.g. because it is an old revision that was skipped with
    `--revision`), or if in SVN a directory was copied that is not tracked
    by 'git svn' (such as a branch that is not tracked at all, or a
    subdirectory of a tracked branch). In these cases, 'git svn' will still
    create a Git branch, but instead of using an existing Git commit as the
    parent of the branch, it will read the SVN history of the directory the
    branch was copied from and create appropriate Git commits.  This is
    indicated by the message "Initializing parent: <branchname>".
    
    Additionally, it will create a special branch named
    '<branchname>@<SVN-Revision>', where <SVN-Revision> is the SVN revision
    number the branch was copied from.  This branch will point to the newly
    created parent commit of the branch.  If in SVN the branch was deleted
    and later recreated from a different version, there will be multiple
    such branches with an '@'.
    
    Note that this may mean that multiple Git commits are created for a
    single SVN revision.
    
    An example: in an SVN repository with a standard
    trunk/tags/branches layout, a directory trunk/sub is created in r.100.
    In r.200, trunk/sub is branched by copying it to branches/. 'git svn
    clone -s' will then create a branch 'sub'. It will also create new Git
    commits for r.100 through r.199 and use these as the history of branch
    'sub'. Thus there will be two Git commits for each revision from r.100
    to r.199 (one containing trunk/, one containing trunk/sub/). Finally,
    it will create a branch 'sub@200' pointing to the new parent commit of
    branch 'sub' (i.e. the commit for r.200 and trunk/sub/).
    
    CAVEATS
    -------
    
    For the sake of simplicity and interoperating with Subversion,