Documentation / git-svn.txton commit Merge branch 'pw/git-p4' (523f0a2)
   1git-svn(1)
   2==========
   3
   4NAME
   5----
   6git-svn - Bidirectional operation between a Subversion repository and Git
   7
   8SYNOPSIS
   9--------
  10[verse]
  11'git svn' <command> [options] [arguments]
  12
  13DESCRIPTION
  14-----------
  15'git svn' is a simple conduit for changesets between Subversion and Git.
  16It provides a bidirectional flow of changes between a Subversion and a Git
  17repository.
  18
  19'git svn' can track a standard Subversion repository,
  20following the common "trunk/branches/tags" layout, with the --stdlayout option.
  21It can also follow branches and tags in any layout with the -T/-t/-b options
  22(see options to 'init' below, and also the 'clone' command).
  23
  24Once tracking a Subversion repository (with any of the above methods), the Git
  25repository can be updated from Subversion by the 'fetch' command and
  26Subversion updated from Git by the 'dcommit' command.
  27
  28COMMANDS
  29--------
  30
  31'init'::
  32        Initializes an empty Git repository with additional
  33        metadata directories for 'git svn'.  The Subversion URL
  34        may be specified as a command-line argument, or as full
  35        URL arguments to -T/-t/-b.  Optionally, the target
  36        directory to operate on can be specified as a second
  37        argument.  Normally this command initializes the current
  38        directory.
  39
  40-T<trunk_subdir>;;
  41--trunk=<trunk_subdir>;;
  42-t<tags_subdir>;;
  43--tags=<tags_subdir>;;
  44-b<branches_subdir>;;
  45--branches=<branches_subdir>;;
  46-s;;
  47--stdlayout;;
  48        These are optional command-line options for init.  Each of
  49        these flags can point to a relative repository path
  50        (--tags=project/tags) or a full url
  51        (--tags=https://foo.org/project/tags).
  52        You can specify more than one --tags and/or --branches options, in case
  53        your Subversion repository places tags or branches under multiple paths.
  54        The option --stdlayout is
  55        a shorthand way of setting trunk,tags,branches as the relative paths,
  56        which is the Subversion default. If any of the other options are given
  57        as well, they take precedence.
  58--no-metadata;;
  59        Set the 'noMetadata' option in the [svn-remote] config.
  60        This option is not recommended, please read the 'svn.noMetadata'
  61        section of this manpage before using this option.
  62--use-svm-props;;
  63        Set the 'useSvmProps' option in the [svn-remote] config.
  64--use-svnsync-props;;
  65        Set the 'useSvnsyncProps' option in the [svn-remote] config.
  66--rewrite-root=<URL>;;
  67        Set the 'rewriteRoot' option in the [svn-remote] config.
  68--rewrite-uuid=<UUID>;;
  69        Set the 'rewriteUUID' option in the [svn-remote] config.
  70--username=<user>;;
  71        For transports that SVN handles authentication for (http,
  72        https, and plain svn), specify the username.  For other
  73        transports (eg svn+ssh://), you must include the username in
  74        the URL, eg svn+ssh://foo@svn.bar.com/project
  75--prefix=<prefix>;;
  76        This allows one to specify a prefix which is prepended
  77        to the names of remotes if trunk/branches/tags are
  78        specified.  The prefix does not automatically include a
  79        trailing slash, so be sure you include one in the
  80        argument if that is what you want.  If --branches/-b is
  81        specified, the prefix must include a trailing slash.
  82        Setting a prefix (with a trailing slash) is strongly
  83        encouraged in any case, as your SVN-tracking refs will
  84        then be located at "refs/remotes/$prefix/*", which is
  85        compatible with Git's own remote-tracking ref layout
  86        (refs/remotes/$remote/*). Setting a prefix is also useful
  87        if you wish to track multiple projects that share a common
  88        repository.
  89+
  90NOTE: In Git v2.0, the default prefix will CHANGE from "" (no prefix)
  91to "origin/". This is done to put SVN-tracking refs at
  92"refs/remotes/origin/*" instead of "refs/remotes/*", and make them
  93more compatible with how Git's own remote-tracking refs are organized
  94(i.e. refs/remotes/$remote/*). You can enjoy the same benefits today,
  95by using the --prefix option.
  96
  97--ignore-paths=<regex>;;
  98        When passed to 'init' or 'clone' this regular expression will
  99        be preserved as a config key.  See 'fetch' for a description
 100        of '--ignore-paths'.
 101--include-paths=<regex>;;
 102        When passed to 'init' or 'clone' this regular expression will
 103        be preserved as a config key.  See 'fetch' for a description
 104        of '--include-paths'.
 105--no-minimize-url;;
 106        When tracking multiple directories (using --stdlayout,
 107        --branches, or --tags options), git svn will attempt to connect
 108        to the root (or highest allowed level) of the Subversion
 109        repository.  This default allows better tracking of history if
 110        entire projects are moved within a repository, but may cause
 111        issues on repositories where read access restrictions are in
 112        place.  Passing '--no-minimize-url' will allow git svn to
 113        accept URLs as-is without attempting to connect to a higher
 114        level directory.  This option is off by default when only
 115        one URL/branch is tracked (it would do little good).
 116
 117'fetch'::
 118        Fetch unfetched revisions from the Subversion remote we are
 119        tracking.  The name of the [svn-remote "..."] section in the
 120        $GIT_DIR/config file may be specified as an optional
 121        command-line argument.
 122+
 123This automatically updates the rev_map if needed (see
 124'$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details).
 125
 126--localtime;;
 127        Store Git commit times in the local time zone instead of UTC.  This
 128        makes 'git log' (even without --date=local) show the same times
 129        that `svn log` would in the local time zone.
 130+
 131This doesn't interfere with interoperating with the Subversion
 132repository you cloned from, but if you wish for your local Git
 133repository to be able to interoperate with someone else's local Git
 134repository, either don't use this option or you should both use it in
 135the same local time zone.
 136
 137--parent;;
 138        Fetch only from the SVN parent of the current HEAD.
 139
 140--ignore-paths=<regex>;;
 141        This allows one to specify a Perl regular expression that will
 142        cause skipping of all matching paths from checkout from SVN.
 143        The '--ignore-paths' option should match for every 'fetch'
 144        (including automatic fetches due to 'clone', 'dcommit',
 145        'rebase', etc) on a given repository.
 146+
 147[verse]
 148config key: svn-remote.<name>.ignore-paths
 149+
 150If the ignore-paths config key is set and the command line option is
 151also given, both regular expressions will be used.
 152+
 153Examples:
 154+
 155--
 156Skip "doc*" directory for every fetch;;
 157+
 158------------------------------------------------------------------------
 159--ignore-paths="^doc"
 160------------------------------------------------------------------------
 161
 162Skip "branches" and "tags" of first level directories;;
 163+
 164------------------------------------------------------------------------
 165--ignore-paths="^[^/]+/(?:branches|tags)"
 166------------------------------------------------------------------------
 167--
 168
 169--include-paths=<regex>;;
 170        This allows one to specify a Perl regular expression that will
 171        cause the inclusion of only matching paths from checkout from SVN.
 172        The '--include-paths' option should match for every 'fetch'
 173        (including automatic fetches due to 'clone', 'dcommit',
 174        'rebase', etc) on a given repository. '--ignore-paths' takes
 175        precedence over '--include-paths'.
 176
 177--log-window-size=<n>;;
 178        Fetch <n> log entries per request when scanning Subversion history.
 179        The default is 100. For very large Subversion repositories, larger
 180        values may be needed for 'clone'/'fetch' to complete in reasonable
 181        time. But overly large values may lead to higher memory usage and
 182        request timeouts.
 183
 184'clone'::
 185        Runs 'init' and 'fetch'.  It will automatically create a
 186        directory based on the basename of the URL passed to it;
 187        or if a second argument is passed; it will create a directory
 188        and work within that.  It accepts all arguments that the
 189        'init' and 'fetch' commands accept; with the exception of
 190        '--fetch-all' and '--parent'.  After a repository is cloned,
 191        the 'fetch' command will be able to update revisions without
 192        affecting the working tree; and the 'rebase' command will be
 193        able to update the working tree with the latest changes.
 194
 195--preserve-empty-dirs;;
 196        Create a placeholder file in the local Git repository for each
 197        empty directory fetched from Subversion.  This includes directories
 198        that become empty by removing all entries in the Subversion
 199        repository (but not the directory itself).  The placeholder files
 200        are also tracked and removed when no longer necessary.
 201
 202--placeholder-filename=<filename>;;
 203        Set the name of placeholder files created by --preserve-empty-dirs.
 204        Default: ".gitignore"
 205
 206'rebase'::
 207        This fetches revisions from the SVN parent of the current HEAD
 208        and rebases the current (uncommitted to SVN) work against it.
 209+
 210This works similarly to `svn update` or 'git pull' except that
 211it preserves linear history with 'git rebase' instead of
 212'git merge' for ease of dcommitting with 'git svn'.
 213+
 214This accepts all options that 'git svn fetch' and 'git rebase'
 215accept.  However, '--fetch-all' only fetches from the current
 216[svn-remote], and not all [svn-remote] definitions.
 217+
 218Like 'git rebase'; this requires that the working tree be clean
 219and have no uncommitted changes.
 220+
 221This automatically updates the rev_map if needed (see
 222'$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details).
 223
 224-l;;
 225--local;;
 226        Do not fetch remotely; only run 'git rebase' against the
 227        last fetched commit from the upstream SVN.
 228
 229'dcommit'::
 230        Commit each diff from the current branch directly to the SVN
 231        repository, and then rebase or reset (depending on whether or
 232        not there is a diff between SVN and head).  This will create
 233        a revision in SVN for each commit in Git.
 234+
 235When an optional Git branch name (or a Git commit object name)
 236is specified as an argument, the subcommand works on the specified
 237branch, not on the current branch.
 238+
 239Use of 'dcommit' is preferred to 'set-tree' (below).
 240+
 241--no-rebase;;
 242        After committing, do not rebase or reset.
 243--commit-url <URL>;;
 244        Commit to this SVN URL (the full path).  This is intended to
 245        allow existing 'git svn' repositories created with one transport
 246        method (e.g. `svn://` or `http://` for anonymous read) to be
 247        reused if a user is later given access to an alternate transport
 248        method (e.g. `svn+ssh://` or `https://`) for commit.
 249+
 250[verse]
 251config key: svn-remote.<name>.commiturl
 252config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
 253+
 254Using this option for any other purpose (don't ask) is very strongly
 255discouraged.
 256
 257--mergeinfo=<mergeinfo>;;
 258        Add the given merge information during the dcommit
 259        (e.g. `--mergeinfo="/branches/foo:1-10"`). All svn server versions can
 260        store this information (as a property), and svn clients starting from
 261        version 1.5 can make use of it. To specify merge information from multiple
 262        branches, use a single space character between the branches
 263        (`--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8"`)
 264+
 265[verse]
 266config key: svn.pushmergeinfo
 267+
 268This option will cause git-svn to attempt to automatically populate the
 269svn:mergeinfo property in the SVN repository when possible. Currently, this can
 270only be done when dcommitting non-fast-forward merges where all parents but the
 271first have already been pushed into SVN.
 272
 273--interactive;;
 274        Ask the user to confirm that a patch set should actually be sent to SVN.
 275        For each patch, one may answer "yes" (accept this patch), "no" (discard this
 276        patch), "all" (accept all patches), or "quit".
 277        +
 278        'git svn dcommit' returns immediately if answer is "no" or "quit", without
 279        committing anything to SVN.
 280
 281'branch'::
 282        Create a branch in the SVN repository.
 283
 284-m;;
 285--message;;
 286        Allows to specify the commit message.
 287
 288-t;;
 289--tag;;
 290        Create a tag by using the tags_subdir instead of the branches_subdir
 291        specified during git svn init.
 292
 293-d<path>;;
 294--destination=<path>;;
 295
 296        If more than one --branches (or --tags) option was given to the 'init'
 297        or 'clone' command, you must provide the location of the branch (or
 298        tag) you wish to create in the SVN repository.  <path> specifies which
 299        path to use to create the branch or tag and should match the pattern
 300        on the left-hand side of one of the configured branches or tags
 301        refspecs.  You can see these refspecs with the commands
 302+
 303        git config --get-all svn-remote.<name>.branches
 304        git config --get-all svn-remote.<name>.tags
 305+
 306where <name> is the name of the SVN repository as specified by the -R option to
 307'init' (or "svn" by default).
 308
 309--username;;
 310        Specify the SVN username to perform the commit as.  This option overrides
 311        the 'username' configuration property.
 312
 313--commit-url;;
 314        Use the specified URL to connect to the destination Subversion
 315        repository.  This is useful in cases where the source SVN
 316        repository is read-only.  This option overrides configuration
 317        property 'commiturl'.
 318+
 319        git config --get-all svn-remote.<name>.commiturl
 320+
 321
 322--parents;;
 323        Create parent folders. This parameter is equivalent to the parameter
 324        --parents on svn cp commands and is useful for non-standard repository
 325        layouts.
 326
 327'tag'::
 328        Create a tag in the SVN repository. This is a shorthand for
 329        'branch -t'.
 330
 331'log'::
 332        This should make it easy to look up svn log messages when svn
 333        users refer to -r/--revision numbers.
 334+
 335The following features from `svn log' are supported:
 336+
 337--
 338-r <n>[:<n>];;
 339--revision=<n>[:<n>];;
 340        is supported, non-numeric args are not:
 341        HEAD, NEXT, BASE, PREV, etc ...
 342-v;;
 343--verbose;;
 344        it's not completely compatible with the --verbose
 345        output in svn log, but reasonably close.
 346--limit=<n>;;
 347        is NOT the same as --max-count, doesn't count
 348        merged/excluded commits
 349--incremental;;
 350        supported
 351--
 352+
 353New features:
 354+
 355--
 356--show-commit;;
 357        shows the Git commit sha1, as well
 358--oneline;;
 359        our version of --pretty=oneline
 360--
 361+
 362NOTE: SVN itself only stores times in UTC and nothing else. The regular svn
 363client converts the UTC time to the local time (or based on the TZ=
 364environment). This command has the same behaviour.
 365+
 366Any other arguments are passed directly to 'git log'
 367
 368'blame'::
 369        Show what revision and author last modified each line of a file. The
 370        output of this mode is format-compatible with the output of
 371        `svn blame' by default. Like the SVN blame command,
 372        local uncommitted changes in the working tree are ignored;
 373        the version of the file in the HEAD revision is annotated. Unknown
 374        arguments are passed directly to 'git blame'.
 375+
 376--git-format;;
 377        Produce output in the same format as 'git blame', but with
 378        SVN revision numbers instead of Git commit hashes. In this mode,
 379        changes that haven't been committed to SVN (including local
 380        working-copy edits) are shown as revision 0.
 381
 382'find-rev'::
 383        When given an SVN revision number of the form 'rN', returns the
 384        corresponding Git commit hash (this can optionally be followed by a
 385        tree-ish to specify which branch should be searched).  When given a
 386        tree-ish, returns the corresponding SVN revision number.
 387+
 388--before;;
 389        Don't require an exact match if given an SVN revision, instead find
 390        the commit corresponding to the state of the SVN repository (on the
 391        current branch) at the specified revision.
 392+
 393--after;;
 394        Don't require an exact match if given an SVN revision; if there is
 395        not an exact match return the closest match searching forward in the
 396        history.
 397
 398'set-tree'::
 399        You should consider using 'dcommit' instead of this command.
 400        Commit specified commit or tree objects to SVN.  This relies on
 401        your imported fetch data being up-to-date.  This makes
 402        absolutely no attempts to do patching when committing to SVN, it
 403        simply overwrites files with those specified in the tree or
 404        commit.  All merging is assumed to have taken place
 405        independently of 'git svn' functions.
 406
 407'create-ignore'::
 408        Recursively finds the svn:ignore property on directories and
 409        creates matching .gitignore files. The resulting files are staged to
 410        be committed, but are not committed. Use -r/--revision to refer to a
 411        specific revision.
 412
 413'show-ignore'::
 414        Recursively finds and lists the svn:ignore property on
 415        directories.  The output is suitable for appending to
 416        the $GIT_DIR/info/exclude file.
 417
 418'mkdirs'::
 419        Attempts to recreate empty directories that core Git cannot track
 420        based on information in $GIT_DIR/svn/<refname>/unhandled.log files.
 421        Empty directories are automatically recreated when using
 422        "git svn clone" and "git svn rebase", so "mkdirs" is intended
 423        for use after commands like "git checkout" or "git reset".
 424        (See the svn-remote.<name>.automkdirs config file option for
 425        more information.)
 426
 427'commit-diff'::
 428        Commits the diff of two tree-ish arguments from the
 429        command-line.  This command does not rely on being inside an `git svn
 430        init`-ed repository.  This command takes three arguments, (a) the
 431        original tree to diff against, (b) the new tree result, (c) the
 432        URL of the target Subversion repository.  The final argument
 433        (URL) may be omitted if you are working from a 'git svn'-aware
 434        repository (that has been `init`-ed with 'git svn').
 435        The -r<revision> option is required for this.
 436
 437'info'::
 438        Shows information about a file or directory similar to what
 439        `svn info' provides.  Does not currently support a -r/--revision
 440        argument.  Use the --url option to output only the value of the
 441        'URL:' field.
 442
 443'proplist'::
 444        Lists the properties stored in the Subversion repository about a
 445        given file or directory.  Use -r/--revision to refer to a specific
 446        Subversion revision.
 447
 448'propget'::
 449        Gets the Subversion property given as the first argument, for a
 450        file.  A specific revision can be specified with -r/--revision.
 451
 452'show-externals'::
 453        Shows the Subversion externals.  Use -r/--revision to specify a
 454        specific revision.
 455
 456'gc'::
 457        Compress $GIT_DIR/svn/<refname>/unhandled.log files and remove
 458        $GIT_DIR/svn/<refname>/index files.
 459
 460'reset'::
 461        Undoes the effects of 'fetch' back to the specified revision.
 462        This allows you to re-'fetch' an SVN revision.  Normally the
 463        contents of an SVN revision should never change and 'reset'
 464        should not be necessary.  However, if SVN permissions change,
 465        or if you alter your --ignore-paths option, a 'fetch' may fail
 466        with "not found in commit" (file not previously visible) or
 467        "checksum mismatch" (missed a modification).  If the problem
 468        file cannot be ignored forever (with --ignore-paths) the only
 469        way to repair the repo is to use 'reset'.
 470+
 471Only the rev_map and refs/remotes/git-svn are changed (see
 472'$GIT_DIR/svn/\*\*/.rev_map.*' in the FILES section below for details).
 473Follow 'reset' with a 'fetch' and then 'git reset' or 'git rebase' to
 474move local branches onto the new tree.
 475
 476-r <n>;;
 477--revision=<n>;;
 478        Specify the most recent revision to keep.  All later revisions
 479        are discarded.
 480-p;;
 481--parent;;
 482        Discard the specified revision as well, keeping the nearest
 483        parent instead.
 484Example:;;
 485Assume you have local changes in "master", but you need to refetch "r2".
 486+
 487------------
 488    r1---r2---r3 remotes/git-svn
 489                \
 490                 A---B master
 491------------
 492+
 493Fix the ignore-paths or SVN permissions problem that caused "r2" to
 494be incomplete in the first place.  Then:
 495+
 496[verse]
 497git svn reset -r2 -p
 498git svn fetch
 499+
 500------------
 501    r1---r2'--r3' remotes/git-svn
 502      \
 503       r2---r3---A---B master
 504------------
 505+
 506Then fixup "master" with 'git rebase'.
 507Do NOT use 'git merge' or your history will not be compatible with a
 508future 'dcommit'!
 509+
 510[verse]
 511git rebase --onto remotes/git-svn A^ master
 512+
 513------------
 514    r1---r2'--r3' remotes/git-svn
 515                \
 516                 A'--B' master
 517------------
 518
 519OPTIONS
 520-------
 521
 522--shared[=(false|true|umask|group|all|world|everybody)]::
 523--template=<template_directory>::
 524        Only used with the 'init' command.
 525        These are passed directly to 'git init'.
 526
 527-r <arg>::
 528--revision <arg>::
 529           Used with the 'fetch' command.
 530+
 531This allows revision ranges for partial/cauterized history
 532to be supported.  $NUMBER, $NUMBER1:$NUMBER2 (numeric ranges),
 533$NUMBER:HEAD, and BASE:$NUMBER are all supported.
 534+
 535This can allow you to make partial mirrors when running fetch;
 536but is generally not recommended because history will be skipped
 537and lost.
 538
 539-::
 540--stdin::
 541        Only used with the 'set-tree' command.
 542+
 543Read a list of commits from stdin and commit them in reverse
 544order.  Only the leading sha1 is read from each line, so
 545'git rev-list --pretty=oneline' output can be used.
 546
 547--rmdir::
 548        Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
 549+
 550Remove directories from the SVN tree if there are no files left
 551behind.  SVN can version empty directories, and they are not
 552removed by default if there are no files left in them.  Git
 553cannot version empty directories.  Enabling this flag will make
 554the commit to SVN act like Git.
 555+
 556[verse]
 557config key: svn.rmdir
 558
 559-e::
 560--edit::
 561        Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
 562+
 563Edit the commit message before committing to SVN.  This is off by
 564default for objects that are commits, and forced on when committing
 565tree objects.
 566+
 567[verse]
 568config key: svn.edit
 569
 570-l<num>::
 571--find-copies-harder::
 572        Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
 573+
 574They are both passed directly to 'git diff-tree'; see
 575linkgit:git-diff-tree[1] for more information.
 576+
 577[verse]
 578config key: svn.l
 579config key: svn.findcopiesharder
 580
 581-A<filename>::
 582--authors-file=<filename>::
 583        Syntax is compatible with the file used by 'git cvsimport':
 584+
 585------------------------------------------------------------------------
 586        loginname = Joe User <user@example.com>
 587------------------------------------------------------------------------
 588+
 589If this option is specified and 'git svn' encounters an SVN
 590committer name that does not exist in the authors-file, 'git svn'
 591will abort operation. The user will then have to add the
 592appropriate entry.  Re-running the previous 'git svn' command
 593after the authors-file is modified should continue operation.
 594+
 595[verse]
 596config key: svn.authorsfile
 597
 598--authors-prog=<filename>::
 599        If this option is specified, for each SVN committer name that
 600        does not exist in the authors file, the given file is executed
 601        with the committer name as the first argument.  The program is
 602        expected to return a single line of the form "Name <email>",
 603        which will be treated as if included in the authors file.
 604
 605-q::
 606--quiet::
 607        Make 'git svn' less verbose. Specify a second time to make it
 608        even less verbose.
 609
 610--repack[=<n>]::
 611--repack-flags=<flags>::
 612        These should help keep disk usage sane for large fetches with
 613        many revisions.
 614+
 615--repack takes an optional argument for the number of revisions
 616to fetch before repacking.  This defaults to repacking every
 6171000 commits fetched if no argument is specified.
 618+
 619--repack-flags are passed directly to 'git repack'.
 620+
 621[verse]
 622config key: svn.repack
 623config key: svn.repackflags
 624
 625-m::
 626--merge::
 627-s<strategy>::
 628--strategy=<strategy>::
 629-p::
 630--preserve-merges::
 631        These are only used with the 'dcommit' and 'rebase' commands.
 632+
 633Passed directly to 'git rebase' when using 'dcommit' if a
 634'git reset' cannot be used (see 'dcommit').
 635
 636-n::
 637--dry-run::
 638        This can be used with the 'dcommit', 'rebase', 'branch' and
 639        'tag' commands.
 640+
 641For 'dcommit', print out the series of Git arguments that would show
 642which diffs would be committed to SVN.
 643+
 644For 'rebase', display the local branch associated with the upstream svn
 645repository associated with the current branch and the URL of svn
 646repository that will be fetched from.
 647+
 648For 'branch' and 'tag', display the urls that will be used for copying when
 649creating the branch or tag.
 650
 651--use-log-author::
 652        When retrieving svn commits into Git (as part of 'fetch', 'rebase', or
 653        'dcommit' operations), look for the first `From:` or `Signed-off-by:` line
 654        in the log message and use that as the author string.
 655--add-author-from::
 656        When committing to svn from Git (as part of 'commit-diff', 'set-tree' or 'dcommit'
 657        operations), if the existing log message doesn't already have a
 658        `From:` or `Signed-off-by:` line, append a `From:` line based on the
 659        Git commit's author string.  If you use this, then `--use-log-author`
 660        will retrieve a valid author string for all commits.
 661
 662
 663ADVANCED OPTIONS
 664----------------
 665
 666-i<GIT_SVN_ID>::
 667--id <GIT_SVN_ID>::
 668        This sets GIT_SVN_ID (instead of using the environment).  This
 669        allows the user to override the default refname to fetch from
 670        when tracking a single URL.  The 'log' and 'dcommit' commands
 671        no longer require this switch as an argument.
 672
 673-R<remote name>::
 674--svn-remote <remote name>::
 675        Specify the [svn-remote "<remote name>"] section to use,
 676        this allows SVN multiple repositories to be tracked.
 677        Default: "svn"
 678
 679--follow-parent::
 680        This option is only relevant if we are tracking branches (using
 681        one of the repository layout options --trunk, --tags,
 682        --branches, --stdlayout). For each tracked branch, try to find
 683        out where its revision was copied from, and set
 684        a suitable parent in the first Git commit for the branch.
 685        This is especially helpful when we're tracking a directory
 686        that has been moved around within the repository.  If this
 687        feature is disabled, the branches created by 'git svn' will all
 688        be linear and not share any history, meaning that there will be
 689        no information on where branches were branched off or merged.
 690        However, following long/convoluted histories can take a long
 691        time, so disabling this feature may speed up the cloning
 692        process. This feature is enabled by default, use
 693        --no-follow-parent to disable it.
 694+
 695[verse]
 696config key: svn.followparent
 697
 698CONFIG FILE-ONLY OPTIONS
 699------------------------
 700
 701svn.noMetadata::
 702svn-remote.<name>.noMetadata::
 703        This gets rid of the 'git-svn-id:' lines at the end of every commit.
 704+
 705This option can only be used for one-shot imports as 'git svn'
 706will not be able to fetch again without metadata. Additionally,
 707if you lose your '$GIT_DIR/svn/\*\*/.rev_map.*' files, 'git svn' will not
 708be able to rebuild them.
 709+
 710The 'git svn log' command will not work on repositories using
 711this, either.  Using this conflicts with the 'useSvmProps'
 712option for (hopefully) obvious reasons.
 713+
 714This option is NOT recommended as it makes it difficult to track down
 715old references to SVN revision numbers in existing documentation, bug
 716reports and archives.  If you plan to eventually migrate from SVN to Git
 717and are certain about dropping SVN history, consider
 718linkgit:git-filter-branch[1] instead.  filter-branch also allows
 719reformatting of metadata for ease-of-reading and rewriting authorship
 720info for non-"svn.authorsFile" users.
 721
 722svn.useSvmProps::
 723svn-remote.<name>.useSvmProps::
 724        This allows 'git svn' to re-map repository URLs and UUIDs from
 725        mirrors created using SVN::Mirror (or svk) for metadata.
 726+
 727If an SVN revision has a property, "svm:headrev", it is likely
 728that the revision was created by SVN::Mirror (also used by SVK).
 729The property contains a repository UUID and a revision.  We want
 730to make it look like we are mirroring the original URL, so
 731introduce a helper function that returns the original identity
 732URL and UUID, and use it when generating metadata in commit
 733messages.
 734
 735svn.useSvnsyncProps::
 736svn-remote.<name>.useSvnsyncprops::
 737        Similar to the useSvmProps option; this is for users
 738        of the svnsync(1) command distributed with SVN 1.4.x and
 739        later.
 740
 741svn-remote.<name>.rewriteRoot::
 742        This allows users to create repositories from alternate
 743        URLs.  For example, an administrator could run 'git svn' on the
 744        server locally (accessing via file://) but wish to distribute
 745        the repository with a public http:// or svn:// URL in the
 746        metadata so users of it will see the public URL.
 747
 748svn-remote.<name>.rewriteUUID::
 749        Similar to the useSvmProps option; this is for users who need
 750        to remap the UUID manually. This may be useful in situations
 751        where the original UUID is not available via either useSvmProps
 752        or useSvnsyncProps.
 753
 754svn-remote.<name>.pushurl::
 755
 756        Similar to Git's 'remote.<name>.pushurl', this key is designed
 757        to be used in cases where 'url' points to an SVN repository
 758        via a read-only transport, to provide an alternate read/write
 759        transport. It is assumed that both keys point to the same
 760        repository. Unlike 'commiturl', 'pushurl' is a base path. If
 761        either 'commiturl' or 'pushurl' could be used, 'commiturl'
 762        takes precedence.
 763
 764svn.brokenSymlinkWorkaround::
 765        This disables potentially expensive checks to workaround
 766        broken symlinks checked into SVN by broken clients.  Set this
 767        option to "false" if you track a SVN repository with many
 768        empty blobs that are not symlinks.  This option may be changed
 769        while 'git svn' is running and take effect on the next
 770        revision fetched.  If unset, 'git svn' assumes this option to
 771        be "true".
 772
 773svn.pathnameencoding::
 774        This instructs git svn to recode pathnames to a given encoding.
 775        It can be used by windows users and by those who work in non-utf8
 776        locales to avoid corrupted file names with non-ASCII characters.
 777        Valid encodings are the ones supported by Perl's Encode module.
 778
 779svn-remote.<name>.automkdirs::
 780        Normally, the "git svn clone" and "git svn rebase" commands
 781        attempt to recreate empty directories that are in the
 782        Subversion repository.  If this option is set to "false", then
 783        empty directories will only be created if the "git svn mkdirs"
 784        command is run explicitly.  If unset, 'git svn' assumes this
 785        option to be "true".
 786
 787Since the noMetadata, rewriteRoot, rewriteUUID, useSvnsyncProps and useSvmProps
 788options all affect the metadata generated and used by 'git svn'; they
 789*must* be set in the configuration file before any history is imported
 790and these settings should never be changed once they are set.
 791
 792Additionally, only one of these options can be used per svn-remote
 793section because they affect the 'git-svn-id:' metadata line, except
 794for rewriteRoot and rewriteUUID which can be used together.
 795
 796
 797BASIC EXAMPLES
 798--------------
 799
 800Tracking and contributing to the trunk of a Subversion-managed project
 801(ignoring tags and branches):
 802
 803------------------------------------------------------------------------
 804# Clone a repo (like git clone):
 805        git svn clone http://svn.example.com/project/trunk
 806# Enter the newly cloned directory:
 807        cd trunk
 808# You should be on master branch, double-check with 'git branch'
 809        git branch
 810# Do some work and commit locally to Git:
 811        git commit ...
 812# Something is committed to SVN, rebase your local changes against the
 813# latest changes in SVN:
 814        git svn rebase
 815# Now commit your changes (that were committed previously using Git) to SVN,
 816# as well as automatically updating your working HEAD:
 817        git svn dcommit
 818# Append svn:ignore settings to the default Git exclude file:
 819        git svn show-ignore >> .git/info/exclude
 820------------------------------------------------------------------------
 821
 822Tracking and contributing to an entire Subversion-managed project
 823(complete with a trunk, tags and branches):
 824
 825------------------------------------------------------------------------
 826# Clone a repo with standard SVN directory layout (like git clone):
 827        git svn clone http://svn.example.com/project --stdlayout --prefix svn/
 828# Or, if the repo uses a non-standard directory layout:
 829        git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
 830# View all branches and tags you have cloned:
 831        git branch -r
 832# Create a new branch in SVN
 833        git svn branch waldo
 834# Reset your master to trunk (or any other branch, replacing 'trunk'
 835# with the appropriate name):
 836        git reset --hard svn/trunk
 837# You may only dcommit to one branch/tag/trunk at a time.  The usage
 838# of dcommit/rebase/show-ignore should be the same as above.
 839------------------------------------------------------------------------
 840
 841The initial 'git svn clone' can be quite time-consuming
 842(especially for large Subversion repositories). If multiple
 843people (or one person with multiple machines) want to use
 844'git svn' to interact with the same Subversion repository, you can
 845do the initial 'git svn clone' to a repository on a server and
 846have each person clone that repository with 'git clone':
 847
 848------------------------------------------------------------------------
 849# Do the initial import on a server
 850        ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
 851# Clone locally - make sure the refs/remotes/ space matches the server
 852        mkdir project
 853        cd project
 854        git init
 855        git remote add origin server:/pub/project
 856        git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
 857        git fetch
 858# Prevent fetch/pull from remote Git server in the future,
 859# we only want to use git svn for future updates
 860        git config --remove-section remote.origin
 861# Create a local branch from one of the branches just fetched
 862        git checkout -b master FETCH_HEAD
 863# Initialize 'git svn' locally (be sure to use the same URL and
 864# --stdlayout/-T/-b/-t/--prefix options as were used on server)
 865        git svn init http://svn.example.com/project [options...]
 866# Pull the latest changes from Subversion
 867        git svn rebase
 868------------------------------------------------------------------------
 869
 870REBASE VS. PULL/MERGE
 871---------------------
 872Prefer to use 'git svn rebase' or 'git rebase', rather than
 873'git pull' or 'git merge' to synchronize unintegrated commits with a 'git svn'
 874branch. Doing so will keep the history of unintegrated commits linear with
 875respect to the upstream SVN repository and allow the use of the preferred
 876'git svn dcommit' subcommand to push unintegrated commits back into SVN.
 877
 878Originally, 'git svn' recommended that developers pulled or merged from
 879the 'git svn' branch.  This was because the author favored
 880`git svn set-tree B` to commit a single head rather than the
 881`git svn set-tree A..B` notation to commit multiple commits. Use of
 882'git pull' or 'git merge' with `git svn set-tree A..B` will cause non-linear
 883history to be flattened when committing into SVN and this can lead to merge
 884commits unexpectedly reversing previous commits in SVN.
 885
 886MERGE TRACKING
 887--------------
 888While 'git svn' can track
 889copy history (including branches and tags) for repositories adopting a
 890standard layout, it cannot yet represent merge history that happened
 891inside git back upstream to SVN users.  Therefore it is advised that
 892users keep history as linear as possible inside Git to ease
 893compatibility with SVN (see the CAVEATS section below).
 894
 895HANDLING OF SVN BRANCHES
 896------------------------
 897If 'git svn' is configured to fetch branches (and --follow-branches
 898is in effect), it sometimes creates multiple Git branches for one
 899SVN branch, where the additional branches have names of the form
 900'branchname@nnn' (with nnn an SVN revision number).  These additional
 901branches are created if 'git svn' cannot find a parent commit for the
 902first commit in an SVN branch, to connect the branch to the history of
 903the other branches.
 904
 905Normally, the first commit in an SVN branch consists
 906of a copy operation. 'git svn' will read this commit to get the SVN
 907revision the branch was created from. It will then try to find the
 908Git commit that corresponds to this SVN revision, and use that as the
 909parent of the branch. However, it is possible that there is no suitable
 910Git commit to serve as parent.  This will happen, among other reasons,
 911if the SVN branch is a copy of a revision that was not fetched by 'git
 912svn' (e.g. because it is an old revision that was skipped with
 913'--revision'), or if in SVN a directory was copied that is not tracked
 914by 'git svn' (such as a branch that is not tracked at all, or a
 915subdirectory of a tracked branch). In these cases, 'git svn' will still
 916create a Git branch, but instead of using an existing Git commit as the
 917parent of the branch, it will read the SVN history of the directory the
 918branch was copied from and create appropriate Git commits.  This is
 919indicated by the message "Initializing parent: <branchname>".
 920
 921Additionally, it will create a special branch named
 922'<branchname>@<SVN-Revision>', where <SVN-Revision> is the SVN revision
 923number the branch was copied from.  This branch will point to the newly
 924created parent commit of the branch.  If in SVN the branch was deleted
 925and later recreated from a different version, there will be multiple
 926such branches with an '@'.
 927
 928Note that this may mean that multiple Git commits are created for a
 929single SVN revision.
 930
 931An example: in an SVN repository with a standard
 932trunk/tags/branches layout, a directory trunk/sub is created in r.100.
 933In r.200, trunk/sub is branched by copying it to branches/. 'git svn
 934clone -s' will then create a branch 'sub'. It will also create new Git
 935commits for r.100 through r.199 and use these as the history of branch
 936'sub'. Thus there will be two Git commits for each revision from r.100
 937to r.199 (one containing trunk/, one containing trunk/sub/). Finally,
 938it will create a branch 'sub@200' pointing to the new parent commit of
 939branch 'sub' (i.e. the commit for r.200 and trunk/sub/).
 940
 941CAVEATS
 942-------
 943
 944For the sake of simplicity and interoperating with Subversion,
 945it is recommended that all 'git svn' users clone, fetch and dcommit
 946directly from the SVN server, and avoid all 'git clone'/'pull'/'merge'/'push'
 947operations between Git repositories and branches.  The recommended
 948method of exchanging code between Git branches and users is
 949'git format-patch' and 'git am', or just 'dcommit'ing to the SVN repository.
 950
 951Running 'git merge' or 'git pull' is NOT recommended on a branch you
 952plan to 'dcommit' from because Subversion users cannot see any
 953merges you've made.  Furthermore, if you merge or pull from a Git branch
 954that is a mirror of an SVN branch, 'dcommit' may commit to the wrong
 955branch.
 956
 957If you do merge, note the following rule: 'git svn dcommit' will
 958attempt to commit on top of the SVN commit named in
 959------------------------------------------------------------------------
 960git log --grep=^git-svn-id: --first-parent -1
 961------------------------------------------------------------------------
 962You 'must' therefore ensure that the most recent commit of the branch
 963you want to dcommit to is the 'first' parent of the merge.  Chaos will
 964ensue otherwise, especially if the first parent is an older commit on
 965the same SVN branch.
 966
 967'git clone' does not clone branches under the refs/remotes/ hierarchy or
 968any 'git svn' metadata, or config.  So repositories created and managed with
 969using 'git svn' should use 'rsync' for cloning, if cloning is to be done
 970at all.
 971
 972Since 'dcommit' uses rebase internally, any Git branches you 'git push' to
 973before 'dcommit' on will require forcing an overwrite of the existing ref
 974on the remote repository.  This is generally considered bad practice,
 975see the linkgit:git-push[1] documentation for details.
 976
 977Do not use the --amend option of linkgit:git-commit[1] on a change you've
 978already dcommitted.  It is considered bad practice to --amend commits
 979you've already pushed to a remote repository for other users, and
 980dcommit with SVN is analogous to that.
 981
 982When cloning an SVN repository, if none of the options for describing
 983the repository layout is used (--trunk, --tags, --branches,
 984--stdlayout), 'git svn clone' will create a Git repository with
 985completely linear history, where branches and tags appear as separate
 986directories in the working copy.  While this is the easiest way to get a
 987copy of a complete repository, for projects with many branches it will
 988lead to a working copy many times larger than just the trunk. Thus for
 989projects using the standard directory structure (trunk/branches/tags),
 990it is recommended to clone with option '--stdlayout'. If the project
 991uses a non-standard structure, and/or if branches and tags are not
 992required, it is easiest to only clone one directory (typically trunk),
 993without giving any repository layout options.  If the full history with
 994branches and tags is required, the options '--trunk' / '--branches' /
 995'--tags' must be used.
 996
 997When using the options for describing the repository layout (--trunk,
 998--tags, --branches, --stdlayout), please also specify the --prefix
 999option (e.g. '--prefix=origin/') to cause your SVN-tracking refs to be
1000placed at refs/remotes/origin/* rather than the default refs/remotes/*.
1001The former is more compatible with the layout of Git's "regular"
1002remote-tracking refs (refs/remotes/$remote/*), and may potentially
1003prevent similarly named SVN branches and Git remotes from clobbering
1004each other. In Git v2.0 the default prefix used (i.e. when no --prefix
1005is given) will change from "" (no prefix) to "origin/".
1006
1007When using multiple --branches or --tags, 'git svn' does not automatically
1008handle name collisions (for example, if two branches from different paths have
1009the same name, or if a branch and a tag have the same name).  In these cases,
1010use 'init' to set up your Git repository then, before your first 'fetch', edit
1011the $GIT_DIR/config file so that the branches and tags are associated
1012with different name spaces.  For example:
1013
1014        branches = stable/*:refs/remotes/svn/stable/*
1015        branches = debug/*:refs/remotes/svn/debug/*
1016
1017BUGS
1018----
1019
1020We ignore all SVN properties except svn:executable.  Any unhandled
1021properties are logged to $GIT_DIR/svn/<refname>/unhandled.log
1022
1023Renamed and copied directories are not detected by Git and hence not
1024tracked when committing to SVN.  I do not plan on adding support for
1025this as it's quite difficult and time-consuming to get working for all
1026the possible corner cases (Git doesn't do it, either).  Committing
1027renamed and copied files is fully supported if they're similar enough
1028for Git to detect them.
1029
1030In SVN, it is possible (though discouraged) to commit changes to a tag
1031(because a tag is just a directory copy, thus technically the same as a
1032branch). When cloning an SVN repository, 'git svn' cannot know if such a
1033commit to a tag will happen in the future. Thus it acts conservatively
1034and imports all SVN tags as branches, prefixing the tag name with 'tags/'.
1035
1036CONFIGURATION
1037-------------
1038
1039'git svn' stores [svn-remote] configuration information in the
1040repository $GIT_DIR/config file.  It is similar the core Git
1041[remote] sections except 'fetch' keys do not accept glob
1042arguments; but they are instead handled by the 'branches'
1043and 'tags' keys.  Since some SVN repositories are oddly
1044configured with multiple projects glob expansions such those
1045listed below are allowed:
1046
1047------------------------------------------------------------------------
1048[svn-remote "project-a"]
1049        url = http://server.org/svn
1050        fetch = trunk/project-a:refs/remotes/project-a/trunk
1051        branches = branches/*/project-a:refs/remotes/project-a/branches/*
1052        tags = tags/*/project-a:refs/remotes/project-a/tags/*
1053------------------------------------------------------------------------
1054
1055Keep in mind that the '\*' (asterisk) wildcard of the local ref
1056(right of the ':') *must* be the farthest right path component;
1057however the remote wildcard may be anywhere as long as it's an
1058independent path component (surrounded by '/' or EOL).   This
1059type of configuration is not automatically created by 'init' and
1060should be manually entered with a text-editor or using 'git config'.
1061
1062It is also possible to fetch a subset of branches or tags by using a
1063comma-separated list of names within braces. For example:
1064
1065------------------------------------------------------------------------
1066[svn-remote "huge-project"]
1067        url = http://server.org/svn
1068        fetch = trunk/src:refs/remotes/trunk
1069        branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
1070        tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*
1071------------------------------------------------------------------------
1072
1073Multiple fetch, branches, and tags keys are supported:
1074
1075------------------------------------------------------------------------
1076[svn-remote "messy-repo"]
1077        url = http://server.org/svn
1078        fetch = trunk/project-a:refs/remotes/project-a/trunk
1079        fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
1080        branches = branches/server/*:refs/remotes/project-a/branches/*
1081        branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
1082        tags = tags/server/*:refs/remotes/project-a/tags/*
1083------------------------------------------------------------------------
1084
1085Creating a branch in such a configuration requires disambiguating which
1086location to use using the -d or --destination flag:
1087
1088------------------------------------------------------------------------
1089$ git svn branch -d branches/server release-2-3-0
1090------------------------------------------------------------------------
1091
1092Note that git-svn keeps track of the highest revision in which a branch
1093or tag has appeared. If the subset of branches or tags is changed after
1094fetching, then $GIT_DIR/svn/.metadata must be manually edited to remove
1095(or reset) branches-maxRev and/or tags-maxRev as appropriate.
1096
1097FILES
1098-----
1099$GIT_DIR/svn/\*\*/.rev_map.*::
1100        Mapping between Subversion revision numbers and Git commit
1101        names.  In a repository where the noMetadata option is not set,
1102        this can be rebuilt from the git-svn-id: lines that are at the
1103        end of every commit (see the 'svn.noMetadata' section above for
1104        details).
1105+
1106'git svn fetch' and 'git svn rebase' automatically update the rev_map
1107if it is missing or not up to date.  'git svn reset' automatically
1108rewinds it.
1109
1110SEE ALSO
1111--------
1112linkgit:git-rebase[1]
1113
1114GIT
1115---
1116Part of the linkgit:git[1] suite