Documentation / git-svn.txton commit Add 'git svn reset' to unwind 'git svn fetch' (195643f)
   1git-svn(1)
   2==========
   3
   4NAME
   5----
   6git-svn - Bidirectional operation between a single Subversion branch and git
   7
   8SYNOPSIS
   9--------
  10'git svn' <command> [options] [arguments]
  11
  12DESCRIPTION
  13-----------
  14'git-svn' is a simple conduit for changesets between Subversion and git.
  15It provides a bidirectional flow of changes between a Subversion and a git
  16repository.
  17
  18'git-svn' can track a single Subversion branch simply by using a
  19URL to the branch, follow branches laid out in the Subversion recommended
  20method (trunk, branches, tags directories) with the --stdlayout option, or
  21follow branches in any layout with the -T/-t/-b options (see options to
  22'init' below, and also the 'clone' command).
  23
  24Once tracking a Subversion branch (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
  32'init'::
  33        Initializes an empty git repository with additional
  34        metadata directories for 'git-svn'.  The Subversion URL
  35        may be specified as a command-line argument, or as full
  36        URL arguments to -T/-t/-b.  Optionally, the target
  37        directory to operate on can be specified as a second
  38        argument.  Normally this command initializes the current
  39        directory.
  40
  41-T<trunk_subdir>;;
  42--trunk=<trunk_subdir>;;
  43-t<tags_subdir>;;
  44--tags=<tags_subdir>;;
  45-b<branches_subdir>;;
  46--branches=<branches_subdir>;;
  47-s;;
  48--stdlayout;;
  49        These are optional command-line options for init.  Each of
  50        these flags can point to a relative repository path
  51        (--tags=project/tags') or a full url
  52        (--tags=https://foo.org/project/tags). The option --stdlayout is
  53        a shorthand way of setting trunk,tags,branches as the relative paths,
  54        which is the Subversion default. If any of the other options are given
  55        as well, they take precedence.
  56--no-metadata;;
  57        Set the 'noMetadata' option in the [svn-remote] config.
  58--use-svm-props;;
  59        Set the 'useSvmProps' option in the [svn-remote] config.
  60--use-svnsync-props;;
  61        Set the 'useSvnsyncProps' option in the [svn-remote] config.
  62--rewrite-root=<URL>;;
  63        Set the 'rewriteRoot' option in the [svn-remote] config.
  64--use-log-author;;
  65        When retrieving svn commits into git (as part of fetch, rebase, or
  66        dcommit operations), look for the first From: or Signed-off-by: line
  67        in the log message and use that as the author string.
  68--add-author-from;;
  69        When committing to svn from git (as part of commit or dcommit
  70        operations), if the existing log message doesn't already have a
  71        From: or Signed-off-by: line, append a From: line based on the
  72        git commit's author string.  If you use this, then --use-log-author
  73        will retrieve a valid author string for all commits.
  74--username=<USER>;;
  75        For transports that SVN handles authentication for (http,
  76        https, and plain svn), specify the username.  For other
  77        transports (eg svn+ssh://), you must include the username in
  78        the URL, eg svn+ssh://foo@svn.bar.com/project
  79--prefix=<prefix>;;
  80        This allows one to specify a prefix which is prepended
  81        to the names of remotes if trunk/branches/tags are
  82        specified.  The prefix does not automatically include a
  83        trailing slash, so be sure you include one in the
  84        argument if that is what you want.  If --branches/-b is
  85        specified, the prefix must include a trailing slash.
  86        Setting a prefix is useful if you wish to track multiple
  87        projects that share a common repository.
  88--ignore-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 '--ignore-paths'.
  92
  93'fetch'::
  94        Fetch unfetched revisions from the Subversion remote we are
  95        tracking.  The name of the [svn-remote "..."] section in the
  96        .git/config file may be specified as an optional command-line
  97        argument.
  98
  99--localtime;;
 100        Store Git commit times in the local timezone instead of UTC.  This
 101        makes 'git-log' (even without --date=local) show the same times
 102        that `svn log` would in the local timezone.
 103
 104--parent;;
 105        Fetch only from the SVN parent of the current HEAD.
 106
 107This doesn't interfere with interoperating with the Subversion
 108repository you cloned from, but if you wish for your local Git
 109repository to be able to interoperate with someone else's local Git
 110repository, either don't use this option or you should both use it in
 111the same local timezone.
 112
 113--ignore-paths=<regex>;;
 114        This allows one to specify a Perl regular expression that will
 115        cause skipping of all matching paths from checkout from SVN.
 116        The '--ignore-paths' option should match for every 'fetch'
 117        (including automatic fetches due to 'clone', 'dcommit',
 118        'rebase', etc) on a given repository.
 119
 120config key: svn-remote.<name>.ignore-paths
 121
 122        If the ignore-paths config key is set and the command
 123        line option is also given, both regular expressions
 124        will be used.
 125
 126Examples:
 127
 128        --ignore-paths="^doc" - skip "doc*" directory for every
 129            fetch.
 130
 131        --ignore-paths="^[^/]+/(?:branches|tags)" - skip
 132            "branches" and "tags" of first level directories.
 133
 134'clone'::
 135        Runs 'init' and 'fetch'.  It will automatically create a
 136        directory based on the basename of the URL passed to it;
 137        or if a second argument is passed; it will create a directory
 138        and work within that.  It accepts all arguments that the
 139        'init' and 'fetch' commands accept; with the exception of
 140        '--fetch-all'.   After a repository is cloned, the 'fetch'
 141        command will be able to update revisions without affecting
 142        the working tree; and the 'rebase' command will be able
 143        to update the working tree with the latest changes.
 144
 145'rebase'::
 146        This fetches revisions from the SVN parent of the current HEAD
 147        and rebases the current (uncommitted to SVN) work against it.
 148
 149This works similarly to `svn update` or 'git-pull' except that
 150it preserves linear history with 'git-rebase' instead of
 151'git-merge' for ease of dcommitting with 'git-svn'.
 152
 153This accepts all options that 'git-svn fetch' and 'git-rebase'
 154accept.  However, '--fetch-all' only fetches from the current
 155[svn-remote], and not all [svn-remote] definitions.
 156
 157Like 'git-rebase'; this requires that the working tree be clean
 158and have no uncommitted changes.
 159
 160-l;;
 161--local;;
 162        Do not fetch remotely; only run 'git-rebase' against the
 163        last fetched commit from the upstream SVN.
 164
 165'dcommit'::
 166        Commit each diff from a specified head directly to the SVN
 167        repository, and then rebase or reset (depending on whether or
 168        not there is a diff between SVN and head).  This will create
 169        a revision in SVN for each commit in git.
 170        It is recommended that you run 'git-svn' fetch and rebase (not
 171        pull or merge) your commits against the latest changes in the
 172        SVN repository.
 173        An optional revision or branch argument may be specified, and
 174        causes 'git-svn' to do all work on that revision/branch
 175        instead of HEAD.
 176        This is advantageous over 'set-tree' (below) because it produces
 177        cleaner, more linear history.
 178+
 179--no-rebase;;
 180        After committing, do not rebase or reset.
 181--commit-url <URL>;;
 182        Commit to this SVN URL (the full path).  This is intended to
 183        allow existing git-svn repositories created with one transport
 184        method (e.g. `svn://` or `http://` for anonymous read) to be
 185        reused if a user is later given access to an alternate transport
 186        method (e.g. `svn+ssh://` or `https://`) for commit.
 187
 188config key: svn-remote.<name>.commiturl
 189
 190config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)
 191
 192        Using this option for any other purpose (don't ask)
 193        is very strongly discouraged.
 194--
 195
 196'branch'::
 197        Create a branch in the SVN repository.
 198
 199-m;;
 200--message;;
 201        Allows to specify the commit message.
 202
 203-t;;
 204--tag;;
 205        Create a tag by using the tags_subdir instead of the branches_subdir
 206        specified during git svn init.
 207
 208'tag'::
 209        Create a tag in the SVN repository. This is a shorthand for
 210        'branch -t'.
 211
 212'log'::
 213        This should make it easy to look up svn log messages when svn
 214        users refer to -r/--revision numbers.
 215+
 216The following features from `svn log' are supported:
 217+
 218--
 219-r/--revision=<n>[:<n>];;
 220        is supported, non-numeric args are not:
 221        HEAD, NEXT, BASE, PREV, etc ...
 222-v/--verbose;;
 223        it's not completely compatible with the --verbose
 224        output in svn log, but reasonably close.
 225--limit=<n>;;
 226        is NOT the same as --max-count, doesn't count
 227        merged/excluded commits
 228--incremental;;
 229        supported
 230--
 231+
 232New features:
 233+
 234--
 235--show-commit;;
 236        shows the git commit sha1, as well
 237--oneline;;
 238        our version of --pretty=oneline
 239--
 240+
 241NOTE: SVN itself only stores times in UTC and nothing else. The regular svn
 242client converts the UTC time to the local time (or based on the TZ=
 243environment). This command has the same behaviour.
 244+
 245Any other arguments are passed directly to 'git-log'
 246
 247'blame'::
 248       Show what revision and author last modified each line of a file. The
 249       output of this mode is format-compatible with the output of
 250       `svn blame' by default. Like the SVN blame command,
 251       local uncommitted changes in the working copy are ignored;
 252       the version of the file in the HEAD revision is annotated. Unknown
 253       arguments are passed directly to 'git-blame'.
 254+
 255--git-format;;
 256        Produce output in the same format as 'git-blame', but with
 257        SVN revision numbers instead of git commit hashes. In this mode,
 258        changes that haven't been committed to SVN (including local
 259        working-copy edits) are shown as revision 0.
 260
 261--
 262'find-rev'::
 263        When given an SVN revision number of the form 'rN', returns the
 264        corresponding git commit hash (this can optionally be followed by a
 265        tree-ish to specify which branch should be searched).  When given a
 266        tree-ish, returns the corresponding SVN revision number.
 267
 268'set-tree'::
 269        You should consider using 'dcommit' instead of this command.
 270        Commit specified commit or tree objects to SVN.  This relies on
 271        your imported fetch data being up-to-date.  This makes
 272        absolutely no attempts to do patching when committing to SVN, it
 273        simply overwrites files with those specified in the tree or
 274        commit.  All merging is assumed to have taken place
 275        independently of 'git-svn' functions.
 276
 277'create-ignore'::
 278        Recursively finds the svn:ignore property on directories and
 279        creates matching .gitignore files. The resulting files are staged to
 280        be committed, but are not committed. Use -r/--revision to refer to a
 281        specific revision.
 282
 283'show-ignore'::
 284        Recursively finds and lists the svn:ignore property on
 285        directories.  The output is suitable for appending to
 286        the $GIT_DIR/info/exclude file.
 287
 288'commit-diff'::
 289        Commits the diff of two tree-ish arguments from the
 290        command-line.  This command does not rely on being inside an `git-svn
 291        init`-ed repository.  This command takes three arguments, (a) the
 292        original tree to diff against, (b) the new tree result, (c) the
 293        URL of the target Subversion repository.  The final argument
 294        (URL) may be omitted if you are working from a 'git-svn'-aware
 295        repository (that has been `init`-ed with 'git-svn').
 296        The -r<revision> option is required for this.
 297
 298'info'::
 299        Shows information about a file or directory similar to what
 300        `svn info' provides.  Does not currently support a -r/--revision
 301        argument.  Use the --url option to output only the value of the
 302        'URL:' field.
 303
 304'proplist'::
 305        Lists the properties stored in the Subversion repository about a
 306        given file or directory.  Use -r/--revision to refer to a specific
 307        Subversion revision.
 308
 309'propget'::
 310        Gets the Subversion property given as the first argument, for a
 311        file.  A specific revision can be specified with -r/--revision.
 312
 313'show-externals'::
 314        Shows the Subversion externals.  Use -r/--revision to specify a
 315        specific revision.
 316
 317'reset'::
 318        Undoes the effects of 'fetch' back to the specified revision.
 319        This allows you to re-'fetch' an SVN revision.  Normally the
 320        contents of an SVN revision should never change and 'reset'
 321        should not be necessary.  However, if SVN permissions change,
 322        or if you alter your --ignore-paths option, a 'fetch' may fail
 323        with "not found in commit" (file not previously visible) or
 324        "checksum mismatch" (missed a modification).  If the problem
 325        file cannot be ignored forever (with --ignore-paths) the only
 326        way to repair the repo is to use 'reset'.
 327
 328Only the rev_map and refs/remotes/git-svn are changed.  Follow 'reset'
 329with a 'fetch' and then 'git-reset' or 'git-rebase' to move local
 330branches onto the new tree.
 331
 332-r/--revision=<n>;;
 333        Specify the most recent revision to keep.  All later revisions
 334        are discarded.
 335-p/--parent;;
 336        Discard the specified revision as well, keeping the nearest
 337        parent instead.
 338Example:;;
 339Assume you have local changes in "master", but you need to refetch "r2".
 340
 341------------
 342    r1---r2---r3 remotes/git-svn
 343                \
 344                 A---B master
 345------------
 346
 347Fix the ignore-paths or SVN permissions problem that caused "r2" to
 348be incomplete in the first place.  Then:
 349
 350[verse]
 351git svn reset -r2 -p
 352git svn fetch
 353
 354------------
 355    r1---r2'--r3' remotes/git-svn
 356      \
 357       r2---r3---A---B master
 358------------
 359
 360Then fixup "master" with 'git-rebase'.
 361Do NOT use 'git-merge' or your history will not be compatible with a
 362future 'dcommit'!
 363
 364[verse]
 365git rebase --onto remotes/git-svn A^ master
 366
 367------------
 368    r1---r2'--r3' remotes/git-svn
 369                \
 370                 A'--B' master
 371------------
 372
 373
 374--
 375
 376OPTIONS
 377-------
 378--
 379
 380--shared[={false|true|umask|group|all|world|everybody}]::
 381--template=<template_directory>::
 382        Only used with the 'init' command.
 383        These are passed directly to 'git-init'.
 384
 385-r <ARG>::
 386--revision <ARG>::
 387
 388Used with the 'fetch' command.
 389
 390This allows revision ranges for partial/cauterized history
 391to be supported.  $NUMBER, $NUMBER1:$NUMBER2 (numeric ranges),
 392$NUMBER:HEAD, and BASE:$NUMBER are all supported.
 393
 394This can allow you to make partial mirrors when running fetch;
 395but is generally not recommended because history will be skipped
 396and lost.
 397
 398-::
 399--stdin::
 400
 401Only used with the 'set-tree' command.
 402
 403Read a list of commits from stdin and commit them in reverse
 404order.  Only the leading sha1 is read from each line, so
 405'git-rev-list --pretty=oneline' output can be used.
 406
 407--rmdir::
 408
 409Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
 410
 411Remove directories from the SVN tree if there are no files left
 412behind.  SVN can version empty directories, and they are not
 413removed by default if there are no files left in them.  git
 414cannot version empty directories.  Enabling this flag will make
 415the commit to SVN act like git.
 416
 417config key: svn.rmdir
 418
 419-e::
 420--edit::
 421
 422Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
 423
 424Edit the commit message before committing to SVN.  This is off by
 425default for objects that are commits, and forced on when committing
 426tree objects.
 427
 428config key: svn.edit
 429
 430-l<num>::
 431--find-copies-harder::
 432
 433Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands.
 434
 435They are both passed directly to 'git-diff-tree'; see
 436linkgit:git-diff-tree[1] for more information.
 437
 438[verse]
 439config key: svn.l
 440config key: svn.findcopiesharder
 441
 442-A<filename>::
 443--authors-file=<filename>::
 444
 445Syntax is compatible with the file used by 'git-cvsimport':
 446
 447------------------------------------------------------------------------
 448        loginname = Joe User <user@example.com>
 449------------------------------------------------------------------------
 450
 451If this option is specified and 'git-svn' encounters an SVN
 452committer name that does not exist in the authors-file, 'git-svn'
 453will abort operation. The user will then have to add the
 454appropriate entry.  Re-running the previous 'git-svn' command
 455after the authors-file is modified should continue operation.
 456
 457config key: svn.authorsfile
 458
 459--authors-prog=<filename>::
 460
 461If this option is specified, for each SVN committer name that does not
 462exist in the authors file, the given file is executed with the committer
 463name as the first argument.  The program is expected to return a single
 464line of the form "Name <email>", which will be treated as if included in
 465the authors file.
 466
 467-q::
 468--quiet::
 469        Make 'git-svn' less verbose. Specify a second time to make it
 470        even less verbose.
 471
 472--repack[=<n>]::
 473--repack-flags=<flags>::
 474
 475These should help keep disk usage sane for large fetches
 476with many revisions.
 477
 478--repack takes an optional argument for the number of revisions
 479to fetch before repacking.  This defaults to repacking every
 4801000 commits fetched if no argument is specified.
 481
 482--repack-flags are passed directly to 'git-repack'.
 483
 484[verse]
 485config key: svn.repack
 486config key: svn.repackflags
 487
 488-m::
 489--merge::
 490-s<strategy>::
 491--strategy=<strategy>::
 492
 493These are only used with the 'dcommit' and 'rebase' commands.
 494
 495Passed directly to 'git-rebase' when using 'dcommit' if a
 496'git-reset' cannot be used (see 'dcommit').
 497
 498-n::
 499--dry-run::
 500
 501This can be used with the 'dcommit', 'rebase', 'branch' and 'tag'
 502commands.
 503
 504For 'dcommit', print out the series of git arguments that would show
 505which diffs would be committed to SVN.
 506
 507For 'rebase', display the local branch associated with the upstream svn
 508repository associated with the current branch and the URL of svn
 509repository that will be fetched from.
 510
 511For 'branch' and 'tag', display the urls that will be used for copying when
 512creating the branch or tag.
 513
 514--
 515
 516ADVANCED OPTIONS
 517----------------
 518--
 519
 520-i<GIT_SVN_ID>::
 521--id <GIT_SVN_ID>::
 522
 523This sets GIT_SVN_ID (instead of using the environment).  This
 524allows the user to override the default refname to fetch from
 525when tracking a single URL.  The 'log' and 'dcommit' commands
 526no longer require this switch as an argument.
 527
 528-R<remote name>::
 529--svn-remote <remote name>::
 530        Specify the [svn-remote "<remote name>"] section to use,
 531        this allows SVN multiple repositories to be tracked.
 532        Default: "svn"
 533
 534--follow-parent::
 535        This is especially helpful when we're tracking a directory
 536        that has been moved around within the repository, or if we
 537        started tracking a branch and never tracked the trunk it was
 538        descended from. This feature is enabled by default, use
 539        --no-follow-parent to disable it.
 540
 541config key: svn.followparent
 542
 543--
 544CONFIG FILE-ONLY OPTIONS
 545------------------------
 546--
 547
 548svn.noMetadata::
 549svn-remote.<name>.noMetadata::
 550
 551This gets rid of the 'git-svn-id:' lines at the end of every commit.
 552
 553If you lose your .git/svn/git-svn/.rev_db file, 'git-svn' will not
 554be able to rebuild it and you won't be able to fetch again,
 555either.  This is fine for one-shot imports.
 556
 557The 'git-svn log' command will not work on repositories using
 558this, either.  Using this conflicts with the 'useSvmProps'
 559option for (hopefully) obvious reasons.
 560
 561svn.useSvmProps::
 562svn-remote.<name>.useSvmProps::
 563
 564This allows 'git-svn' to re-map repository URLs and UUIDs from
 565mirrors created using SVN::Mirror (or svk) for metadata.
 566
 567If an SVN revision has a property, "svm:headrev", it is likely
 568that the revision was created by SVN::Mirror (also used by SVK).
 569The property contains a repository UUID and a revision.  We want
 570to make it look like we are mirroring the original URL, so
 571introduce a helper function that returns the original identity
 572URL and UUID, and use it when generating metadata in commit
 573messages.
 574
 575svn.useSvnsyncProps::
 576svn-remote.<name>.useSvnsyncprops::
 577        Similar to the useSvmProps option; this is for users
 578        of the svnsync(1) command distributed with SVN 1.4.x and
 579        later.
 580
 581svn-remote.<name>.rewriteRoot::
 582        This allows users to create repositories from alternate
 583        URLs.  For example, an administrator could run 'git-svn' on the
 584        server locally (accessing via file://) but wish to distribute
 585        the repository with a public http:// or svn:// URL in the
 586        metadata so users of it will see the public URL.
 587
 588svn.brokenSymlinkWorkaround::
 589This disables potentially expensive checks to workaround broken symlinks
 590checked into SVN by broken clients.  Set this option to "false" if you
 591track a SVN repository with many empty blobs that are not symlinks.
 592This option may be changed while "git-svn" is running and take effect on
 593the next revision fetched.  If unset, git-svn assumes this option to be
 594"true".
 595
 596--
 597
 598Since the noMetadata, rewriteRoot, useSvnsyncProps and useSvmProps
 599options all affect the metadata generated and used by 'git-svn'; they
 600*must* be set in the configuration file before any history is imported
 601and these settings should never be changed once they are set.
 602
 603Additionally, only one of these four options can be used per-svn-remote
 604section because they affect the 'git-svn-id:' metadata line.
 605
 606
 607BASIC EXAMPLES
 608--------------
 609
 610Tracking and contributing to the trunk of a Subversion-managed project:
 611
 612------------------------------------------------------------------------
 613# Clone a repo (like git clone):
 614        git svn clone http://svn.example.com/project/trunk
 615# Enter the newly cloned directory:
 616        cd trunk
 617# You should be on master branch, double-check with git-branch
 618        git branch
 619# Do some work and commit locally to git:
 620        git commit ...
 621# Something is committed to SVN, rebase your local changes against the
 622# latest changes in SVN:
 623        git svn rebase
 624# Now commit your changes (that were committed previously using git) to SVN,
 625# as well as automatically updating your working HEAD:
 626        git svn dcommit
 627# Append svn:ignore settings to the default git exclude file:
 628        git svn show-ignore >> .git/info/exclude
 629------------------------------------------------------------------------
 630
 631Tracking and contributing to an entire Subversion-managed project
 632(complete with a trunk, tags and branches):
 633
 634------------------------------------------------------------------------
 635# Clone a repo (like git clone):
 636        git svn clone http://svn.example.com/project -T trunk -b branches -t tags
 637# View all branches and tags you have cloned:
 638        git branch -r
 639# Create a new branch in SVN
 640    git svn branch waldo
 641# Reset your master to trunk (or any other branch, replacing 'trunk'
 642# with the appropriate name):
 643        git reset --hard remotes/trunk
 644# You may only dcommit to one branch/tag/trunk at a time.  The usage
 645# of dcommit/rebase/show-ignore should be the same as above.
 646------------------------------------------------------------------------
 647
 648The initial 'git-svn clone' can be quite time-consuming
 649(especially for large Subversion repositories). If multiple
 650people (or one person with multiple machines) want to use
 651'git-svn' to interact with the same Subversion repository, you can
 652do the initial 'git-svn clone' to a repository on a server and
 653have each person clone that repository with 'git-clone':
 654
 655------------------------------------------------------------------------
 656# Do the initial import on a server
 657        ssh server "cd /pub && git svn clone http://svn.example.com/project
 658# Clone locally - make sure the refs/remotes/ space matches the server
 659        mkdir project
 660        cd project
 661        git init
 662        git remote add origin server:/pub/project
 663        git config --add remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
 664        git fetch
 665# Create a local branch from one of the branches just fetched
 666        git checkout -b master FETCH_HEAD
 667# Initialize git-svn locally (be sure to use the same URL and -T/-b/-t options as were used on server)
 668        git svn init http://svn.example.com/project
 669# Pull the latest changes from Subversion
 670        git svn rebase
 671------------------------------------------------------------------------
 672
 673REBASE VS. PULL/MERGE
 674---------------------
 675
 676Originally, 'git-svn' recommended that the 'remotes/git-svn' branch be
 677pulled or merged from.  This is because the author favored
 678`git svn set-tree B` to commit a single head rather than the
 679`git svn set-tree A..B` notation to commit multiple commits.
 680
 681If you use `git svn set-tree A..B` to commit several diffs and you do
 682not have the latest remotes/git-svn merged into my-branch, you should
 683use `git svn rebase` to update your work branch instead of `git pull` or
 684`git merge`.  `pull`/`merge` can cause non-linear history to be flattened
 685when committing into SVN, which can lead to merge commits reversing
 686previous commits in SVN.
 687
 688DESIGN PHILOSOPHY
 689-----------------
 690Merge tracking in Subversion is lacking and doing branched development
 691with Subversion can be cumbersome as a result.  While 'git-svn' can track
 692copy history (including branches and tags) for repositories adopting a
 693standard layout, it cannot yet represent merge history that happened
 694inside git back upstream to SVN users.  Therefore it is advised that
 695users keep history as linear as possible inside git to ease
 696compatibility with SVN (see the CAVEATS section below).
 697
 698CAVEATS
 699-------
 700
 701For the sake of simplicity and interoperating with a less-capable system
 702(SVN), it is recommended that all 'git-svn' users clone, fetch and dcommit
 703directly from the SVN server, and avoid all 'git-clone'/'pull'/'merge'/'push'
 704operations between git repositories and branches.  The recommended
 705method of exchanging code between git branches and users is
 706'git-format-patch' and 'git-am', or just 'dcommit'ing to the SVN repository.
 707
 708Running 'git-merge' or 'git-pull' is NOT recommended on a branch you
 709plan to 'dcommit' from.  Subversion does not represent merges in any
 710reasonable or useful fashion; so users using Subversion cannot see any
 711merges you've made.  Furthermore, if you merge or pull from a git branch
 712that is a mirror of an SVN branch, 'dcommit' may commit to the wrong
 713branch.
 714
 715'git-clone' does not clone branches under the refs/remotes/ hierarchy or
 716any 'git-svn' metadata, or config.  So repositories created and managed with
 717using 'git-svn' should use 'rsync' for cloning, if cloning is to be done
 718at all.
 719
 720Since 'dcommit' uses rebase internally, any git branches you 'git-push' to
 721before 'dcommit' on will require forcing an overwrite of the existing ref
 722on the remote repository.  This is generally considered bad practice,
 723see the linkgit:git-push[1] documentation for details.
 724
 725Do not use the --amend option of linkgit:git-commit[1] on a change you've
 726already dcommitted.  It is considered bad practice to --amend commits
 727you've already pushed to a remote repository for other users, and
 728dcommit with SVN is analogous to that.
 729
 730BUGS
 731----
 732
 733We ignore all SVN properties except svn:executable.  Any unhandled
 734properties are logged to $GIT_DIR/svn/<refname>/unhandled.log
 735
 736Renamed and copied directories are not detected by git and hence not
 737tracked when committing to SVN.  I do not plan on adding support for
 738this as it's quite difficult and time-consuming to get working for all
 739the possible corner cases (git doesn't do it, either).  Committing
 740renamed and copied files are fully supported if they're similar enough
 741for git to detect them.
 742
 743CONFIGURATION
 744-------------
 745
 746'git-svn' stores [svn-remote] configuration information in the
 747repository .git/config file.  It is similar the core git
 748[remote] sections except 'fetch' keys do not accept glob
 749arguments; but they are instead handled by the 'branches'
 750and 'tags' keys.  Since some SVN repositories are oddly
 751configured with multiple projects glob expansions such those
 752listed below are allowed:
 753
 754------------------------------------------------------------------------
 755[svn-remote "project-a"]
 756        url = http://server.org/svn
 757        fetch = trunk/project-a:refs/remotes/project-a/trunk
 758        branches = branches/*/project-a:refs/remotes/project-a/branches/*
 759        tags = tags/*/project-a:refs/remotes/project-a/tags/*
 760------------------------------------------------------------------------
 761
 762Keep in mind that the '\*' (asterisk) wildcard of the local ref
 763(right of the ':') *must* be the farthest right path component;
 764however the remote wildcard may be anywhere as long as it's an
 765independent path component (surrounded by '/' or EOL).   This
 766type of configuration is not automatically created by 'init' and
 767should be manually entered with a text-editor or using 'git-config'.
 768
 769SEE ALSO
 770--------
 771linkgit:git-rebase[1]
 772
 773Author
 774------
 775Written by Eric Wong <normalperson@yhbt.net>.
 776
 777Documentation
 778-------------
 779Written by Eric Wong <normalperson@yhbt.net>.