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