<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" | |
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> | |
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> | |
<head> | |
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> | |
<meta name="generator" content="AsciiDoc 7.0.2" /> | |
<style type="text/css"> | |
/* Debug borders */ | |
p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 { | |
/* | |
border: 1px solid red; | |
*/ | |
} | |
body { | |
margin: 1em 5% 1em 5%; | |
} | |
a { color: blue; } | |
a:visited { color: fuchsia; } | |
em { | |
font-style: italic; | |
} | |
strong { | |
font-weight: bold; | |
} | |
tt { | |
color: navy; | |
} | |
h1, h2, h3, h4, h5, h6 { | |
color: #527bbd; | |
font-family: sans-serif; | |
margin-top: 1.2em; | |
margin-bottom: 0.5em; | |
line-height: 1.3; | |
} | |
h1 { | |
border-bottom: 2px solid silver; | |
} | |
h2 { | |
border-bottom: 2px solid silver; | |
padding-top: 0.5em; | |
} | |
div.sectionbody { | |
font-family: serif; | |
margin-left: 0; | |
} | |
hr { | |
border: 1px solid silver; | |
} | |
p { | |
margin-top: 0.5em; | |
margin-bottom: 0.5em; | |
} | |
pre { | |
padding: 0; | |
margin: 0; | |
} | |
span#author { | |
color: #527bbd; | |
font-family: sans-serif; | |
font-weight: bold; | |
font-size: 1.2em; | |
} | |
span#email { | |
} | |
span#revision { | |
font-family: sans-serif; | |
} | |
div#footer { | |
font-family: sans-serif; | |
font-size: small; | |
border-top: 2px solid silver; | |
padding-top: 0.5em; | |
margin-top: 4.0em; | |
} | |
div#footer-text { | |
float: left; | |
padding-bottom: 0.5em; | |
} | |
div#footer-badges { | |
float: right; | |
padding-bottom: 0.5em; | |
} | |
div#preamble, | |
div.tableblock, div.imageblock, div.exampleblock, div.verseblock, | |
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, | |
div.admonitionblock { | |
margin-right: 10%; | |
margin-top: 1.5em; | |
margin-bottom: 1.5em; | |
} | |
div.admonitionblock { | |
margin-top: 2.5em; | |
margin-bottom: 2.5em; | |
} | |
div.content { /* Block element content. */ | |
padding: 0; | |
} | |
/* Block element titles. */ | |
div.title, caption.title { | |
font-family: sans-serif; | |
font-weight: bold; | |
text-align: left; | |
margin-top: 1.0em; | |
margin-bottom: 0.5em; | |
} | |
div.title + * { | |
margin-top: 0; | |
} | |
td div.title:first-child { | |
margin-top: 0.0em; | |
} | |
div.content div.title:first-child { | |
margin-top: 0.0em; | |
} | |
div.content + div.title { | |
margin-top: 0.0em; | |
} | |
div.sidebarblock > div.content { | |
background: #ffffee; | |
border: 1px solid silver; | |
padding: 0.5em; | |
} | |
div.listingblock > div.content { | |
border: 1px solid silver; | |
background: #f4f4f4; | |
padding: 0.5em; | |
} | |
div.quoteblock > div.content { | |
padding-left: 2.0em; | |
} | |
div.quoteblock .attribution { | |
text-align: right; | |
} | |
div.admonitionblock .icon { | |
vertical-align: top; | |
font-size: 1.1em; | |
font-weight: bold; | |
text-decoration: underline; | |
color: #527bbd; | |
padding-right: 0.5em; | |
} | |
div.admonitionblock td.content { | |
padding-left: 0.5em; | |
border-left: 2px solid silver; | |
} | |
div.exampleblock > div.content { | |
border-left: 2px solid silver; | |
padding: 0.5em; | |
} | |
div.verseblock div.content { | |
white-space: pre; | |
} | |
div.imageblock div.content { padding-left: 0; } | |
div.imageblock img { border: 1px solid silver; } | |
span.image img { border-style: none; } | |
dl { | |
margin-top: 0.8em; | |
margin-bottom: 0.8em; | |
} | |
dt { | |
margin-top: 0.5em; | |
margin-bottom: 0; | |
font-style: italic; | |
} | |
dd > *:first-child { | |
margin-top: 0; | |
} | |
ul, ol { | |
list-style-position: outside; | |
} | |
ol.olist2 { | |
list-style-type: lower-alpha; | |
} | |
div.tableblock > table { | |
border-color: #527bbd; | |
border-width: 3px; | |
} | |
thead { | |
font-family: sans-serif; | |
font-weight: bold; | |
} | |
tfoot { | |
font-weight: bold; | |
} | |
div.hlist { | |
margin-top: 0.8em; | |
margin-bottom: 0.8em; | |
} | |
td.hlist1 { | |
vertical-align: top; | |
font-style: italic; | |
padding-right: 0.8em; | |
} | |
td.hlist2 { | |
vertical-align: top; | |
} | |
@media print { | |
div#footer-badges { display: none; } | |
} | |
include::./stylesheets/xhtml11-manpage.css[] | |
/* Workarounds for IE6's broken and incomplete CSS2. */ | |
div.sidebar-content { | |
background: #ffffee; | |
border: 1px solid silver; | |
padding: 0.5em; | |
} | |
div.sidebar-title, div.image-title { | |
font-family: sans-serif; | |
font-weight: bold; | |
margin-top: 0.0em; | |
margin-bottom: 0.5em; | |
} | |
div.listingblock div.content { | |
border: 1px solid silver; | |
background: #f4f4f4; | |
padding: 0.5em; | |
} | |
div.quoteblock-content { | |
padding-left: 2.0em; | |
} | |
div.exampleblock-content { | |
border-left: 2px solid silver; | |
padding-left: 0.5em; | |
} | |
</style> | |
<title>git-svn(1)</title> | |
</head> | |
<body> | |
<div id="header"> | |
<h1> | |
git-svn(1) Manual Page | |
</h1> | |
<h2>NAME</h2> | |
<div class="sectionbody"> | |
<p>git-svn - | |
bidirectional operation between a single Subversion branch and git | |
</p> | |
</div> | |
</div> | |
<h2>SYNOPSIS</h2> | |
<div class="sectionbody"> | |
<p><em>git-svn</em> <command> [options] [arguments]</p> | |
</div> | |
<h2>DESCRIPTION</h2> | |
<div class="sectionbody"> | |
<p>git-svn is a simple conduit for changesets between a single Subversion | |
branch and git. It is not to be confused with <a href="git-svnimport.html">git-svnimport(1)</a>. | |
They were designed with very different goals in mind.</p> | |
<p>git-svn is designed for an individual developer who wants a | |
bidirectional flow of changesets between a single branch in Subversion | |
and an arbitrary number of branches in git. git-svnimport is designed | |
for read-only operation on repositories that match a particular layout | |
(albeit the recommended one by SVN developers).</p> | |
<p>For importing svn, git-svnimport is potentially more powerful when | |
operating on repositories organized under the recommended | |
trunk/branch/tags structure, and should be faster, too.</p> | |
<p>git-svn mostly ignores the very limited view of branching that | |
Subversion has. This allows git-svn to be much easier to use, | |
especially on repositories that are not organized in a manner that | |
git-svnimport is designed for.</p> | |
</div> | |
<h2>COMMANDS</h2> | |
<div class="sectionbody"> | |
<dl> | |
<dt> | |
<em>init</em> | |
</dt> | |
<dd> | |
<p> | |
Creates an empty git repository with additional metadata | |
directories for git-svn. The Subversion URL must be specified | |
as a command-line argument. Optionally, the target directory | |
to operate on can be specified as a second argument. Normally | |
this command initializes the current directory. | |
</p> | |
</dd> | |
<dt> | |
<em>fetch</em> | |
</dt> | |
<dd> | |
<p> | |
Fetch unfetched revisions from the Subversion URL we are | |
tracking. refs/remotes/git-svn will be updated to the | |
latest revision. | |
</p> | |
<p>Note: You should never attempt to modify the remotes/git-svn | |
branch outside of git-svn. Instead, create a branch from | |
remotes/git-svn and work on that branch. Use the <em>dcommit</em> | |
command (see below) to write git commits back to | |
remotes/git-svn.</p> | |
<p>See <em><a href="#fetch-args">Additional Fetch Arguments</a></em> if you are interested in | |
manually joining branches on commit.</p> | |
</dd> | |
<dt> | |
<em>dcommit</em> | |
</dt> | |
<dd> | |
<p> | |
Commit all diffs from the current HEAD directly to the SVN | |
repository, and then rebase or reset (depending on whether or | |
not there is a diff between SVN and HEAD). It is recommended | |
that you run git-svn fetch and rebase (not pull) your commits | |
against the latest changes in the SVN repository. | |
This is advantageous over <em>commit</em> (below) because it produces | |
cleaner, more linear history. | |
</p> | |
</dd> | |
<dt> | |
<em>log</em> | |
</dt> | |
<dd> | |
<p> | |
This should make it easy to look up svn log messages when svn | |
users refer to -r/--revision numbers. | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>The following features from `svn log' are supported:</tt></pre> | |
</div></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>--revision=<n>[:<n>] - is supported, non-numeric args are not: | |
HEAD, NEXT, BASE, PREV, etc ... | |
-v/--verbose - it's not completely compatible with | |
the --verbose output in svn log, but | |
reasonably close. | |
--limit=<n> - is NOT the same as --max-count, | |
doesn't count merged/excluded commits | |
--incremental - supported</tt></pre> | |
</div></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>New features:</tt></pre> | |
</div></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>--show-commit - shows the git commit sha1, as well | |
--oneline - our version of --pretty=oneline</tt></pre> | |
</div></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>Any other arguments are passed directly to `git log'</tt></pre> | |
</div></div> | |
</dd> | |
<dt> | |
<em>commit</em> | |
</dt> | |
<dd> | |
<p> | |
You should consider using <em>dcommit</em> instead of this command. | |
Commit specified commit or tree objects to SVN. This relies on | |
your imported fetch data being up-to-date. This makes | |
absolutely no attempts to do patching when committing to SVN, it | |
simply overwrites files with those specified in the tree or | |
commit. All merging is assumed to have taken place | |
independently of git-svn functions. | |
</p> | |
</dd> | |
<dt> | |
<em>rebuild</em> | |
</dt> | |
<dd> | |
<p> | |
Not a part of daily usage, but this is a useful command if | |
you've just cloned a repository (using <a href="git-clone.html">git-clone(1)</a>) that was | |
tracked with git-svn. Unfortunately, git-clone does not clone | |
git-svn metadata and the svn working tree that git-svn uses for | |
its operations. This rebuilds the metadata so git-svn can | |
resume fetch operations. A Subversion URL may be optionally | |
specified at the command-line if the directory/repository you're | |
tracking has moved or changed protocols. | |
</p> | |
</dd> | |
<dt> | |
<em>show-ignore</em> | |
</dt> | |
<dd> | |
<p> | |
Recursively finds and lists the svn:ignore property on | |
directories. The output is suitable for appending to | |
the $GIT_DIR/info/exclude file. | |
</p> | |
</dd> | |
<dt> | |
<em>commit-diff</em> | |
</dt> | |
<dd> | |
<p> | |
Commits the diff of two tree-ish arguments from the | |
command-line. This command is intended for interopability with | |
git-svnimport and does not rely on being inside an git-svn | |
init-ed repository. This command takes three arguments, (a) the | |
original tree to diff against, (b) the new tree result, (c) the | |
URL of the target Subversion repository. The final argument | |
(URL) may be omitted if you are working from a git-svn-aware | |
repository (that has been init-ed with git-svn). | |
The -r<revision> option is required for this. | |
</p> | |
</dd> | |
<dt> | |
<em>graft-branches</em> | |
</dt> | |
<dd> | |
<p> | |
This command attempts to detect merges/branches from already | |
imported history. Techniques used currently include regexes, | |
file copies, and tree-matches). This command generates (or | |
modifies) the $GIT_DIR/info/grafts file. This command is | |
considered experimental, and inherently flawed because | |
merge-tracking in SVN is inherently flawed and inconsistent | |
across different repositories. | |
</p> | |
</dd> | |
<dt> | |
<em>multi-init</em> | |
</dt> | |
<dd> | |
<p> | |
This command supports git-svnimport-like command-line syntax for | |
importing repositories that are layed out as recommended by the | |
SVN folks. This is a bit more tolerant than the git-svnimport | |
command-line syntax and doesn't require the user to figure out | |
where the repository URL ends and where the repository path | |
begins. | |
</p> | |
</dd> | |
<dt> | |
<em>multi-fetch</em> | |
</dt> | |
<dd> | |
<p> | |
This runs fetch on all known SVN branches we're tracking. This | |
will NOT discover new branches (unlike git-svnimport), so | |
multi-init will need to be re-run (it's idempotent). | |
</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>OPTIONS</h2> | |
<div class="sectionbody"> | |
<dl> | |
<dt> | |
--shared | |
</dt> | |
<dt> | |
--template=<template_directory> | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>init</em> command. | |
These are passed directly to <a href="git-init-db.html">git-init-db(1)</a>. | |
</p> | |
</dd> | |
<dt> | |
-r <ARG> | |
</dt> | |
<dt> | |
--revision <ARG> | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>fetch</em> command. | |
</p> | |
<p>Takes any valid -r<argument> svn would accept and passes it | |
directly to svn. -r<ARG1>:<ARG2> ranges and "{" DATE "}" syntax | |
is also supported. This is passed directly to svn, see svn | |
documentation for more details.</p> | |
<p>This can allow you to make partial mirrors when running fetch.</p> | |
</dd> | |
<dt> | |
- | |
</dt> | |
<dt> | |
--stdin | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>commit</em> command. | |
</p> | |
<p>Read a list of commits from stdin and commit them in reverse | |
order. Only the leading sha1 is read from each line, so | |
git-rev-list --pretty=oneline output can be used.</p> | |
</dd> | |
<dt> | |
--rmdir | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>dcommit</em>, <em>commit</em> and <em>commit-diff</em> commands. | |
</p> | |
<p>Remove directories from the SVN tree if there are no files left | |
behind. SVN can version empty directories, and they are not | |
removed by default if there are no files left in them. git | |
cannot version empty directories. Enabling this flag will make | |
the commit to SVN act like git.</p> | |
<p>repo-config key: svn.rmdir</p> | |
</dd> | |
<dt> | |
-e | |
</dt> | |
<dt> | |
--edit | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>dcommit</em>, <em>commit</em> and <em>commit-diff</em> commands. | |
</p> | |
<p>Edit the commit message before committing to SVN. This is off by | |
default for objects that are commits, and forced on when committing | |
tree objects.</p> | |
<p>repo-config key: svn.edit</p> | |
</dd> | |
<dt> | |
-l<num> | |
</dt> | |
<dt> | |
--find-copies-harder | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>dcommit</em>, <em>commit</em> and <em>commit-diff</em> commands. | |
</p> | |
<p>They are both passed directly to git-diff-tree see | |
<a href="git-diff-tree.html">git-diff-tree(1)</a> for more information.</p> | |
<div class="verseblock"> | |
<div class="content">repo-config key: svn.l | |
repo-config key: svn.findcopiesharder</div></div> | |
</dd> | |
<dt> | |
-A<filename> | |
</dt> | |
<dt> | |
--authors-file=<filename> | |
</dt> | |
<dd> | |
<p> | |
Syntax is compatible with the files used by git-svnimport and | |
git-cvsimport: | |
</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt> loginname = Joe User <user@example.com></tt></pre> | |
</div></div> | |
<p>If this option is specified and git-svn encounters an SVN | |
committer name that does not exist in the authors-file, git-svn | |
will abort operation. The user will then have to add the | |
appropriate entry. Re-running the previous git-svn command | |
after the authors-file is modified should continue operation.</p> | |
<p>repo-config key: svn.authorsfile</p> | |
</dd> | |
<dt> | |
-q | |
</dt> | |
<dt> | |
--quiet | |
</dt> | |
<dd> | |
<p> | |
Make git-svn less verbose. This only affects git-svn if you | |
have the SVN::* libraries installed and are using them. | |
</p> | |
</dd> | |
<dt> | |
--repack[=<n>] | |
</dt> | |
<dd> | |
<p> | |
--repack-flags=<flags> | |
These should help keep disk usage sane for large fetches | |
with many revisions. | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>--repack takes an optional argument for the number of revisions | |
to fetch before repacking. This defaults to repacking every | |
1000 commits fetched if no argument is specified.</tt></pre> | |
</div></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>--repack-flags are passed directly to gitlink:git-repack[1].</tt></pre> | |
</div></div> | |
<p>repo-config key: svn.repack | |
repo-config key: svn.repackflags</p> | |
</dd> | |
<dt> | |
-m | |
</dt> | |
<dt> | |
--merge | |
</dt> | |
<dt> | |
-s<strategy> | |
</dt> | |
<dt> | |
--strategy=<strategy> | |
</dt> | |
<dd> | |
<p> | |
These are only used with the <em>dcommit</em> command. | |
</p> | |
<p>Passed directly to git-rebase when using <em>dcommit</em> if a | |
<em>git-reset</em> cannot be used (see dcommit).</p> | |
</dd> | |
<dt> | |
-n | |
</dt> | |
<dt> | |
--dry-run | |
</dt> | |
<dd> | |
<p> | |
This is only used with the <em>dcommit</em> command. | |
</p> | |
<p>Print out the series of git arguments that would show | |
which diffs would be committed to SVN.</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>ADVANCED OPTIONS</h2> | |
<div class="sectionbody"> | |
<dl> | |
<dt> | |
-b<refname> | |
</dt> | |
<dt> | |
--branch <refname> | |
</dt> | |
<dd> | |
<p> | |
Used with <em>fetch</em>, <em>dcommit</em> or <em>commit</em>. | |
</p> | |
<p>This can be used to join arbitrary git branches to remotes/git-svn | |
on new commits where the tree object is equivalent.</p> | |
<p>When used with different GIT_SVN_ID values, tags and branches in | |
SVN can be tracked this way, as can some merges where the heads | |
end up having completely equivalent content. This can even be | |
used to track branches across multiple SVN _repositories_.</p> | |
<p>This option may be specified multiple times, once for each | |
branch.</p> | |
<p>repo-config key: svn.branch</p> | |
</dd> | |
<dt> | |
-i<GIT_SVN_ID> | |
</dt> | |
<dt> | |
--id <GIT_SVN_ID> | |
</dt> | |
<dd> | |
<p> | |
This sets GIT_SVN_ID (instead of using the environment). See the | |
section on | |
<em><a href="#tracking-multiple-repos">Tracking Multiple Repositories or Branches</a></em> | |
for more information on using GIT_SVN_ID. | |
</p> | |
</dd> | |
<dt> | |
--follow-parent | |
</dt> | |
<dd> | |
<p> | |
This is especially helpful when we're tracking a directory | |
that has been moved around within the repository, or if we | |
started tracking a branch and never tracked the trunk it was | |
descended from. | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>This relies on the SVN::* libraries to work.</tt></pre> | |
</div></div> | |
<p>repo-config key: svn.followparent</p> | |
</dd> | |
<dt> | |
--no-metadata | |
</dt> | |
<dd> | |
<p> | |
This gets rid of the git-svn-id: lines at the end of every commit. | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>With this, you lose the ability to use the rebuild command. If | |
you ever lose your .git/svn/git-svn/.rev_db file, you won't be | |
able to fetch again, either. This is fine for one-shot imports.</tt></pre> | |
</div></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><tt>The 'git-svn log' command will not work on repositories using this, | |
either.</tt></pre> | |
</div></div> | |
<p>repo-config key: svn.nometadata</p> | |
</dd> | |
</dl> | |
</div> | |
<h2>COMPATIBILITY OPTIONS</h2> | |
<div class="sectionbody"> | |
<dl> | |
<dt> | |
--upgrade | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>rebuild</em> command. | |
</p> | |
<p>Run this if you used an old version of git-svn that used | |
"git-svn-HEAD" instead of "remotes/git-svn" as the branch | |
for tracking the remote.</p> | |
</dd> | |
<dt> | |
--no-ignore-externals | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>fetch</em> and <em>rebuild</em> command. | |
</p> | |
<p>This command has no effect when you are using the SVN::* | |
libraries with git, svn:externals are always avoided.</p> | |
<p>By default, git-svn passes --ignore-externals to svn to avoid | |
fetching svn:external trees into git. Pass this flag to enable | |
externals tracking directly via git.</p> | |
<p>Versions of svn that do not support --ignore-externals are | |
automatically detected and this flag will be automatically | |
enabled for them.</p> | |
<p>Otherwise, do not enable this flag unless you know what you're | |
doing.</p> | |
<p>repo-config key: svn.noignoreexternals</p> | |
</dd> | |
<dt> | |
--ignore-nodate | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>fetch</em> command. | |
</p> | |
<p>By default git-svn will crash if it tries to import a revision | |
from SVN which has <em>(no date)</em> listed as the date of the revision. | |
This is repository corruption on SVN's part, plain and simple. | |
But sometimes you really need those revisions anyway.</p> | |
<p>If supplied git-svn will convert <em>(no date)</em> entries to the UNIX | |
epoch (midnight on Jan. 1, 1970). Yes, that's probably very wrong. | |
SVN was very wrong.</p> | |
</dd> | |
</dl> | |
<h3>Basic Examples</h3> | |
<p>Tracking and contributing to a Subversion-managed project:</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt># Initialize a repo (like git init-db): | |
git-svn init http://svn.foo.org/project/trunk | |
# Fetch remote revisions: | |
git-svn fetch | |
# Create your own branch to hack on: | |
git checkout -b my-branch remotes/git-svn | |
# Do some work, and then commit your new changes to SVN, as well as | |
# automatically updating your working HEAD: | |
git-svn dcommit | |
# Something is committed to SVN, rebase the latest into your branch: | |
git-svn fetch && git rebase remotes/git-svn | |
# Append svn:ignore settings to the default git exclude file: | |
git-svn show-ignore >> .git/info/exclude</tt></pre> | |
</div></div> | |
</div> | |
<h2>REBASE VS. PULL</h2> | |
<div class="sectionbody"> | |
<p>Originally, git-svn recommended that the remotes/git-svn branch be | |
pulled from. This is because the author favored <em>git-svn commit B</em> | |
to commit a single head rather than the <em>git-svn commit A..B</em> notation | |
to commit multiple commits.</p> | |
<p>If you use <em>git-svn commit A..B</em> to commit several diffs and you do not | |
have the latest remotes/git-svn merged into my-branch, you should use | |
<em>git rebase</em> to update your work branch instead of <em>git pull</em>. <em>pull</em> | |
can cause non-linear history to be flattened when committing into SVN, | |
which can lead to merge commits reversing previous commits in SVN.</p> | |
</div> | |
<h2>DESIGN PHILOSOPHY</h2> | |
<div class="sectionbody"> | |
<p>Merge tracking in Subversion is lacking and doing branched development | |
with Subversion is cumbersome as a result. git-svn does not do | |
automated merge/branch tracking by default and leaves it entirely up to | |
the user on the git side.</p> | |
</div> | |
<h2><a id="tracking-multiple-repos"></a>TRACKING MULTIPLE REPOSITORIES OR BRANCHES</h2> | |
<div class="sectionbody"> | |
<p>Because git-svn does not care about relationships between different | |
branches or directories in a Subversion repository, git-svn has a simple | |
hack to allow it to track an arbitrary number of related _or_ unrelated | |
SVN repositories via one git repository. Simply use the --id/-i flag or | |
set the GIT_SVN_ID environment variable to a name other other than | |
"git-svn" (the default) and git-svn will ignore the contents of the | |
$GIT_DIR/svn/git-svn directory and instead do all of its work in | |
$GIT_DIR/svn/$GIT_SVN_ID for that invocation. The interface branch will | |
be remotes/$GIT_SVN_ID, instead of remotes/git-svn. Any | |
remotes/$GIT_SVN_ID branch should never be modified by the user outside | |
of git-svn commands.</p> | |
</div> | |
<h2><a id="fetch-args"></a>ADDITIONAL FETCH ARGUMENTS</h2> | |
<div class="sectionbody"> | |
<p>This is for advanced users, most users should ignore this section.</p> | |
<p>Unfetched SVN revisions may be imported as children of existing commits | |
by specifying additional arguments to <em>fetch</em>. Additional parents may | |
optionally be specified in the form of sha1 hex sums at the | |
command-line. Unfetched SVN revisions may also be tied to particular | |
git commits with the following syntax:</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt> svn_revision_number=git_commit_sha1</tt></pre> | |
</div></div> | |
<p>This allows you to tie unfetched SVN revision 375 to your current HEAD:</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt> git-svn fetch 375=$(git-rev-parse HEAD)</tt></pre> | |
</div></div> | |
<h3>Advanced Example: Tracking a Reorganized Repository</h3> | |
<p>Note: this example is now obsolete if you have SVN::* libraries | |
installed. Simply use --follow-parent when fetching.</p> | |
<p>If you're tracking a directory that has moved, or otherwise been | |
branched or tagged off of another directory in the repository and you | |
care about the full history of the project, then you can read this | |
section.</p> | |
<p>This is how Yann Dirson tracked the trunk of the ufoai directory when | |
the /trunk directory of his repository was moved to /ufoai/trunk and | |
he needed to continue tracking /ufoai/trunk where /trunk left off.</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><tt> # This log message shows when the repository was reorganized: | |
r166 | ydirson | 2006-03-02 01:36:55 +0100 (Thu, 02 Mar 2006) | 1 line | |
Changed paths: | |
D /trunk | |
A /ufoai/trunk (from /trunk:165) | |
# First we start tracking the old revisions: | |
GIT_SVN_ID=git-oldsvn git-svn init \ | |
https://svn.sourceforge.net/svnroot/ufoai/trunk | |
GIT_SVN_ID=git-oldsvn git-svn fetch -r1:165 | |
# And now, we continue tracking the new revisions: | |
GIT_SVN_ID=git-newsvn git-svn init \ | |
https://svn.sourceforge.net/svnroot/ufoai/ufoai/trunk | |
GIT_SVN_ID=git-newsvn git-svn fetch \ | |
166=`git-rev-parse refs/remotes/git-oldsvn`</tt></pre> | |
</div></div> | |
</div> | |
<h2>BUGS</h2> | |
<div class="sectionbody"> | |
<p>If you are not using the SVN::* Perl libraries and somebody commits a | |
conflicting changeset to SVN at a bad moment (right before you commit) | |
causing a conflict and your commit to fail, your svn working tree | |
($GIT_DIR/git-svn/tree) may be dirtied. The easiest thing to do is | |
probably just to rm -rf $GIT_DIR/git-svn/tree and run <em>rebuild</em>. You | |
can avoid this problem entirely by using <em>dcommit</em>.</p> | |
<p>We ignore all SVN properties except svn:executable. Too difficult to | |
map them since we rely heavily on git write-tree being _exactly_ the | |
same on both the SVN and git working trees and I prefer not to clutter | |
working trees with metadata files.</p> | |
<p>Renamed and copied directories are not detected by git and hence not | |
tracked when committing to SVN. I do not plan on adding support for | |
this as it's quite difficult and time-consuming to get working for all | |
the possible corner cases (git doesn't do it, either). Renamed and | |
copied files are fully supported if they're similar enough for git to | |
detect them.</p> | |
</div> | |
<h2>SEE ALSO</h2> | |
<div class="sectionbody"> | |
<p><a href="git-rebase.html">git-rebase(1)</a></p> | |
</div> | |
<h2>Author</h2> | |
<div class="sectionbody"> | |
<p>Written by Eric Wong <normalperson@yhbt.net>.</p> | |
</div> | |
<h2>Documentation</h2> | |
<div class="sectionbody"> | |
<p>Written by Eric Wong <normalperson@yhbt.net>.</p> | |
</div> | |
<div id="footer"> | |
<div id="footer-text"> | |
Last updated 29-Nov-2006 07:59:33 UTC | |
</div> | |
</div> | |
</body> | |
</html> |