<?xml version="1.0" encoding="UTF-8"?> | |
<!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="application/xhtml+xml; charset=UTF-8" /> | |
<meta name="generator" content="AsciiDoc 8.6.10" /> | |
<title>git-svn(1)</title> | |
<style type="text/css"> | |
/* Shared CSS for AsciiDoc xhtml11 and html5 backends */ | |
/* Default font. */ | |
body { | |
font-family: Georgia,serif; | |
} | |
/* Title font. */ | |
h1, h2, h3, h4, h5, h6, | |
div.title, caption.title, | |
thead, p.table.header, | |
#toctitle, | |
#author, #revnumber, #revdate, #revremark, | |
#footer { | |
font-family: Arial,Helvetica,sans-serif; | |
} | |
body { | |
margin: 1em 5% 1em 5%; | |
} | |
a { | |
color: blue; | |
text-decoration: underline; | |
} | |
a:visited { | |
color: fuchsia; | |
} | |
em { | |
font-style: italic; | |
color: navy; | |
} | |
strong { | |
font-weight: bold; | |
color: #083194; | |
} | |
h1, h2, h3, h4, h5, h6 { | |
color: #527bbd; | |
margin-top: 1.2em; | |
margin-bottom: 0.5em; | |
line-height: 1.3; | |
} | |
h1, h2, h3 { | |
border-bottom: 2px solid silver; | |
} | |
h2 { | |
padding-top: 0.5em; | |
} | |
h3 { | |
float: left; | |
} | |
h3 + * { | |
clear: left; | |
} | |
h5 { | |
font-size: 1.0em; | |
} | |
div.sectionbody { | |
margin-left: 0; | |
} | |
hr { | |
border: 1px solid silver; | |
} | |
p { | |
margin-top: 0.5em; | |
margin-bottom: 0.5em; | |
} | |
ul, ol, li > p { | |
margin-top: 0; | |
} | |
ul > li { color: #aaa; } | |
ul > li > * { color: black; } | |
.monospaced, code, pre { | |
font-family: "Courier New", Courier, monospace; | |
font-size: inherit; | |
color: navy; | |
padding: 0; | |
margin: 0; | |
} | |
pre { | |
white-space: pre-wrap; | |
} | |
#author { | |
color: #527bbd; | |
font-weight: bold; | |
font-size: 1.1em; | |
} | |
#email { | |
} | |
#revnumber, #revdate, #revremark { | |
} | |
#footer { | |
font-size: small; | |
border-top: 2px solid silver; | |
padding-top: 0.5em; | |
margin-top: 4.0em; | |
} | |
#footer-text { | |
float: left; | |
padding-bottom: 0.5em; | |
} | |
#footer-badges { | |
float: right; | |
padding-bottom: 0.5em; | |
} | |
#preamble { | |
margin-top: 1.5em; | |
margin-bottom: 1.5em; | |
} | |
div.imageblock, div.exampleblock, div.verseblock, | |
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock, | |
div.admonitionblock { | |
margin-top: 1.0em; | |
margin-bottom: 1.5em; | |
} | |
div.admonitionblock { | |
margin-top: 2.0em; | |
margin-bottom: 2.0em; | |
margin-right: 10%; | |
color: #606060; | |
} | |
div.content { /* Block element content. */ | |
padding: 0; | |
} | |
/* Block element titles. */ | |
div.title, caption.title { | |
color: #527bbd; | |
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 #dddddd; | |
border-left: 4px solid #f0f0f0; | |
padding: 0.5em; | |
} | |
div.listingblock > div.content { | |
border: 1px solid #dddddd; | |
border-left: 5px solid #f0f0f0; | |
background: #f8f8f8; | |
padding: 0.5em; | |
} | |
div.quoteblock, div.verseblock { | |
padding-left: 1.0em; | |
margin-left: 1.0em; | |
margin-right: 10%; | |
border-left: 5px solid #f0f0f0; | |
color: #888; | |
} | |
div.quoteblock > div.attribution { | |
padding-top: 0.5em; | |
text-align: right; | |
} | |
div.verseblock > pre.content { | |
font-family: inherit; | |
font-size: inherit; | |
} | |
div.verseblock > div.attribution { | |
padding-top: 0.75em; | |
text-align: left; | |
} | |
/* DEPRECATED: Pre version 8.2.7 verse style literal block. */ | |
div.verseblock + div.attribution { | |
text-align: left; | |
} | |
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: 3px solid #dddddd; | |
} | |
div.exampleblock > div.content { | |
border-left: 3px solid #dddddd; | |
padding-left: 0.5em; | |
} | |
div.imageblock div.content { padding-left: 0; } | |
span.image img { border-style: none; vertical-align: text-bottom; } | |
a.image:visited { color: white; } | |
dl { | |
margin-top: 0.8em; | |
margin-bottom: 0.8em; | |
} | |
dt { | |
margin-top: 0.5em; | |
margin-bottom: 0; | |
font-style: normal; | |
color: navy; | |
} | |
dd > *:first-child { | |
margin-top: 0.1em; | |
} | |
ul, ol { | |
list-style-position: outside; | |
} | |
ol.arabic { | |
list-style-type: decimal; | |
} | |
ol.loweralpha { | |
list-style-type: lower-alpha; | |
} | |
ol.upperalpha { | |
list-style-type: upper-alpha; | |
} | |
ol.lowerroman { | |
list-style-type: lower-roman; | |
} | |
ol.upperroman { | |
list-style-type: upper-roman; | |
} | |
div.compact ul, div.compact ol, | |
div.compact p, div.compact p, | |
div.compact div, div.compact div { | |
margin-top: 0.1em; | |
margin-bottom: 0.1em; | |
} | |
tfoot { | |
font-weight: bold; | |
} | |
td > div.verse { | |
white-space: pre; | |
} | |
div.hdlist { | |
margin-top: 0.8em; | |
margin-bottom: 0.8em; | |
} | |
div.hdlist tr { | |
padding-bottom: 15px; | |
} | |
dt.hdlist1.strong, td.hdlist1.strong { | |
font-weight: bold; | |
} | |
td.hdlist1 { | |
vertical-align: top; | |
font-style: normal; | |
padding-right: 0.8em; | |
color: navy; | |
} | |
td.hdlist2 { | |
vertical-align: top; | |
} | |
div.hdlist.compact tr { | |
margin: 0; | |
padding-bottom: 0; | |
} | |
.comment { | |
background: yellow; | |
} | |
.footnote, .footnoteref { | |
font-size: 0.8em; | |
} | |
span.footnote, span.footnoteref { | |
vertical-align: super; | |
} | |
#footnotes { | |
margin: 20px 0 20px 0; | |
padding: 7px 0 0 0; | |
} | |
#footnotes div.footnote { | |
margin: 0 0 5px 0; | |
} | |
#footnotes hr { | |
border: none; | |
border-top: 1px solid silver; | |
height: 1px; | |
text-align: left; | |
margin-left: 0; | |
width: 20%; | |
min-width: 100px; | |
} | |
div.colist td { | |
padding-right: 0.5em; | |
padding-bottom: 0.3em; | |
vertical-align: top; | |
} | |
div.colist td img { | |
margin-top: 0.3em; | |
} | |
@media print { | |
#footer-badges { display: none; } | |
} | |
#toc { | |
margin-bottom: 2.5em; | |
} | |
#toctitle { | |
color: #527bbd; | |
font-size: 1.1em; | |
font-weight: bold; | |
margin-top: 1.0em; | |
margin-bottom: 0.1em; | |
} | |
div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 { | |
margin-top: 0; | |
margin-bottom: 0; | |
} | |
div.toclevel2 { | |
margin-left: 2em; | |
font-size: 0.9em; | |
} | |
div.toclevel3 { | |
margin-left: 4em; | |
font-size: 0.9em; | |
} | |
div.toclevel4 { | |
margin-left: 6em; | |
font-size: 0.9em; | |
} | |
span.aqua { color: aqua; } | |
span.black { color: black; } | |
span.blue { color: blue; } | |
span.fuchsia { color: fuchsia; } | |
span.gray { color: gray; } | |
span.green { color: green; } | |
span.lime { color: lime; } | |
span.maroon { color: maroon; } | |
span.navy { color: navy; } | |
span.olive { color: olive; } | |
span.purple { color: purple; } | |
span.red { color: red; } | |
span.silver { color: silver; } | |
span.teal { color: teal; } | |
span.white { color: white; } | |
span.yellow { color: yellow; } | |
span.aqua-background { background: aqua; } | |
span.black-background { background: black; } | |
span.blue-background { background: blue; } | |
span.fuchsia-background { background: fuchsia; } | |
span.gray-background { background: gray; } | |
span.green-background { background: green; } | |
span.lime-background { background: lime; } | |
span.maroon-background { background: maroon; } | |
span.navy-background { background: navy; } | |
span.olive-background { background: olive; } | |
span.purple-background { background: purple; } | |
span.red-background { background: red; } | |
span.silver-background { background: silver; } | |
span.teal-background { background: teal; } | |
span.white-background { background: white; } | |
span.yellow-background { background: yellow; } | |
span.big { font-size: 2em; } | |
span.small { font-size: 0.6em; } | |
span.underline { text-decoration: underline; } | |
span.overline { text-decoration: overline; } | |
span.line-through { text-decoration: line-through; } | |
div.unbreakable { page-break-inside: avoid; } | |
/* | |
* xhtml11 specific | |
* | |
* */ | |
div.tableblock { | |
margin-top: 1.0em; | |
margin-bottom: 1.5em; | |
} | |
div.tableblock > table { | |
border: 3px solid #527bbd; | |
} | |
thead, p.table.header { | |
font-weight: bold; | |
color: #527bbd; | |
} | |
p.table { | |
margin-top: 0; | |
} | |
/* Because the table frame attribute is overriden by CSS in most browsers. */ | |
div.tableblock > table[frame="void"] { | |
border-style: none; | |
} | |
div.tableblock > table[frame="hsides"] { | |
border-left-style: none; | |
border-right-style: none; | |
} | |
div.tableblock > table[frame="vsides"] { | |
border-top-style: none; | |
border-bottom-style: none; | |
} | |
/* | |
* html5 specific | |
* | |
* */ | |
table.tableblock { | |
margin-top: 1.0em; | |
margin-bottom: 1.5em; | |
} | |
thead, p.tableblock.header { | |
font-weight: bold; | |
color: #527bbd; | |
} | |
p.tableblock { | |
margin-top: 0; | |
} | |
table.tableblock { | |
border-width: 3px; | |
border-spacing: 0px; | |
border-style: solid; | |
border-color: #527bbd; | |
border-collapse: collapse; | |
} | |
th.tableblock, td.tableblock { | |
border-width: 1px; | |
padding: 4px; | |
border-style: solid; | |
border-color: #527bbd; | |
} | |
table.tableblock.frame-topbot { | |
border-left-style: hidden; | |
border-right-style: hidden; | |
} | |
table.tableblock.frame-sides { | |
border-top-style: hidden; | |
border-bottom-style: hidden; | |
} | |
table.tableblock.frame-none { | |
border-style: hidden; | |
} | |
th.tableblock.halign-left, td.tableblock.halign-left { | |
text-align: left; | |
} | |
th.tableblock.halign-center, td.tableblock.halign-center { | |
text-align: center; | |
} | |
th.tableblock.halign-right, td.tableblock.halign-right { | |
text-align: right; | |
} | |
th.tableblock.valign-top, td.tableblock.valign-top { | |
vertical-align: top; | |
} | |
th.tableblock.valign-middle, td.tableblock.valign-middle { | |
vertical-align: middle; | |
} | |
th.tableblock.valign-bottom, td.tableblock.valign-bottom { | |
vertical-align: bottom; | |
} | |
/* | |
* manpage specific | |
* | |
* */ | |
body.manpage h1 { | |
padding-top: 0.5em; | |
padding-bottom: 0.5em; | |
border-top: 2px solid silver; | |
border-bottom: 2px solid silver; | |
} | |
body.manpage h2 { | |
border-style: none; | |
} | |
body.manpage div.sectionbody { | |
margin-left: 3em; | |
} | |
@media print { | |
body.manpage div#toc { display: none; } | |
} | |
</style> | |
<script type="text/javascript"> | |
/*<![CDATA[*/ | |
var asciidoc = { // Namespace. | |
///////////////////////////////////////////////////////////////////// | |
// Table Of Contents generator | |
///////////////////////////////////////////////////////////////////// | |
/* Author: Mihai Bazon, September 2002 | |
* http://students.infoiasi.ro/~mishoo | |
* | |
* Table Of Content generator | |
* Version: 0.4 | |
* | |
* Feel free to use this script under the terms of the GNU General Public | |
* License, as long as you do not remove or alter this notice. | |
*/ | |
/* modified by Troy D. Hanson, September 2006. License: GPL */ | |
/* modified by Stuart Rackham, 2006, 2009. License: GPL */ | |
// toclevels = 1..4. | |
toc: function (toclevels) { | |
function getText(el) { | |
var text = ""; | |
for (var i = el.firstChild; i != null; i = i.nextSibling) { | |
if (i.nodeType == 3 /* Node.TEXT_NODE */) // IE doesn't speak constants. | |
text += i.data; | |
else if (i.firstChild != null) | |
text += getText(i); | |
} | |
return text; | |
} | |
function TocEntry(el, text, toclevel) { | |
this.element = el; | |
this.text = text; | |
this.toclevel = toclevel; | |
} | |
function tocEntries(el, toclevels) { | |
var result = new Array; | |
var re = new RegExp('[hH]([1-'+(toclevels+1)+'])'); | |
// Function that scans the DOM tree for header elements (the DOM2 | |
// nodeIterator API would be a better technique but not supported by all | |
// browsers). | |
var iterate = function (el) { | |
for (var i = el.firstChild; i != null; i = i.nextSibling) { | |
if (i.nodeType == 1 /* Node.ELEMENT_NODE */) { | |
var mo = re.exec(i.tagName); | |
if (mo && (i.getAttribute("class") || i.getAttribute("className")) != "float") { | |
result[result.length] = new TocEntry(i, getText(i), mo[1]-1); | |
} | |
iterate(i); | |
} | |
} | |
} | |
iterate(el); | |
return result; | |
} | |
var toc = document.getElementById("toc"); | |
if (!toc) { | |
return; | |
} | |
// Delete existing TOC entries in case we're reloading the TOC. | |
var tocEntriesToRemove = []; | |
var i; | |
for (i = 0; i < toc.childNodes.length; i++) { | |
var entry = toc.childNodes[i]; | |
if (entry.nodeName.toLowerCase() == 'div' | |
&& entry.getAttribute("class") | |
&& entry.getAttribute("class").match(/^toclevel/)) | |
tocEntriesToRemove.push(entry); | |
} | |
for (i = 0; i < tocEntriesToRemove.length; i++) { | |
toc.removeChild(tocEntriesToRemove[i]); | |
} | |
// Rebuild TOC entries. | |
var entries = tocEntries(document.getElementById("content"), toclevels); | |
for (var i = 0; i < entries.length; ++i) { | |
var entry = entries[i]; | |
if (entry.element.id == "") | |
entry.element.id = "_toc_" + i; | |
var a = document.createElement("a"); | |
a.href = "#" + entry.element.id; | |
a.appendChild(document.createTextNode(entry.text)); | |
var div = document.createElement("div"); | |
div.appendChild(a); | |
div.className = "toclevel" + entry.toclevel; | |
toc.appendChild(div); | |
} | |
if (entries.length == 0) | |
toc.parentNode.removeChild(toc); | |
}, | |
///////////////////////////////////////////////////////////////////// | |
// Footnotes generator | |
///////////////////////////////////////////////////////////////////// | |
/* Based on footnote generation code from: | |
* http://www.brandspankingnew.net/archive/2005/07/format_footnote.html | |
*/ | |
footnotes: function () { | |
// Delete existing footnote entries in case we're reloading the footnodes. | |
var i; | |
var noteholder = document.getElementById("footnotes"); | |
if (!noteholder) { | |
return; | |
} | |
var entriesToRemove = []; | |
for (i = 0; i < noteholder.childNodes.length; i++) { | |
var entry = noteholder.childNodes[i]; | |
if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute("class") == "footnote") | |
entriesToRemove.push(entry); | |
} | |
for (i = 0; i < entriesToRemove.length; i++) { | |
noteholder.removeChild(entriesToRemove[i]); | |
} | |
// Rebuild footnote entries. | |
var cont = document.getElementById("content"); | |
var spans = cont.getElementsByTagName("span"); | |
var refs = {}; | |
var n = 0; | |
for (i=0; i<spans.length; i++) { | |
if (spans[i].className == "footnote") { | |
n++; | |
var note = spans[i].getAttribute("data-note"); | |
if (!note) { | |
// Use [\s\S] in place of . so multi-line matches work. | |
// Because JavaScript has no s (dotall) regex flag. | |
note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[1]; | |
spans[i].innerHTML = | |
"[<a id='_footnoteref_" + n + "' href='#_footnote_" + n + | |
"' title='View footnote' class='footnote'>" + n + "</a>]"; | |
spans[i].setAttribute("data-note", note); | |
} | |
noteholder.innerHTML += | |
"<div class='footnote' id='_footnote_" + n + "'>" + | |
"<a href='#_footnoteref_" + n + "' title='Return to text'>" + | |
n + "</a>. " + note + "</div>"; | |
var id =spans[i].getAttribute("id"); | |
if (id != null) refs["#"+id] = n; | |
} | |
} | |
if (n == 0) | |
noteholder.parentNode.removeChild(noteholder); | |
else { | |
// Process footnoterefs. | |
for (i=0; i<spans.length; i++) { | |
if (spans[i].className == "footnoteref") { | |
var href = spans[i].getElementsByTagName("a")[0].getAttribute("href"); | |
href = href.match(/#.*/)[0]; // Because IE return full URL. | |
n = refs[href]; | |
spans[i].innerHTML = | |
"[<a href='#_footnote_" + n + | |
"' title='View footnote' class='footnote'>" + n + "</a>]"; | |
} | |
} | |
} | |
}, | |
install: function(toclevels) { | |
var timerId; | |
function reinstall() { | |
asciidoc.footnotes(); | |
if (toclevels) { | |
asciidoc.toc(toclevels); | |
} | |
} | |
function reinstallAndRemoveTimer() { | |
clearInterval(timerId); | |
reinstall(); | |
} | |
timerId = setInterval(reinstall, 500); | |
if (document.addEventListener) | |
document.addEventListener("DOMContentLoaded", reinstallAndRemoveTimer, false); | |
else | |
window.onload = reinstallAndRemoveTimer; | |
} | |
} | |
asciidoc.install(); | |
/*]]>*/ | |
</script> | |
</head> | |
<body class="manpage"> | |
<div id="header"> | |
<h1> | |
git-svn(1) Manual Page | |
</h1> | |
<h2>NAME</h2> | |
<div class="sectionbody"> | |
<p>git-svn - | |
Bidirectional operation between a Subversion repository and Git | |
</p> | |
</div> | |
</div> | |
<div id="content"> | |
<div class="sect1"> | |
<h2 id="_synopsis">SYNOPSIS</h2> | |
<div class="sectionbody"> | |
<div class="verseblock"> | |
<pre class="content"><em>git svn</em> <command> [<options>] [<arguments>]</pre> | |
<div class="attribution"> | |
</div></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_description">DESCRIPTION</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p><em>git svn</em> is a simple conduit for changesets between Subversion and Git. | |
It provides a bidirectional flow of changes between a Subversion and a Git | |
repository.</p></div> | |
<div class="paragraph"><p><em>git svn</em> can track a standard Subversion repository, | |
following the common "trunk/branches/tags" layout, with the --stdlayout option. | |
It can also follow branches and tags in any layout with the -T/-t/-b options | |
(see options to <em>init</em> below, and also the <em>clone</em> command).</p></div> | |
<div class="paragraph"><p>Once tracking a Subversion repository (with any of the above methods), the Git | |
repository can be updated from Subversion by the <em>fetch</em> command and | |
Subversion updated from Git by the <em>dcommit</em> command.</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_commands">COMMANDS</h2> | |
<div class="sectionbody"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
<em>init</em> | |
</dt> | |
<dd> | |
<p> | |
Initializes an empty Git repository with additional | |
metadata directories for <em>git svn</em>. The Subversion URL | |
may be specified as a command-line argument, or as full | |
URL arguments to -T/-t/-b. Optionally, the target | |
directory to operate on can be specified as a second | |
argument. Normally this command initializes the current | |
directory. | |
</p> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-T<trunk_subdir> | |
</dt> | |
<dt class="hdlist1"> | |
--trunk=<trunk_subdir> | |
</dt> | |
<dt class="hdlist1"> | |
-t<tags_subdir> | |
</dt> | |
<dt class="hdlist1"> | |
--tags=<tags_subdir> | |
</dt> | |
<dt class="hdlist1"> | |
-b<branches_subdir> | |
</dt> | |
<dt class="hdlist1"> | |
--branches=<branches_subdir> | |
</dt> | |
<dt class="hdlist1"> | |
-s | |
</dt> | |
<dt class="hdlist1"> | |
--stdlayout | |
</dt> | |
<dd> | |
<p> | |
These are optional command-line options for init. Each of | |
these flags can point to a relative repository path | |
(--tags=project/tags) or a full url | |
(--tags=https://foo.org/project/tags). | |
You can specify more than one --tags and/or --branches options, in case | |
your Subversion repository places tags or branches under multiple paths. | |
The option --stdlayout is | |
a shorthand way of setting trunk,tags,branches as the relative paths, | |
which is the Subversion default. If any of the other options are given | |
as well, they take precedence. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--no-metadata | |
</dt> | |
<dd> | |
<p> | |
Set the <em>noMetadata</em> option in the [svn-remote] config. | |
This option is not recommended, please read the <em>svn.noMetadata</em> | |
section of this manpage before using this option. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--use-svm-props | |
</dt> | |
<dd> | |
<p> | |
Set the <em>useSvmProps</em> option in the [svn-remote] config. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--use-svnsync-props | |
</dt> | |
<dd> | |
<p> | |
Set the <em>useSvnsyncProps</em> option in the [svn-remote] config. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--rewrite-root=<URL> | |
</dt> | |
<dd> | |
<p> | |
Set the <em>rewriteRoot</em> option in the [svn-remote] config. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--rewrite-uuid=<UUID> | |
</dt> | |
<dd> | |
<p> | |
Set the <em>rewriteUUID</em> option in the [svn-remote] config. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--username=<user> | |
</dt> | |
<dd> | |
<p> | |
For transports that SVN handles authentication for (http, | |
https, and plain svn), specify the username. For other | |
transports (e.g. <code>svn+ssh://</code>), you must include the username in | |
the URL, e.g. <code>svn+ssh://foo@svn.bar.com/project</code> | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--prefix=<prefix> | |
</dt> | |
<dd> | |
<p> | |
This allows one to specify a prefix which is prepended | |
to the names of remotes if trunk/branches/tags are | |
specified. The prefix does not automatically include a | |
trailing slash, so be sure you include one in the | |
argument if that is what you want. If --branches/-b is | |
specified, the prefix must include a trailing slash. | |
Setting a prefix (with a trailing slash) is strongly | |
encouraged in any case, as your SVN-tracking refs will | |
then be located at "refs/remotes/$prefix/<strong>", which is | |
compatible with Git’s own remote-tracking ref layout | |
(refs/remotes/$remote/</strong>). Setting a prefix is also useful | |
if you wish to track multiple projects that share a common | |
repository. | |
By default, the prefix is set to <em>origin/</em>. | |
</p> | |
<div class="admonitionblock"> | |
<table><tr> | |
<td class="icon"> | |
<div class="title">Note</div> | |
</td> | |
<td class="content">Before Git v2.0, the default prefix was "" (no prefix). This | |
meant that SVN-tracking refs were put at "refs/remotes/*", which is | |
incompatible with how Git’s own remote-tracking refs are organized. | |
If you still want the old default, you can get it by passing | |
<code>--prefix ""</code> on the command line (<code>--prefix=""</code> may not work if | |
your Perl’s Getopt::Long is < v2.37).</td> | |
</tr></table> | |
</div> | |
</dd> | |
<dt class="hdlist1"> | |
--ignore-refs=<regex> | |
</dt> | |
<dd> | |
<p> | |
When passed to <em>init</em> or <em>clone</em> this regular expression will | |
be preserved as a config key. See <em>fetch</em> for a description | |
of <code>--ignore-refs</code>. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--ignore-paths=<regex> | |
</dt> | |
<dd> | |
<p> | |
When passed to <em>init</em> or <em>clone</em> this regular expression will | |
be preserved as a config key. See <em>fetch</em> for a description | |
of <code>--ignore-paths</code>. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--include-paths=<regex> | |
</dt> | |
<dd> | |
<p> | |
When passed to <em>init</em> or <em>clone</em> this regular expression will | |
be preserved as a config key. See <em>fetch</em> for a description | |
of <code>--include-paths</code>. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--no-minimize-url | |
</dt> | |
<dd> | |
<p> | |
When tracking multiple directories (using --stdlayout, | |
--branches, or --tags options), git svn will attempt to connect | |
to the root (or highest allowed level) of the Subversion | |
repository. This default allows better tracking of history if | |
entire projects are moved within a repository, but may cause | |
issues on repositories where read access restrictions are in | |
place. Passing <code>--no-minimize-url</code> will allow git svn to | |
accept URLs as-is without attempting to connect to a higher | |
level directory. This option is off by default when only | |
one URL/branch is tracked (it would do little good). | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>fetch</em> | |
</dt> | |
<dd> | |
<p> | |
Fetch unfetched revisions from the Subversion remote we are | |
tracking. The name of the [svn-remote "…"] section in the | |
$GIT_DIR/config file may be specified as an optional | |
command-line argument. | |
</p> | |
<div class="paragraph"><p>This automatically updates the rev_map if needed (see | |
<em>$GIT_DIR/svn/**/.rev_map.*</em> in the FILES section below for details).</p></div> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
--localtime | |
</dt> | |
<dd> | |
<p> | |
Store Git commit times in the local time zone instead of UTC. This | |
makes <em>git log</em> (even without --date=local) show the same times | |
that <code>svn log</code> would in the local time zone. | |
</p> | |
<div class="paragraph"><p>This doesn’t interfere with interoperating with the Subversion | |
repository you cloned from, but if you wish for your local Git | |
repository to be able to interoperate with someone else’s local Git | |
repository, either don’t use this option or you should both use it in | |
the same local time zone.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--parent | |
</dt> | |
<dd> | |
<p> | |
Fetch only from the SVN parent of the current HEAD. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--ignore-refs=<regex> | |
</dt> | |
<dd> | |
<p> | |
Ignore refs for branches or tags matching the Perl regular | |
expression. A "negative look-ahead assertion" like | |
<code>^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$</code> | |
can be used to allow only certain refs. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn-remote.<name>.ignore-refs</pre> | |
<div class="attribution"> | |
</div></div> | |
<div class="paragraph"><p>If the ignore-refs configuration key is set, and the command-line | |
option is also given, both regular expressions will be used.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--ignore-paths=<regex> | |
</dt> | |
<dd> | |
<p> | |
This allows one to specify a Perl regular expression that will | |
cause skipping of all matching paths from checkout from SVN. | |
The <code>--ignore-paths</code> option should match for every <em>fetch</em> | |
(including automatic fetches due to <em>clone</em>, <em>dcommit</em>, | |
<em>rebase</em>, etc) on a given repository. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn-remote.<name>.ignore-paths</pre> | |
<div class="attribution"> | |
</div></div> | |
<div class="paragraph"><p>If the ignore-paths configuration key is set, and the command-line | |
option is also given, both regular expressions will be used.</p></div> | |
<div class="paragraph"><p>Examples:</p></div> | |
<div class="openblock"> | |
<div class="content"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
Skip "doc*" directory for every fetch | |
</dt> | |
<dd> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>--ignore-paths="^doc"</code></pre> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
Skip "branches" and "tags" of first level directories | |
</dt> | |
<dd> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>--ignore-paths="^[^/]+/(?:branches|tags)"</code></pre> | |
</div></div> | |
</dd> | |
</dl></div> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
--include-paths=<regex> | |
</dt> | |
<dd> | |
<p> | |
This allows one to specify a Perl regular expression that will | |
cause the inclusion of only matching paths from checkout from SVN. | |
The <code>--include-paths</code> option should match for every <em>fetch</em> | |
(including automatic fetches due to <em>clone</em>, <em>dcommit</em>, | |
<em>rebase</em>, etc) on a given repository. <code>--ignore-paths</code> takes | |
precedence over <code>--include-paths</code>. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn-remote.<name>.include-paths</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
--log-window-size=<n> | |
</dt> | |
<dd> | |
<p> | |
Fetch <n> log entries per request when scanning Subversion history. | |
The default is 100. For very large Subversion repositories, larger | |
values may be needed for <em>clone</em>/<em>fetch</em> to complete in reasonable | |
time. But overly large values may lead to higher memory usage and | |
request timeouts. | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>clone</em> | |
</dt> | |
<dd> | |
<p> | |
Runs <em>init</em> and <em>fetch</em>. It will automatically create a | |
directory based on the basename of the URL passed to it; | |
or if a second argument is passed; it will create a directory | |
and work within that. It accepts all arguments that the | |
<em>init</em> and <em>fetch</em> commands accept; with the exception of | |
<code>--fetch-all</code> and <code>--parent</code>. After a repository is cloned, | |
the <em>fetch</em> command will be able to update revisions without | |
affecting the working tree; and the <em>rebase</em> command will be | |
able to update the working tree with the latest changes. | |
</p> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
--preserve-empty-dirs | |
</dt> | |
<dd> | |
<p> | |
Create a placeholder file in the local Git repository for each | |
empty directory fetched from Subversion. This includes directories | |
that become empty by removing all entries in the Subversion | |
repository (but not the directory itself). The placeholder files | |
are also tracked and removed when no longer necessary. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--placeholder-filename=<filename> | |
</dt> | |
<dd> | |
<p> | |
Set the name of placeholder files created by --preserve-empty-dirs. | |
Default: ".gitignore" | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>rebase</em> | |
</dt> | |
<dd> | |
<p> | |
This fetches revisions from the SVN parent of the current HEAD | |
and rebases the current (uncommitted to SVN) work against it. | |
</p> | |
<div class="paragraph"><p>This works similarly to <code>svn update</code> or <em>git pull</em> except that | |
it preserves linear history with <em>git rebase</em> instead of | |
<em>git merge</em> for ease of dcommitting with <em>git svn</em>.</p></div> | |
<div class="paragraph"><p>This accepts all options that <em>git svn fetch</em> and <em>git rebase</em> | |
accept. However, <code>--fetch-all</code> only fetches from the current | |
[svn-remote], and not all [svn-remote] definitions.</p></div> | |
<div class="paragraph"><p>Like <em>git rebase</em>; this requires that the working tree be clean | |
and have no uncommitted changes.</p></div> | |
<div class="paragraph"><p>This automatically updates the rev_map if needed (see | |
<em>$GIT_DIR/svn/**/.rev_map.*</em> in the FILES section below for details).</p></div> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-l | |
</dt> | |
<dt class="hdlist1"> | |
--local | |
</dt> | |
<dd> | |
<p> | |
Do not fetch remotely; only run <em>git rebase</em> against the | |
last fetched commit from the upstream SVN. | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>dcommit</em> | |
</dt> | |
<dd> | |
<p> | |
Commit each diff from the current branch directly to the SVN | |
repository, and then rebase or reset (depending on whether or | |
not there is a diff between SVN and head). This will create | |
a revision in SVN for each commit in Git. | |
</p> | |
<div class="paragraph"><p>When an optional Git branch name (or a Git commit object name) | |
is specified as an argument, the subcommand works on the specified | |
branch, not on the current branch.</p></div> | |
<div class="paragraph"><p>Use of <em>dcommit</em> is preferred to <em>set-tree</em> (below).</p></div> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
--no-rebase | |
</dt> | |
<dd> | |
<p> | |
After committing, do not rebase or reset. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--commit-url <URL> | |
</dt> | |
<dd> | |
<p> | |
Commit to this SVN URL (the full path). This is intended to | |
allow existing <em>git svn</em> repositories created with one transport | |
method (e.g. <code>svn://</code> or <code>http://</code> for anonymous read) to be | |
reused if a user is later given access to an alternate transport | |
method (e.g. <code>svn+ssh://</code> or <code>https://</code>) for commit. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn-remote.<name>.commiturl | |
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)</pre> | |
<div class="attribution"> | |
</div></div> | |
<div class="paragraph"><p>Note that the SVN URL of the commiturl config key includes the SVN branch. | |
If you rather want to set the commit URL for an entire SVN repository use | |
svn-remote.<name>.pushurl instead.</p></div> | |
<div class="paragraph"><p>Using this option for any other purpose (don’t ask) is very strongly | |
discouraged.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--mergeinfo=<mergeinfo> | |
</dt> | |
<dd> | |
<p> | |
Add the given merge information during the dcommit | |
(e.g. <code>--mergeinfo="/branches/foo:1-10"</code>). All svn server versions can | |
store this information (as a property), and svn clients starting from | |
version 1.5 can make use of it. To specify merge information from multiple | |
branches, use a single space character between the branches | |
(<code>--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8"</code>) | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.pushmergeinfo</pre> | |
<div class="attribution"> | |
</div></div> | |
<div class="paragraph"><p>This option will cause git-svn to attempt to automatically populate the | |
svn:mergeinfo property in the SVN repository when possible. Currently, this can | |
only be done when dcommitting non-fast-forward merges where all parents but the | |
first have already been pushed into SVN.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--interactive | |
</dt> | |
<dd> | |
<p> | |
Ask the user to confirm that a patch set should actually be sent to SVN. | |
For each patch, one may answer "yes" (accept this patch), "no" (discard this | |
patch), "all" (accept all patches), or "quit". | |
</p> | |
<div class="paragraph"><p><em>git svn dcommit</em> returns immediately if answer is "no" or "quit", without | |
committing anything to SVN.</p></div> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>branch</em> | |
</dt> | |
<dd> | |
<p> | |
Create a branch in the SVN repository. | |
</p> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-m | |
</dt> | |
<dt class="hdlist1"> | |
--message | |
</dt> | |
<dd> | |
<p> | |
Allows to specify the commit message. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-t | |
</dt> | |
<dt class="hdlist1"> | |
--tag | |
</dt> | |
<dd> | |
<p> | |
Create a tag by using the tags_subdir instead of the branches_subdir | |
specified during git svn init. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-d<path> | |
</dt> | |
<dt class="hdlist1"> | |
--destination=<path> | |
</dt> | |
<dd> | |
<p> | |
If more than one --branches (or --tags) option was given to the <em>init</em> | |
or <em>clone</em> command, you must provide the location of the branch (or | |
tag) you wish to create in the SVN repository. <path> specifies which | |
path to use to create the branch or tag and should match the pattern | |
on the left-hand side of one of the configured branches or tags | |
refspecs. You can see these refspecs with the commands | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><code>git config --get-all svn-remote.<name>.branches | |
git config --get-all svn-remote.<name>.tags</code></pre> | |
</div></div> | |
<div class="paragraph"><p>where <name> is the name of the SVN repository as specified by the -R option to | |
<em>init</em> (or "svn" by default).</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--username | |
</dt> | |
<dd> | |
<p> | |
Specify the SVN username to perform the commit as. This option overrides | |
the <em>username</em> configuration property. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--commit-url | |
</dt> | |
<dd> | |
<p> | |
Use the specified URL to connect to the destination Subversion | |
repository. This is useful in cases where the source SVN | |
repository is read-only. This option overrides configuration | |
property <em>commiturl</em>. | |
</p> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><code>git config --get-all svn-remote.<name>.commiturl</code></pre> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
--parents | |
</dt> | |
<dd> | |
<p> | |
Create parent folders. This parameter is equivalent to the parameter | |
--parents on svn cp commands and is useful for non-standard repository | |
layouts. | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>tag</em> | |
</dt> | |
<dd> | |
<p> | |
Create a tag in the SVN repository. This is a shorthand for | |
<em>branch -t</em>. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<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="paragraph"><p>The following features from ‘svn log’ are supported:</p></div> | |
<div class="openblock"> | |
<div class="content"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-r <n>[:<n>] | |
</dt> | |
<dt class="hdlist1"> | |
--revision=<n>[:<n>] | |
</dt> | |
<dd> | |
<p> | |
is supported, non-numeric args are not: | |
HEAD, NEXT, BASE, PREV, etc … | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-v | |
</dt> | |
<dt class="hdlist1"> | |
--verbose | |
</dt> | |
<dd> | |
<p> | |
it’s not completely compatible with the --verbose | |
output in svn log, but reasonably close. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--limit=<n> | |
</dt> | |
<dd> | |
<p> | |
is NOT the same as --max-count, doesn’t count | |
merged/excluded commits | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--incremental | |
</dt> | |
<dd> | |
<p> | |
supported | |
</p> | |
</dd> | |
</dl></div> | |
</div></div> | |
<div class="paragraph"><p>New features:</p></div> | |
<div class="openblock"> | |
<div class="content"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
--show-commit | |
</dt> | |
<dd> | |
<p> | |
shows the Git commit sha1, as well | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--oneline | |
</dt> | |
<dd> | |
<p> | |
our version of --pretty=oneline | |
</p> | |
</dd> | |
</dl></div> | |
</div></div> | |
<div class="admonitionblock"> | |
<table><tr> | |
<td class="icon"> | |
<div class="title">Note</div> | |
</td> | |
<td class="content">SVN itself only stores times in UTC and nothing else. The regular svn | |
client converts the UTC time to the local time (or based on the TZ= | |
environment). This command has the same behaviour.</td> | |
</tr></table> | |
</div> | |
<div class="paragraph"><p>Any other arguments are passed directly to <em>git log</em></p></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>blame</em> | |
</dt> | |
<dd> | |
<p> | |
Show what revision and author last modified each line of a file. The | |
output of this mode is format-compatible with the output of | |
‘svn blame’ by default. Like the SVN blame command, | |
local uncommitted changes in the working tree are ignored; | |
the version of the file in the HEAD revision is annotated. Unknown | |
arguments are passed directly to <em>git blame</em>. | |
</p> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
--git-format | |
</dt> | |
<dd> | |
<p> | |
Produce output in the same format as <em>git blame</em>, but with | |
SVN revision numbers instead of Git commit hashes. In this mode, | |
changes that haven’t been committed to SVN (including local | |
working-copy edits) are shown as revision 0. | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>find-rev</em> | |
</dt> | |
<dd> | |
<p> | |
When given an SVN revision number of the form <em>rN</em>, returns the | |
corresponding Git commit hash (this can optionally be followed by a | |
tree-ish to specify which branch should be searched). When given a | |
tree-ish, returns the corresponding SVN revision number. | |
</p> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-B | |
</dt> | |
<dt class="hdlist1"> | |
--before | |
</dt> | |
<dd> | |
<p> | |
Don’t require an exact match if given an SVN revision, instead find | |
the commit corresponding to the state of the SVN repository (on the | |
current branch) at the specified revision. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-A | |
</dt> | |
<dt class="hdlist1"> | |
--after | |
</dt> | |
<dd> | |
<p> | |
Don’t require an exact match if given an SVN revision; if there is | |
not an exact match return the closest match searching forward in the | |
history. | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>set-tree</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 <em>git svn</em> functions. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>create-ignore</em> | |
</dt> | |
<dd> | |
<p> | |
Recursively finds the svn:ignore property on directories and | |
creates matching .gitignore files. The resulting files are staged to | |
be committed, but are not committed. Use -r/--revision to refer to a | |
specific revision. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<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 class="hdlist1"> | |
<em>mkdirs</em> | |
</dt> | |
<dd> | |
<p> | |
Attempts to recreate empty directories that core Git cannot track | |
based on information in $GIT_DIR/svn/<refname>/unhandled.log files. | |
Empty directories are automatically recreated when using | |
"git svn clone" and "git svn rebase", so "mkdirs" is intended | |
for use after commands like "git checkout" or "git reset". | |
(See the svn-remote.<name>.automkdirs config file option for | |
more information.) | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>commit-diff</em> | |
</dt> | |
<dd> | |
<p> | |
Commits the diff of two tree-ish arguments from the | |
command-line. This command does not rely on being inside a <code>git svn | |
init</code>-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 <em>git svn</em>-aware | |
repository (that has been <code>init</code>-ed with <em>git svn</em>). | |
The -r<revision> option is required for this. | |
</p> | |
<div class="paragraph"><p>The commit message is supplied either directly with the <code>-m</code> or <code>-F</code> | |
option, or indirectly from the tag or commit when the second tree-ish | |
denotes such an object, or it is requested by invoking an editor (see | |
<code>--edit</code> option below).</p></div> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-m <msg> | |
</dt> | |
<dt class="hdlist1"> | |
--message=<msg> | |
</dt> | |
<dd> | |
<p> | |
Use the given <code>msg</code> as the commit message. This option | |
disables the <code>--edit</code> option. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-F <filename> | |
</dt> | |
<dt class="hdlist1"> | |
--file=<filename> | |
</dt> | |
<dd> | |
<p> | |
Take the commit message from the given file. This option | |
disables the <code>--edit</code> option. | |
</p> | |
</dd> | |
</dl></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>info</em> | |
</dt> | |
<dd> | |
<p> | |
Shows information about a file or directory similar to what | |
‘svn info’ provides. Does not currently support a -r/--revision | |
argument. Use the --url option to output only the value of the | |
<em>URL:</em> field. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>proplist</em> | |
</dt> | |
<dd> | |
<p> | |
Lists the properties stored in the Subversion repository about a | |
given file or directory. Use -r/--revision to refer to a specific | |
Subversion revision. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>propget</em> | |
</dt> | |
<dd> | |
<p> | |
Gets the Subversion property given as the first argument, for a | |
file. A specific revision can be specified with -r/--revision. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>propset</em> | |
</dt> | |
<dd> | |
<p> | |
Sets the Subversion property given as the first argument, to the | |
value given as the second argument for the file given as the | |
third argument. | |
</p> | |
<div class="paragraph"><p>Example:</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile</code></pre> | |
</div></div> | |
<div class="paragraph"><p>This will set the property <em>svn:keywords</em> to <em>FreeBSD=%H</em> for the file | |
<em>devel/py-tipper/Makefile</em>.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
<em>show-externals</em> | |
</dt> | |
<dd> | |
<p> | |
Shows the Subversion externals. Use -r/--revision to specify a | |
specific revision. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>gc</em> | |
</dt> | |
<dd> | |
<p> | |
Compress $GIT_DIR/svn/<refname>/unhandled.log files and remove | |
$GIT_DIR/svn/<refname>/index files. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
<em>reset</em> | |
</dt> | |
<dd> | |
<p> | |
Undoes the effects of <em>fetch</em> back to the specified revision. | |
This allows you to re-<em>fetch</em> an SVN revision. Normally the | |
contents of an SVN revision should never change and <em>reset</em> | |
should not be necessary. However, if SVN permissions change, | |
or if you alter your --ignore-paths option, a <em>fetch</em> may fail | |
with "not found in commit" (file not previously visible) or | |
"checksum mismatch" (missed a modification). If the problem | |
file cannot be ignored forever (with --ignore-paths) the only | |
way to repair the repo is to use <em>reset</em>. | |
</p> | |
<div class="paragraph"><p>Only the rev_map and refs/remotes/git-svn are changed (see | |
<em>$GIT_DIR/svn/**/.rev_map.*</em> in the FILES section below for details). | |
Follow <em>reset</em> with a <em>fetch</em> and then <em>git reset</em> or <em>git rebase</em> to | |
move local branches onto the new tree.</p></div> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-r <n> | |
</dt> | |
<dt class="hdlist1"> | |
--revision=<n> | |
</dt> | |
<dd> | |
<p> | |
Specify the most recent revision to keep. All later revisions | |
are discarded. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-p | |
</dt> | |
<dt class="hdlist1"> | |
--parent | |
</dt> | |
<dd> | |
<p> | |
Discard the specified revision as well, keeping the nearest | |
parent instead. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
Example: | |
</dt> | |
<dd> | |
<p> | |
Assume you have local changes in "master", but you need to refetch "r2". | |
</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code> r1---r2---r3 remotes/git-svn | |
\ | |
A---B master</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Fix the ignore-paths or SVN permissions problem that caused "r2" to | |
be incomplete in the first place. Then:</p></div> | |
<div class="verseblock"> | |
<pre class="content">git svn reset -r2 -p | |
git svn fetch</pre> | |
<div class="attribution"> | |
</div></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code> r1---r2'--r3' remotes/git-svn | |
\ | |
r2---r3---A---B master</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Then fixup "master" with <em>git rebase</em>. | |
Do NOT use <em>git merge</em> or your history will not be compatible with a | |
future <em>dcommit</em>!</p></div> | |
<div class="verseblock"> | |
<pre class="content">git rebase --onto remotes/git-svn A^ master</pre> | |
<div class="attribution"> | |
</div></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code> r1---r2'--r3' remotes/git-svn | |
\ | |
A'--B' master</code></pre> | |
</div></div> | |
</dd> | |
</dl></div> | |
</dd> | |
</dl></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_options">OPTIONS</h2> | |
<div class="sectionbody"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
--shared[=(false|true|umask|group|all|world|everybody)] | |
</dt> | |
<dt class="hdlist1"> | |
--template=<template_directory> | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>init</em> command. | |
These are passed directly to <em>git init</em>. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-r <arg> | |
</dt> | |
<dt class="hdlist1"> | |
--revision <arg> | |
</dt> | |
<dd> | |
<p> | |
Used with the <em>fetch</em> command. | |
</p> | |
<div class="paragraph"><p>This allows revision ranges for partial/cauterized history | |
to be supported. $NUMBER, $NUMBER1:$NUMBER2 (numeric ranges), | |
$NUMBER:HEAD, and BASE:$NUMBER are all supported.</p></div> | |
<div class="paragraph"><p>This can allow you to make partial mirrors when running fetch; | |
but is generally not recommended because history will be skipped | |
and lost.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
- | |
</dt> | |
<dt class="hdlist1"> | |
--stdin | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>set-tree</em> command. | |
</p> | |
<div class="paragraph"><p>Read a list of commits from stdin and commit them in reverse | |
order. Only the leading sha1 is read from each line, so | |
<em>git rev-list --pretty=oneline</em> output can be used.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--rmdir | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>dcommit</em>, <em>set-tree</em> and <em>commit-diff</em> commands. | |
</p> | |
<div class="paragraph"><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></div> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.rmdir</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
-e | |
</dt> | |
<dt class="hdlist1"> | |
--edit | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>dcommit</em>, <em>set-tree</em> and <em>commit-diff</em> commands. | |
</p> | |
<div class="paragraph"><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></div> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.edit</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
-l<num> | |
</dt> | |
<dt class="hdlist1"> | |
--find-copies-harder | |
</dt> | |
<dd> | |
<p> | |
Only used with the <em>dcommit</em>, <em>set-tree</em> and <em>commit-diff</em> commands. | |
</p> | |
<div class="paragraph"><p>They are both passed directly to <em>git diff-tree</em>; see | |
<a href="git-diff-tree.html">git-diff-tree(1)</a> for more information.</p></div> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.l | |
config key: svn.findcopiesharder</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
-A<filename> | |
</dt> | |
<dt class="hdlist1"> | |
--authors-file=<filename> | |
</dt> | |
<dd> | |
<p> | |
Syntax is compatible with the file used by <em>git cvsimport</em> but | |
an empty email address can be supplied with <em><></em>: | |
</p> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code> loginname = Joe User <user@example.com></code></pre> | |
</div></div> | |
<div class="paragraph"><p>If this option is specified and <em>git svn</em> encounters an SVN | |
committer name that does not exist in the authors-file, <em>git svn</em> | |
will abort operation. The user will then have to add the | |
appropriate entry. Re-running the previous <em>git svn</em> command | |
after the authors-file is modified should continue operation.</p></div> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.authorsfile</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
--authors-prog=<filename> | |
</dt> | |
<dd> | |
<p> | |
If this option is specified, for each SVN committer name that | |
does not exist in the authors file, the given file is executed | |
with the committer name as the first argument. The program is | |
expected to return a single line of the form "Name <email>" or | |
"Name <>", which will be treated as if included in the authors | |
file. | |
</p> | |
<div class="paragraph"><p>Due to historical reasons a relative <em>filename</em> is first searched | |
relative to the current directory for <em>init</em> and <em>clone</em> and relative | |
to the root of the working tree for <em>fetch</em>. If <em>filename</em> is | |
not found, it is searched like any other command in <em>$PATH</em>.</p></div> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.authorsProg</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
-q | |
</dt> | |
<dt class="hdlist1"> | |
--quiet | |
</dt> | |
<dd> | |
<p> | |
Make <em>git svn</em> less verbose. Specify a second time to make it | |
even less verbose. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-m | |
</dt> | |
<dt class="hdlist1"> | |
--merge | |
</dt> | |
<dt class="hdlist1"> | |
-s<strategy> | |
</dt> | |
<dt class="hdlist1"> | |
--strategy=<strategy> | |
</dt> | |
<dt class="hdlist1"> | |
-p | |
</dt> | |
<dt class="hdlist1"> | |
--preserve-merges | |
</dt> | |
<dd> | |
<p> | |
These are only used with the <em>dcommit</em> and <em>rebase</em> commands. | |
</p> | |
<div class="paragraph"><p>Passed directly to <em>git rebase</em> when using <em>dcommit</em> if a | |
<em>git reset</em> cannot be used (see <em>dcommit</em>).</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
-n | |
</dt> | |
<dt class="hdlist1"> | |
--dry-run | |
</dt> | |
<dd> | |
<p> | |
This can be used with the <em>dcommit</em>, <em>rebase</em>, <em>branch</em> and | |
<em>tag</em> commands. | |
</p> | |
<div class="paragraph"><p>For <em>dcommit</em>, print out the series of Git arguments that would show | |
which diffs would be committed to SVN.</p></div> | |
<div class="paragraph"><p>For <em>rebase</em>, display the local branch associated with the upstream svn | |
repository associated with the current branch and the URL of svn | |
repository that will be fetched from.</p></div> | |
<div class="paragraph"><p>For <em>branch</em> and <em>tag</em>, display the urls that will be used for copying when | |
creating the branch or tag.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
--use-log-author | |
</dt> | |
<dd> | |
<p> | |
When retrieving svn commits into Git (as part of <em>fetch</em>, <em>rebase</em>, or | |
<em>dcommit</em> operations), look for the first <code>From:</code> or <code>Signed-off-by:</code> line | |
in the log message and use that as the author string. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.useLogAuthor</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
<dt class="hdlist1"> | |
--add-author-from | |
</dt> | |
<dd> | |
<p> | |
When committing to svn from Git (as part of <em>set-tree</em> or <em>dcommit</em> | |
operations), if the existing log message doesn’t already have a | |
<code>From:</code> or <code>Signed-off-by:</code> line, append a <code>From:</code> line based on the | |
Git commit’s author string. If you use this, then <code>--use-log-author</code> | |
will retrieve a valid author string for all commits. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.addAuthorFrom</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
</dl></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_advanced_options">ADVANCED OPTIONS</h2> | |
<div class="sectionbody"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
-i<GIT_SVN_ID> | |
</dt> | |
<dt class="hdlist1"> | |
--id <GIT_SVN_ID> | |
</dt> | |
<dd> | |
<p> | |
This sets GIT_SVN_ID (instead of using the environment). This | |
allows the user to override the default refname to fetch from | |
when tracking a single URL. The <em>log</em> and <em>dcommit</em> commands | |
no longer require this switch as an argument. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
-R<remote name> | |
</dt> | |
<dt class="hdlist1"> | |
--svn-remote <remote name> | |
</dt> | |
<dd> | |
<p> | |
Specify the [svn-remote "<remote name>"] section to use, | |
this allows SVN multiple repositories to be tracked. | |
Default: "svn" | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
--follow-parent | |
</dt> | |
<dd> | |
<p> | |
This option is only relevant if we are tracking branches (using | |
one of the repository layout options --trunk, --tags, | |
--branches, --stdlayout). For each tracked branch, try to find | |
out where its revision was copied from, and set | |
a suitable parent in the first Git commit for the branch. | |
This is especially helpful when we’re tracking a directory | |
that has been moved around within the repository. If this | |
feature is disabled, the branches created by <em>git svn</em> will all | |
be linear and not share any history, meaning that there will be | |
no information on where branches were branched off or merged. | |
However, following long/convoluted histories can take a long | |
time, so disabling this feature may speed up the cloning | |
process. This feature is enabled by default, use | |
--no-follow-parent to disable it. | |
</p> | |
<div class="verseblock"> | |
<pre class="content">config key: svn.followparent</pre> | |
<div class="attribution"> | |
</div></div> | |
</dd> | |
</dl></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_config_file_only_options">CONFIG FILE-ONLY OPTIONS</h2> | |
<div class="sectionbody"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
svn.noMetadata | |
</dt> | |
<dt class="hdlist1"> | |
svn-remote.<name>.noMetadata | |
</dt> | |
<dd> | |
<p> | |
This gets rid of the <em>git-svn-id:</em> lines at the end of every commit. | |
</p> | |
<div class="paragraph"><p>This option can only be used for one-shot imports as <em>git svn</em> | |
will not be able to fetch again without metadata. Additionally, | |
if you lose your <em>$GIT_DIR/svn/**/.rev_map.*</em> files, <em>git svn</em> will not | |
be able to rebuild them.</p></div> | |
<div class="paragraph"><p>The <em>git svn log</em> command will not work on repositories using | |
this, either. Using this conflicts with the <em>useSvmProps</em> | |
option for (hopefully) obvious reasons.</p></div> | |
<div class="paragraph"><p>This option is NOT recommended as it makes it difficult to track down | |
old references to SVN revision numbers in existing documentation, bug | |
reports and archives. If you plan to eventually migrate from SVN to Git | |
and are certain about dropping SVN history, consider | |
<a href="git-filter-branch.html">git-filter-branch(1)</a> instead. filter-branch also allows | |
reformatting of metadata for ease-of-reading and rewriting authorship | |
info for non-"svn.authorsFile" users.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
svn.useSvmProps | |
</dt> | |
<dt class="hdlist1"> | |
svn-remote.<name>.useSvmProps | |
</dt> | |
<dd> | |
<p> | |
This allows <em>git svn</em> to re-map repository URLs and UUIDs from | |
mirrors created using SVN::Mirror (or svk) for metadata. | |
</p> | |
<div class="paragraph"><p>If an SVN revision has a property, "svm:headrev", it is likely | |
that the revision was created by SVN::Mirror (also used by SVK). | |
The property contains a repository UUID and a revision. We want | |
to make it look like we are mirroring the original URL, so | |
introduce a helper function that returns the original identity | |
URL and UUID, and use it when generating metadata in commit | |
messages.</p></div> | |
</dd> | |
<dt class="hdlist1"> | |
svn.useSvnsyncProps | |
</dt> | |
<dt class="hdlist1"> | |
svn-remote.<name>.useSvnsyncprops | |
</dt> | |
<dd> | |
<p> | |
Similar to the useSvmProps option; this is for users | |
of the svnsync(1) command distributed with SVN 1.4.x and | |
later. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
svn-remote.<name>.rewriteRoot | |
</dt> | |
<dd> | |
<p> | |
This allows users to create repositories from alternate | |
URLs. For example, an administrator could run <em>git svn</em> on the | |
server locally (accessing via file://) but wish to distribute | |
the repository with a public http:// or svn:// URL in the | |
metadata so users of it will see the public URL. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
svn-remote.<name>.rewriteUUID | |
</dt> | |
<dd> | |
<p> | |
Similar to the useSvmProps option; this is for users who need | |
to remap the UUID manually. This may be useful in situations | |
where the original UUID is not available via either useSvmProps | |
or useSvnsyncProps. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
svn-remote.<name>.pushurl | |
</dt> | |
<dd> | |
<p> | |
Similar to Git’s <code>remote.<name>.pushurl</code>, this key is designed | |
to be used in cases where <em>url</em> points to an SVN repository | |
via a read-only transport, to provide an alternate read/write | |
transport. It is assumed that both keys point to the same | |
repository. Unlike <em>commiturl</em>, <em>pushurl</em> is a base path. If | |
either <em>commiturl</em> or <em>pushurl</em> could be used, <em>commiturl</em> | |
takes precedence. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
svn.brokenSymlinkWorkaround | |
</dt> | |
<dd> | |
<p> | |
This disables potentially expensive checks to workaround | |
broken symlinks checked into SVN by broken clients. Set this | |
option to "false" if you track a SVN repository with many | |
empty blobs that are not symlinks. This option may be changed | |
while <em>git svn</em> is running and take effect on the next | |
revision fetched. If unset, <em>git svn</em> assumes this option to | |
be "true". | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
svn.pathnameencoding | |
</dt> | |
<dd> | |
<p> | |
This instructs git svn to recode pathnames to a given encoding. | |
It can be used by windows users and by those who work in non-utf8 | |
locales to avoid corrupted file names with non-ASCII characters. | |
Valid encodings are the ones supported by Perl’s Encode module. | |
</p> | |
</dd> | |
<dt class="hdlist1"> | |
svn-remote.<name>.automkdirs | |
</dt> | |
<dd> | |
<p> | |
Normally, the "git svn clone" and "git svn rebase" commands | |
attempt to recreate empty directories that are in the | |
Subversion repository. If this option is set to "false", then | |
empty directories will only be created if the "git svn mkdirs" | |
command is run explicitly. If unset, <em>git svn</em> assumes this | |
option to be "true". | |
</p> | |
</dd> | |
</dl></div> | |
<div class="paragraph"><p>Since the noMetadata, rewriteRoot, rewriteUUID, useSvnsyncProps and useSvmProps | |
options all affect the metadata generated and used by <em>git svn</em>; they | |
<strong>must</strong> be set in the configuration file before any history is imported | |
and these settings should never be changed once they are set.</p></div> | |
<div class="paragraph"><p>Additionally, only one of these options can be used per svn-remote | |
section because they affect the <em>git-svn-id:</em> metadata line, except | |
for rewriteRoot and rewriteUUID which can be used together.</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_basic_examples">BASIC EXAMPLES</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>Tracking and contributing to the trunk of a Subversion-managed project | |
(ignoring tags and branches):</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code># Clone a repo (like git clone): | |
git svn clone http://svn.example.com/project/trunk | |
# Enter the newly cloned directory: | |
cd trunk | |
# You should be on master branch, double-check with 'git branch' | |
git branch | |
# Do some work and commit locally to Git: | |
git commit ... | |
# Something is committed to SVN, rebase your local changes against the | |
# latest changes in SVN: | |
git svn rebase | |
# Now commit your changes (that were committed previously using Git) to SVN, | |
# as well as automatically updating your working HEAD: | |
git svn dcommit | |
# Append svn:ignore settings to the default Git exclude file: | |
git svn show-ignore >> .git/info/exclude</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Tracking and contributing to an entire Subversion-managed project | |
(complete with a trunk, tags and branches):</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code># Clone a repo with standard SVN directory layout (like git clone): | |
git svn clone http://svn.example.com/project --stdlayout --prefix svn/ | |
# Or, if the repo uses a non-standard directory layout: | |
git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/ | |
# View all branches and tags you have cloned: | |
git branch -r | |
# Create a new branch in SVN | |
git svn branch waldo | |
# Reset your master to trunk (or any other branch, replacing 'trunk' | |
# with the appropriate name): | |
git reset --hard svn/trunk | |
# You may only dcommit to one branch/tag/trunk at a time. The usage | |
# of dcommit/rebase/show-ignore should be the same as above.</code></pre> | |
</div></div> | |
<div class="paragraph"><p>The initial <em>git svn clone</em> can be quite time-consuming | |
(especially for large Subversion repositories). If multiple | |
people (or one person with multiple machines) want to use | |
<em>git svn</em> to interact with the same Subversion repository, you can | |
do the initial <em>git svn clone</em> to a repository on a server and | |
have each person clone that repository with <em>git clone</em>:</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code># Do the initial import on a server | |
ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]" | |
# Clone locally - make sure the refs/remotes/ space matches the server | |
mkdir project | |
cd project | |
git init | |
git remote add origin server:/pub/project | |
git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*' | |
git fetch | |
# Prevent fetch/pull from remote Git server in the future, | |
# we only want to use git svn for future updates | |
git config --remove-section remote.origin | |
# Create a local branch from one of the branches just fetched | |
git checkout -b master FETCH_HEAD | |
# Initialize 'git svn' locally (be sure to use the same URL and | |
# --stdlayout/-T/-b/-t/--prefix options as were used on server) | |
git svn init http://svn.example.com/project [options...] | |
# Pull the latest changes from Subversion | |
git svn rebase</code></pre> | |
</div></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_rebase_vs_pull_merge">REBASE VS. PULL/MERGE</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>Prefer to use <em>git svn rebase</em> or <em>git rebase</em>, rather than | |
<em>git pull</em> or <em>git merge</em> to synchronize unintegrated commits with a <em>git svn</em> | |
branch. Doing so will keep the history of unintegrated commits linear with | |
respect to the upstream SVN repository and allow the use of the preferred | |
<em>git svn dcommit</em> subcommand to push unintegrated commits back into SVN.</p></div> | |
<div class="paragraph"><p>Originally, <em>git svn</em> recommended that developers pulled or merged from | |
the <em>git svn</em> branch. This was because the author favored | |
<code>git svn set-tree B</code> to commit a single head rather than the | |
<code>git svn set-tree A..B</code> notation to commit multiple commits. Use of | |
<em>git pull</em> or <em>git merge</em> with <code>git svn set-tree A..B</code> will cause non-linear | |
history to be flattened when committing into SVN and this can lead to merge | |
commits unexpectedly reversing previous commits in SVN.</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_merge_tracking">MERGE TRACKING</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>While <em>git svn</em> can track | |
copy history (including branches and tags) for repositories adopting a | |
standard layout, it cannot yet represent merge history that happened | |
inside git back upstream to SVN users. Therefore it is advised that | |
users keep history as linear as possible inside Git to ease | |
compatibility with SVN (see the CAVEATS section below).</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_handling_of_svn_branches">HANDLING OF SVN BRANCHES</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>If <em>git svn</em> is configured to fetch branches (and --follow-branches | |
is in effect), it sometimes creates multiple Git branches for one | |
SVN branch, where the additional branches have names of the form | |
<em>branchname@nnn</em> (with nnn an SVN revision number). These additional | |
branches are created if <em>git svn</em> cannot find a parent commit for the | |
first commit in an SVN branch, to connect the branch to the history of | |
the other branches.</p></div> | |
<div class="paragraph"><p>Normally, the first commit in an SVN branch consists | |
of a copy operation. <em>git svn</em> will read this commit to get the SVN | |
revision the branch was created from. It will then try to find the | |
Git commit that corresponds to this SVN revision, and use that as the | |
parent of the branch. However, it is possible that there is no suitable | |
Git commit to serve as parent. This will happen, among other reasons, | |
if the SVN branch is a copy of a revision that was not fetched by <em>git | |
svn</em> (e.g. because it is an old revision that was skipped with | |
<code>--revision</code>), or if in SVN a directory was copied that is not tracked | |
by <em>git svn</em> (such as a branch that is not tracked at all, or a | |
subdirectory of a tracked branch). In these cases, <em>git svn</em> will still | |
create a Git branch, but instead of using an existing Git commit as the | |
parent of the branch, it will read the SVN history of the directory the | |
branch was copied from and create appropriate Git commits. This is | |
indicated by the message "Initializing parent: <branchname>".</p></div> | |
<div class="paragraph"><p>Additionally, it will create a special branch named | |
<em><branchname>@<SVN-Revision></em>, where <SVN-Revision> is the SVN revision | |
number the branch was copied from. This branch will point to the newly | |
created parent commit of the branch. If in SVN the branch was deleted | |
and later recreated from a different version, there will be multiple | |
such branches with an <em>@</em>.</p></div> | |
<div class="paragraph"><p>Note that this may mean that multiple Git commits are created for a | |
single SVN revision.</p></div> | |
<div class="paragraph"><p>An example: in an SVN repository with a standard | |
trunk/tags/branches layout, a directory trunk/sub is created in r.100. | |
In r.200, trunk/sub is branched by copying it to branches/. <em>git svn | |
clone -s</em> will then create a branch <em>sub</em>. It will also create new Git | |
commits for r.100 through r.199 and use these as the history of branch | |
<em>sub</em>. Thus there will be two Git commits for each revision from r.100 | |
to r.199 (one containing trunk/, one containing trunk/sub/). Finally, | |
it will create a branch <em>sub@200</em> pointing to the new parent commit of | |
branch <em>sub</em> (i.e. the commit for r.200 and trunk/sub/).</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_caveats">CAVEATS</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>For the sake of simplicity and interoperating with Subversion, | |
it is recommended that all <em>git svn</em> users clone, fetch and dcommit | |
directly from the SVN server, and avoid all <em>git clone</em>/<em>pull</em>/<em>merge</em>/<em>push</em> | |
operations between Git repositories and branches. The recommended | |
method of exchanging code between Git branches and users is | |
<em>git format-patch</em> and <em>git am</em>, or just 'dcommit’ing to the SVN repository.</p></div> | |
<div class="paragraph"><p>Running <em>git merge</em> or <em>git pull</em> is NOT recommended on a branch you | |
plan to <em>dcommit</em> from because Subversion users cannot see any | |
merges you’ve made. Furthermore, if you merge or pull from a Git branch | |
that is a mirror of an SVN branch, <em>dcommit</em> may commit to the wrong | |
branch.</p></div> | |
<div class="paragraph"><p>If you do merge, note the following rule: <em>git svn dcommit</em> will | |
attempt to commit on top of the SVN commit named in</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>git log --grep=^git-svn-id: --first-parent -1</code></pre> | |
</div></div> | |
<div class="paragraph"><p>You <em>must</em> therefore ensure that the most recent commit of the branch | |
you want to dcommit to is the <em>first</em> parent of the merge. Chaos will | |
ensue otherwise, especially if the first parent is an older commit on | |
the same SVN branch.</p></div> | |
<div class="paragraph"><p><em>git clone</em> does not clone branches under the refs/remotes/ hierarchy or | |
any <em>git svn</em> metadata, or config. So repositories created and managed with | |
using <em>git svn</em> should use <em>rsync</em> for cloning, if cloning is to be done | |
at all.</p></div> | |
<div class="paragraph"><p>Since <em>dcommit</em> uses rebase internally, any Git branches you <em>git push</em> to | |
before <em>dcommit</em> on will require forcing an overwrite of the existing ref | |
on the remote repository. This is generally considered bad practice, | |
see the <a href="git-push.html">git-push(1)</a> documentation for details.</p></div> | |
<div class="paragraph"><p>Do not use the --amend option of <a href="git-commit.html">git-commit(1)</a> on a change you’ve | |
already dcommitted. It is considered bad practice to --amend commits | |
you’ve already pushed to a remote repository for other users, and | |
dcommit with SVN is analogous to that.</p></div> | |
<div class="paragraph"><p>When cloning an SVN repository, if none of the options for describing | |
the repository layout is used (--trunk, --tags, --branches, | |
--stdlayout), <em>git svn clone</em> will create a Git repository with | |
completely linear history, where branches and tags appear as separate | |
directories in the working copy. While this is the easiest way to get a | |
copy of a complete repository, for projects with many branches it will | |
lead to a working copy many times larger than just the trunk. Thus for | |
projects using the standard directory structure (trunk/branches/tags), | |
it is recommended to clone with option <code>--stdlayout</code>. If the project | |
uses a non-standard structure, and/or if branches and tags are not | |
required, it is easiest to only clone one directory (typically trunk), | |
without giving any repository layout options. If the full history with | |
branches and tags is required, the options <code>--trunk</code> / <code>--branches</code> / | |
<code>--tags</code> must be used.</p></div> | |
<div class="paragraph"><p>When using multiple --branches or --tags, <em>git svn</em> does not automatically | |
handle name collisions (for example, if two branches from different paths have | |
the same name, or if a branch and a tag have the same name). In these cases, | |
use <em>init</em> to set up your Git repository then, before your first <em>fetch</em>, edit | |
the $GIT_DIR/config file so that the branches and tags are associated | |
with different name spaces. For example:</p></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><code>branches = stable/*:refs/remotes/svn/stable/* | |
branches = debug/*:refs/remotes/svn/debug/*</code></pre> | |
</div></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_bugs">BUGS</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>We ignore all SVN properties except svn:executable. Any unhandled | |
properties are logged to $GIT_DIR/svn/<refname>/unhandled.log</p></div> | |
<div class="paragraph"><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). Committing | |
renamed and copied files is fully supported if they’re similar enough | |
for Git to detect them.</p></div> | |
<div class="paragraph"><p>In SVN, it is possible (though discouraged) to commit changes to a tag | |
(because a tag is just a directory copy, thus technically the same as a | |
branch). When cloning an SVN repository, <em>git svn</em> cannot know if such a | |
commit to a tag will happen in the future. Thus it acts conservatively | |
and imports all SVN tags as branches, prefixing the tag name with <em>tags/</em>.</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_configuration">CONFIGURATION</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p><em>git svn</em> stores [svn-remote] configuration information in the | |
repository $GIT_DIR/config file. It is similar the core Git | |
[remote] sections except <em>fetch</em> keys do not accept glob | |
arguments; but they are instead handled by the <em>branches</em> | |
and <em>tags</em> keys. Since some SVN repositories are oddly | |
configured with multiple projects glob expansions such those | |
listed below are allowed:</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>[svn-remote "project-a"] | |
url = http://server.org/svn | |
fetch = trunk/project-a:refs/remotes/project-a/trunk | |
branches = branches/*/project-a:refs/remotes/project-a/branches/* | |
branches = branches/release_*:refs/remotes/project-a/branches/release_* | |
branches = branches/re*se:refs/remotes/project-a/branches/* | |
tags = tags/*/project-a:refs/remotes/project-a/tags/*</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Keep in mind that the <em>*</em> (asterisk) wildcard of the local ref | |
(right of the <em>:</em>) <strong>must</strong> be the farthest right path component; | |
however the remote wildcard may be anywhere as long as it’s an | |
independent path component (surrounded by <em>/</em> or EOL). This | |
type of configuration is not automatically created by <em>init</em> and | |
should be manually entered with a text-editor or using <em>git config</em>.</p></div> | |
<div class="paragraph"><p>Also note that only one asterisk is allowed per word. For example:</p></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><code>branches = branches/re*se:refs/remotes/project-a/branches/*</code></pre> | |
</div></div> | |
<div class="paragraph"><p>will match branches <em>release</em>, <em>rese</em>, <em>re123se</em>, however</p></div> | |
<div class="literalblock"> | |
<div class="content"> | |
<pre><code>branches = branches/re*s*e:refs/remotes/project-a/branches/*</code></pre> | |
</div></div> | |
<div class="paragraph"><p>will produce an error.</p></div> | |
<div class="paragraph"><p>It is also possible to fetch a subset of branches or tags by using a | |
comma-separated list of names within braces. For example:</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>[svn-remote "huge-project"] | |
url = http://server.org/svn | |
fetch = trunk/src:refs/remotes/trunk | |
branches = branches/{red,green}/src:refs/remotes/project-a/branches/* | |
tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Multiple fetch, branches, and tags keys are supported:</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>[svn-remote "messy-repo"] | |
url = http://server.org/svn | |
fetch = trunk/project-a:refs/remotes/project-a/trunk | |
fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo | |
branches = branches/server/*:refs/remotes/project-a/branches/* | |
branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/* | |
tags = tags/server/*:refs/remotes/project-a/tags/*</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Creating a branch in such a configuration requires disambiguating which | |
location to use using the -d or --destination flag:</p></div> | |
<div class="listingblock"> | |
<div class="content"> | |
<pre><code>$ git svn branch -d branches/server release-2-3-0</code></pre> | |
</div></div> | |
<div class="paragraph"><p>Note that git-svn keeps track of the highest revision in which a branch | |
or tag has appeared. If the subset of branches or tags is changed after | |
fetching, then $GIT_DIR/svn/.metadata must be manually edited to remove | |
(or reset) branches-maxRev and/or tags-maxRev as appropriate.</p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_files">FILES</h2> | |
<div class="sectionbody"> | |
<div class="dlist"><dl> | |
<dt class="hdlist1"> | |
$GIT_DIR/svn/**/.rev_map.* | |
</dt> | |
<dd> | |
<p> | |
Mapping between Subversion revision numbers and Git commit | |
names. In a repository where the noMetadata option is not set, | |
this can be rebuilt from the git-svn-id: lines that are at the | |
end of every commit (see the <em>svn.noMetadata</em> section above for | |
details). | |
</p> | |
<div class="paragraph"><p><em>git svn fetch</em> and <em>git svn rebase</em> automatically update the rev_map | |
if it is missing or not up to date. <em>git svn reset</em> automatically | |
rewinds it.</p></div> | |
</dd> | |
</dl></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_see_also">SEE ALSO</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p><a href="git-rebase.html">git-rebase(1)</a></p></div> | |
</div> | |
</div> | |
<div class="sect1"> | |
<h2 id="_git">GIT</h2> | |
<div class="sectionbody"> | |
<div class="paragraph"><p>Part of the <a href="git.html">git(1)</a> suite</p></div> | |
</div> | |
</div> | |
</div> | |
<div id="footnotes"><hr /></div> | |
<div id="footer"> | |
<div id="footer-text"> | |
Last updated | |
2018-07-18 13:16:04 PDT | |
</div> | |
</div> | |
</body> | |
</html> |