Documentation / git-svn.txton commit Merge branch 'jc/numstat' (f5c589f)
   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-----------
  14git-svn is a simple conduit for changesets between a single Subversion
  15branch and git. It is not to be confused with gitlink:git-svnimport[1].
  16They were designed with very different goals in mind.
  17
  18git-svn is designed for an individual developer who wants a
  19bidirectional flow of changesets between a single branch in Subversion
  20and an arbitrary number of branches in git.  git-svnimport is designed
  21for read-only operation on repositories that match a particular layout
  22(albeit the recommended one by SVN developers).
  23
  24For importing svn, git-svnimport is potentially more powerful when
  25operating on repositories organized under the recommended
  26trunk/branch/tags structure, and should be faster, too.
  27
  28git-svn mostly ignores the very limited view of branching that
  29Subversion has.  This allows git-svn to be much easier to use,
  30especially on repositories that are not organized in a manner that
  31git-svnimport is designed for.
  32
  33COMMANDS
  34--------
  35--
  36
  37'init'::
  38        Creates an empty git repository with additional metadata
  39        directories for git-svn.  The Subversion URL must be specified
  40        as a command-line argument.  Optionally, the target directory
  41        to operate on can be specified as a second argument.  Normally
  42        this command initializes the current directory.
  43
  44'fetch'::
  45
  46Fetch unfetched revisions from the Subversion URL we are
  47tracking.  refs/remotes/git-svn will be updated to the
  48latest revision.
  49
  50Note: You should never attempt to modify the remotes/git-svn
  51branch outside of git-svn.  Instead, create a branch from
  52remotes/git-svn and work on that branch.  Use the 'dcommit'
  53command (see below) to write git commits back to
  54remotes/git-svn.
  55
  56See '<<fetch-args,Additional Fetch Arguments>>' if you are interested in
  57manually joining branches on commit.
  58
  59'dcommit'::
  60        Commit all diffs from a specified head directly to the SVN
  61        repository, and then rebase or reset (depending on whether or
  62        not there is a diff between SVN and head).  It is recommended
  63        that you run git-svn fetch and rebase (not pull) your commits
  64        against the latest changes in the SVN repository.
  65        An optional command-line argument may be specified as an
  66        alternative to HEAD.
  67        This is advantageous over 'commit' (below) because it produces
  68        cleaner, more linear history.
  69
  70'log'::
  71        This should make it easy to look up svn log messages when svn
  72        users refer to -r/--revision numbers.
  73
  74        The following features from `svn log' are supported:
  75
  76        --revision=<n>[:<n>] - is supported, non-numeric args are not:
  77                               HEAD, NEXT, BASE, PREV, etc ...
  78        -v/--verbose         - it's not completely compatible with
  79                               the --verbose output in svn log, but
  80                               reasonably close.
  81        --limit=<n>          - is NOT the same as --max-count,
  82                               doesn't count merged/excluded commits
  83        --incremental        - supported
  84
  85        New features:
  86
  87        --show-commit        - shows the git commit sha1, as well
  88        --oneline            - our version of --pretty=oneline
  89
  90        Any other arguments are passed directly to `git log'
  91
  92'commit'::
  93        You should consider using 'dcommit' instead of this command.
  94        Commit specified commit or tree objects to SVN.  This relies on
  95        your imported fetch data being up-to-date.  This makes
  96        absolutely no attempts to do patching when committing to SVN, it
  97        simply overwrites files with those specified in the tree or
  98        commit.  All merging is assumed to have taken place
  99        independently of git-svn functions.
 100
 101'rebuild'::
 102        Not a part of daily usage, but this is a useful command if
 103        you've just cloned a repository (using gitlink:git-clone[1]) that was
 104        tracked with git-svn.  Unfortunately, git-clone does not clone
 105        git-svn metadata and the svn working tree that git-svn uses for
 106        its operations.  This rebuilds the metadata so git-svn can
 107        resume fetch operations.  A Subversion URL may be optionally
 108        specified at the command-line if the directory/repository you're
 109        tracking has moved or changed protocols.
 110
 111'show-ignore'::
 112        Recursively finds and lists the svn:ignore property on
 113        directories.  The output is suitable for appending to
 114        the $GIT_DIR/info/exclude file.
 115
 116'commit-diff'::
 117        Commits the diff of two tree-ish arguments from the
 118        command-line.  This command is intended for interopability with
 119        git-svnimport and does not rely on being inside an git-svn
 120        init-ed repository.  This command takes three arguments, (a) the
 121        original tree to diff against, (b) the new tree result, (c) the
 122        URL of the target Subversion repository.  The final argument
 123        (URL) may be omitted if you are working from a git-svn-aware
 124        repository (that has been init-ed with git-svn).
 125        The -r<revision> option is required for this.
 126
 127'graft-branches'::
 128        This command attempts to detect merges/branches from already
 129        imported history.  Techniques used currently include regexes,
 130        file copies, and tree-matches).  This command generates (or
 131        modifies) the $GIT_DIR/info/grafts file.  This command is
 132        considered experimental, and inherently flawed because
 133        merge-tracking in SVN is inherently flawed and inconsistent
 134        across different repositories.
 135
 136'multi-init'::
 137        This command supports git-svnimport-like command-line syntax for
 138        importing repositories that are layed out as recommended by the
 139        SVN folks.  This is a bit more tolerant than the git-svnimport
 140        command-line syntax and doesn't require the user to figure out
 141        where the repository URL ends and where the repository path
 142        begins.
 143
 144'multi-fetch'::
 145        This runs fetch on all known SVN branches we're tracking.  This
 146        will NOT discover new branches (unlike git-svnimport), so
 147        multi-init will need to be re-run (it's idempotent).
 148
 149--
 150
 151OPTIONS
 152-------
 153--
 154
 155--shared::
 156--template=<template_directory>::
 157        Only used with the 'init' command.
 158        These are passed directly to gitlink:git-init-db[1].
 159
 160-r <ARG>::
 161--revision <ARG>::
 162
 163Only used with the 'fetch' command.
 164
 165Takes any valid -r<argument> svn would accept and passes it
 166directly to svn. -r<ARG1>:<ARG2> ranges and "{" DATE "}" syntax
 167is also supported.  This is passed directly to svn, see svn
 168documentation for more details.
 169
 170This can allow you to make partial mirrors when running fetch.
 171
 172-::
 173--stdin::
 174
 175Only used with the 'commit' command.
 176
 177Read a list of commits from stdin and commit them in reverse
 178order.  Only the leading sha1 is read from each line, so
 179git-rev-list --pretty=oneline output can be used.
 180
 181--rmdir::
 182
 183Only used with the 'dcommit', 'commit' and 'commit-diff' commands.
 184
 185Remove directories from the SVN tree if there are no files left
 186behind.  SVN can version empty directories, and they are not
 187removed by default if there are no files left in them.  git
 188cannot version empty directories.  Enabling this flag will make
 189the commit to SVN act like git.
 190
 191repo-config key: svn.rmdir
 192
 193-e::
 194--edit::
 195
 196Only used with the 'dcommit', 'commit' and 'commit-diff' commands.
 197
 198Edit the commit message before committing to SVN.  This is off by
 199default for objects that are commits, and forced on when committing
 200tree objects.
 201
 202repo-config key: svn.edit
 203
 204-l<num>::
 205--find-copies-harder::
 206
 207Only used with the 'dcommit', 'commit' and 'commit-diff' commands.
 208
 209They are both passed directly to git-diff-tree see
 210gitlink:git-diff-tree[1] for more information.
 211
 212[verse]
 213repo-config key: svn.l
 214repo-config key: svn.findcopiesharder
 215
 216-A<filename>::
 217--authors-file=<filename>::
 218
 219Syntax is compatible with the files used by git-svnimport and
 220git-cvsimport:
 221
 222------------------------------------------------------------------------
 223        loginname = Joe User <user@example.com>
 224------------------------------------------------------------------------
 225
 226If this option is specified and git-svn encounters an SVN
 227committer name that does not exist in the authors-file, git-svn
 228will abort operation. The user will then have to add the
 229appropriate entry.  Re-running the previous git-svn command
 230after the authors-file is modified should continue operation.
 231
 232repo-config key: svn.authorsfile
 233
 234-q::
 235--quiet::
 236        Make git-svn less verbose.  This only affects git-svn if you
 237        have the SVN::* libraries installed and are using them.
 238
 239--repack[=<n>]::
 240--repack-flags=<flags>
 241        These should help keep disk usage sane for large fetches
 242        with many revisions.
 243
 244        --repack takes an optional argument for the number of revisions
 245        to fetch before repacking.  This defaults to repacking every
 246        1000 commits fetched if no argument is specified.
 247
 248        --repack-flags are passed directly to gitlink:git-repack[1].
 249
 250repo-config key: svn.repack
 251repo-config key: svn.repackflags
 252
 253-m::
 254--merge::
 255-s<strategy>::
 256--strategy=<strategy>::
 257
 258These are only used with the 'dcommit' command.
 259
 260Passed directly to git-rebase when using 'dcommit' if a
 261'git-reset' cannot be used (see dcommit).
 262
 263-n::
 264--dry-run::
 265
 266This is only used with the 'dcommit' command.
 267
 268Print out the series of git arguments that would show
 269which diffs would be committed to SVN.
 270
 271--
 272
 273ADVANCED OPTIONS
 274----------------
 275--
 276
 277-b<refname>::
 278--branch <refname>::
 279Used with 'fetch', 'dcommit' or 'commit'.
 280
 281This can be used to join arbitrary git branches to remotes/git-svn
 282on new commits where the tree object is equivalent.
 283
 284When used with different GIT_SVN_ID values, tags and branches in
 285SVN can be tracked this way, as can some merges where the heads
 286end up having completely equivalent content.  This can even be
 287used to track branches across multiple SVN _repositories_.
 288
 289This option may be specified multiple times, once for each
 290branch.
 291
 292repo-config key: svn.branch
 293
 294-i<GIT_SVN_ID>::
 295--id <GIT_SVN_ID>::
 296
 297This sets GIT_SVN_ID (instead of using the environment).  See the
 298section on
 299'<<tracking-multiple-repos,Tracking Multiple Repositories or Branches>>'
 300for more information on using GIT_SVN_ID.
 301
 302--follow-parent::
 303        This is especially helpful when we're tracking a directory
 304        that has been moved around within the repository, or if we
 305        started tracking a branch and never tracked the trunk it was
 306        descended from.
 307
 308        This relies on the SVN::* libraries to work.
 309
 310repo-config key: svn.followparent
 311
 312--no-metadata::
 313        This gets rid of the git-svn-id: lines at the end of every commit.
 314
 315        With this, you lose the ability to use the rebuild command.  If
 316        you ever lose your .git/svn/git-svn/.rev_db file, you won't be
 317        able to fetch again, either.  This is fine for one-shot imports.
 318
 319        The 'git-svn log' command will not work on repositories using this,
 320        either.
 321
 322repo-config key: svn.nometadata
 323
 324--
 325
 326COMPATIBILITY OPTIONS
 327---------------------
 328--
 329
 330--upgrade::
 331Only used with the 'rebuild' command.
 332
 333Run this if you used an old version of git-svn that used
 334"git-svn-HEAD" instead of "remotes/git-svn" as the branch
 335for tracking the remote.
 336
 337--no-ignore-externals::
 338Only used with the 'fetch' and 'rebuild' command.
 339
 340This command has no effect when you are using the SVN::*
 341libraries with git, svn:externals are always avoided.
 342
 343By default, git-svn passes --ignore-externals to svn to avoid
 344fetching svn:external trees into git.  Pass this flag to enable
 345externals tracking directly via git.
 346
 347Versions of svn that do not support --ignore-externals are
 348automatically detected and this flag will be automatically
 349enabled for them.
 350
 351Otherwise, do not enable this flag unless you know what you're
 352doing.
 353
 354repo-config key: svn.noignoreexternals
 355
 356--ignore-nodate::
 357Only used with the 'fetch' command.
 358
 359By default git-svn will crash if it tries to import a revision
 360from SVN which has '(no date)' listed as the date of the revision.
 361This is repository corruption on SVN's part, plain and simple.
 362But sometimes you really need those revisions anyway.
 363
 364If supplied git-svn will convert '(no date)' entries to the UNIX
 365epoch (midnight on Jan. 1, 1970).  Yes, that's probably very wrong.
 366SVN was very wrong.
 367
 368--
 369
 370Basic Examples
 371~~~~~~~~~~~~~~
 372
 373Tracking and contributing to a Subversion-managed project:
 374
 375------------------------------------------------------------------------
 376# Initialize a repo (like git init-db):
 377        git-svn init http://svn.foo.org/project/trunk
 378# Fetch remote revisions:
 379        git-svn fetch
 380# Create your own branch to hack on:
 381        git checkout -b my-branch remotes/git-svn
 382# Do some work, and then commit your new changes to SVN, as well as
 383# automatically updating your working HEAD:
 384        git-svn dcommit
 385# Something is committed to SVN, rebase the latest into your branch:
 386        git-svn fetch && git rebase remotes/git-svn
 387# Append svn:ignore settings to the default git exclude file:
 388        git-svn show-ignore >> .git/info/exclude
 389------------------------------------------------------------------------
 390
 391REBASE VS. PULL
 392---------------
 393
 394Originally, git-svn recommended that the remotes/git-svn branch be
 395pulled from.  This is because the author favored 'git-svn commit B'
 396to commit a single head rather than the 'git-svn commit A..B' notation
 397to commit multiple commits.
 398
 399If you use 'git-svn commit A..B' to commit several diffs and you do not
 400have the latest remotes/git-svn merged into my-branch, you should use
 401'git rebase' to update your work branch instead of 'git pull'.  'pull'
 402can cause non-linear history to be flattened when committing into SVN,
 403which can lead to merge commits reversing previous commits in SVN.
 404
 405DESIGN PHILOSOPHY
 406-----------------
 407Merge tracking in Subversion is lacking and doing branched development
 408with Subversion is cumbersome as a result.  git-svn does not do
 409automated merge/branch tracking by default and leaves it entirely up to
 410the user on the git side.
 411
 412[[tracking-multiple-repos]]
 413TRACKING MULTIPLE REPOSITORIES OR BRANCHES
 414------------------------------------------
 415Because git-svn does not care about relationships between different
 416branches or directories in a Subversion repository, git-svn has a simple
 417hack to allow it to track an arbitrary number of related _or_ unrelated
 418SVN repositories via one git repository.  Simply use the --id/-i flag or
 419set the GIT_SVN_ID environment variable to a name other other than
 420"git-svn" (the default) and git-svn will ignore the contents of the
 421$GIT_DIR/svn/git-svn directory and instead do all of its work in
 422$GIT_DIR/svn/$GIT_SVN_ID for that invocation.  The interface branch will
 423be remotes/$GIT_SVN_ID, instead of remotes/git-svn.  Any
 424remotes/$GIT_SVN_ID branch should never be modified by the user outside
 425of git-svn commands.
 426
 427[[fetch-args]]
 428ADDITIONAL FETCH ARGUMENTS
 429--------------------------
 430This is for advanced users, most users should ignore this section.
 431
 432Unfetched SVN revisions may be imported as children of existing commits
 433by specifying additional arguments to 'fetch'.  Additional parents may
 434optionally be specified in the form of sha1 hex sums at the
 435command-line.  Unfetched SVN revisions may also be tied to particular
 436git commits with the following syntax:
 437
 438------------------------------------------------
 439        svn_revision_number=git_commit_sha1
 440------------------------------------------------
 441
 442This allows you to tie unfetched SVN revision 375 to your current HEAD:
 443
 444------------------------------------------------
 445        git-svn fetch 375=$(git-rev-parse HEAD)
 446------------------------------------------------
 447
 448Advanced Example: Tracking a Reorganized Repository
 449~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 450Note: this example is now obsolete if you have SVN::* libraries
 451installed.  Simply use --follow-parent when fetching.
 452
 453If you're tracking a directory that has moved, or otherwise been
 454branched or tagged off of another directory in the repository and you
 455care about the full history of the project, then you can read this
 456section.
 457
 458This is how Yann Dirson tracked the trunk of the ufoai directory when
 459the /trunk directory of his repository was moved to /ufoai/trunk and
 460he needed to continue tracking /ufoai/trunk where /trunk left off.
 461
 462------------------------------------------------------------------------
 463        # This log message shows when the repository was reorganized:
 464        r166 | ydirson | 2006-03-02 01:36:55 +0100 (Thu, 02 Mar 2006) | 1 line
 465        Changed paths:
 466           D /trunk
 467           A /ufoai/trunk (from /trunk:165)
 468
 469        # First we start tracking the old revisions:
 470        GIT_SVN_ID=git-oldsvn git-svn init \
 471                        https://svn.sourceforge.net/svnroot/ufoai/trunk
 472        GIT_SVN_ID=git-oldsvn git-svn fetch -r1:165
 473
 474        # And now, we continue tracking the new revisions:
 475        GIT_SVN_ID=git-newsvn git-svn init \
 476              https://svn.sourceforge.net/svnroot/ufoai/ufoai/trunk
 477        GIT_SVN_ID=git-newsvn git-svn fetch \
 478              166=`git-rev-parse refs/remotes/git-oldsvn`
 479------------------------------------------------------------------------
 480
 481BUGS
 482----
 483
 484If you are not using the SVN::* Perl libraries and somebody commits a
 485conflicting changeset to SVN at a bad moment (right before you commit)
 486causing a conflict and your commit to fail, your svn working tree
 487($GIT_DIR/git-svn/tree) may be dirtied.  The easiest thing to do is
 488probably just to rm -rf $GIT_DIR/git-svn/tree and run 'rebuild'.   You
 489can avoid this problem entirely by using 'dcommit'.
 490
 491We ignore all SVN properties except svn:executable.  Too difficult to
 492map them since we rely heavily on git write-tree being _exactly_ the
 493same on both the SVN and git working trees and I prefer not to clutter
 494working trees with metadata files.
 495
 496Renamed and copied directories are not detected by git and hence not
 497tracked when committing to SVN.  I do not plan on adding support for
 498this as it's quite difficult and time-consuming to get working for all
 499the possible corner cases (git doesn't do it, either).  Renamed and
 500copied files are fully supported if they're similar enough for git to
 501detect them.
 502
 503SEE ALSO
 504--------
 505gitlink:git-rebase[1]
 506
 507Author
 508------
 509Written by Eric Wong <normalperson@yhbt.net>.
 510
 511Documentation
 512-------------
 513Written by Eric Wong <normalperson@yhbt.net>.