summaryrefslogtreecommitdiffstats
path: root/git-filter-branch.html
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2012-12-18 16:43:11 -0800
committerJunio C Hamano <gitster@pobox.com>2012-12-18 16:43:11 -0800
commit9d9711544dc3090db6e5c52f9ce9c300bf4f5c14 (patch)
tree23257b9801739fd96c9e82ef98a17500dce9f88e /git-filter-branch.html
parent9629d4f49e5ffcff5c5beb5c40bedcffcabcd905 (diff)
downloadgit-htmldocs-9d9711544dc3090db6e5c52f9ce9c300bf4f5c14.tar.gz
Autogenerated HTML docs for v1.8.1-rc2-5-g252f9
Diffstat (limited to 'git-filter-branch.html')
-rw-r--r--git-filter-branch.html504
1 files changed, 341 insertions, 163 deletions
diff --git a/git-filter-branch.html b/git-filter-branch.html
index e521b1262..d46db6631 100644
--- a/git-filter-branch.html
+++ b/git-filter-branch.html
@@ -2,15 +2,25 @@
"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 8.5.2" />
+<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 8.6.8" />
<title>git-filter-branch(1)</title>
<style type="text/css">
-/* Debug borders */
-p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
-/*
- border: 1px solid red;
-*/
+/* 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 {
@@ -35,13 +45,8 @@ strong {
color: #083194;
}
-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;
@@ -59,9 +64,11 @@ h3 {
h3 + * {
clear: left;
}
+h5 {
+ font-size: 1.0em;
+}
div.sectionbody {
- font-family: serif;
margin-left: 0;
}
@@ -77,45 +84,48 @@ p {
ul, ol, li > p {
margin-top: 0;
}
+ul > li { color: #aaa; }
+ul > li > * { color: black; }
-pre {
+.monospaced, code, pre {
+ font-family: "Courier New", Courier, monospace;
+ font-size: inherit;
+ color: navy;
padding: 0;
margin: 0;
}
-span#author {
+
+#author {
color: #527bbd;
- font-family: sans-serif;
font-weight: bold;
font-size: 1.1em;
}
-span#email {
+#email {
}
-span#revnumber, span#revdate, span#revremark {
- font-family: sans-serif;
+#revnumber, #revdate, #revremark {
}
-div#footer {
- font-family: sans-serif;
+#footer {
font-size: small;
border-top: 2px solid silver;
padding-top: 0.5em;
margin-top: 4.0em;
}
-div#footer-text {
+#footer-text {
float: left;
padding-bottom: 0.5em;
}
-div#footer-badges {
+#footer-badges {
float: right;
padding-bottom: 0.5em;
}
-div#preamble {
+#preamble {
margin-top: 1.5em;
margin-bottom: 1.5em;
}
-div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
+div.imageblock, div.exampleblock, div.verseblock,
div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
div.admonitionblock {
margin-top: 1.0em;
@@ -135,7 +145,6 @@ div.content { /* Block element content. */
/* Block element titles. */
div.title, caption.title {
color: #527bbd;
- font-family: sans-serif;
font-weight: bold;
text-align: left;
margin-top: 1.0em;
@@ -157,13 +166,15 @@ div.content + div.title {
div.sidebarblock > div.content {
background: #ffffee;
- border: 1px solid silver;
+ border: 1px solid #dddddd;
+ border-left: 4px solid #f0f0f0;
padding: 0.5em;
}
div.listingblock > div.content {
- border: 1px solid silver;
- background: #f4f4f4;
+ border: 1px solid #dddddd;
+ border-left: 5px solid #f0f0f0;
+ background: #f8f8f8;
padding: 0.5em;
}
@@ -171,8 +182,8 @@ div.quoteblock, div.verseblock {
padding-left: 1.0em;
margin-left: 1.0em;
margin-right: 10%;
- border-left: 5px solid #dddddd;
- color: #777777;
+ border-left: 5px solid #f0f0f0;
+ color: #888;
}
div.quoteblock > div.attribution {
@@ -180,8 +191,9 @@ div.quoteblock > div.attribution {
text-align: right;
}
-div.verseblock > div.content {
- white-space: pre;
+div.verseblock > pre.content {
+ font-family: inherit;
+ font-size: inherit;
}
div.verseblock > div.attribution {
padding-top: 0.75em;
@@ -254,35 +266,12 @@ div.compact div, div.compact div {
margin-bottom: 0.1em;
}
-div.tableblock > table {
- border: 3px solid #527bbd;
-}
-thead, p.table.header {
- font-family: sans-serif;
- font-weight: bold;
-}
tfoot {
font-weight: bold;
}
td > div.verse {
white-space: pre;
}
-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;
-}
-
div.hdlist {
margin-top: 0.8em;
@@ -339,25 +328,32 @@ span.footnote, span.footnoteref {
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 {
- div#footer-badges { display: none; }
+ #footer-badges { display: none; }
}
-div#toc {
+#toc {
margin-bottom: 2.5em;
}
-div#toctitle {
+#toctitle {
color: #527bbd;
- font-family: sans-serif;
font-size: 1.1em;
font-weight: bold;
margin-top: 1.0em;
margin-bottom: 0.1em;
}
-div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
+div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
margin-top: 0;
margin-bottom: 0;
}
@@ -373,69 +369,173 @@ div.toclevel4 {
margin-left: 6em;
font-size: 0.9em;
}
-/* Overrides for manpage documents */
-h1 {
- padding-top: 0.5em;
- padding-bottom: 0.5em;
- border-top: 2px solid silver;
- border-bottom: 2px solid silver;
+
+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;
}
-h2 {
+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.sectionbody {
- margin-left: 5%;
+div.tableblock > table[frame="hsides"] {
+ border-left-style: none;
+ border-right-style: none;
}
-
-@media print {
- div#toc { display: none; }
+div.tableblock > table[frame="vsides"] {
+ border-top-style: none;
+ border-bottom-style: none;
}
-/* Workarounds for IE6's broken and incomplete CSS2. */
-div.sidebar-content {
- background: #ffffee;
- border: 1px solid silver;
- padding: 0.5em;
+/*
+ * html5 specific
+ *
+ * */
+
+table.tableblock {
+ margin-top: 1.0em;
+ margin-bottom: 1.5em;
}
-div.sidebar-title, div.image-title {
- color: #527bbd;
- font-family: sans-serif;
+thead, p.tableblock.header {
font-weight: bold;
- margin-top: 0.0em;
- margin-bottom: 0.5em;
+ 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;
}
-div.listingblock div.content {
- border: 1px solid silver;
- background: #f4f4f4;
- padding: 0.5em;
+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;
}
-div.quoteblock-attribution {
- padding-top: 0.5em;
+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;
}
-div.verseblock-content {
- white-space: pre;
+th.tableblock.valign-top, td.tableblock.valign-top {
+ vertical-align: top;
}
-div.verseblock-attribution {
- padding-top: 0.75em;
- text-align: left;
+th.tableblock.valign-middle, td.tableblock.valign-middle {
+ vertical-align: middle;
+}
+th.tableblock.valign-bottom, td.tableblock.valign-bottom {
+ vertical-align: bottom;
}
-div.exampleblock-content {
- border-left: 3px solid #dddddd;
- padding-left: 0.5em;
+
+/*
+ * 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; }
+}
+
-/* IE6 sets dynamically generated links as visited. */
-div#toc a:visited { color: blue; }
</style>
<script type="text/javascript">
/*<![CDATA[*/
-window.onload = function(){asciidoc.footnotes();}
var asciidoc = { // Namespace.
/////////////////////////////////////////////////////////////////////
@@ -477,7 +577,7 @@ toc: function (toclevels) {
function tocEntries(el, toclevels) {
var result = new Array;
- var re = new RegExp('[hH]([2-'+(toclevels+1)+'])');
+ 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).
@@ -497,6 +597,25 @@ toc: function (toclevels) {
}
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];
@@ -524,24 +643,44 @@ toc: function (toclevels) {
*/
footnotes: function () {
- var cont = document.getElementById("content");
+ // 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++;
- // 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];
+ 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>";
- spans[i].innerHTML =
- "[<a id='_footnoteref_" + n + "' href='#_footnote_" + n +
- "' title='View footnote' class='footnote'>" + n + "</a>]";
var id =spans[i].getAttribute("id");
if (id != null) refs["#"+id] = n;
}
@@ -561,13 +700,36 @@ footnotes: function () {
}
}
}
+},
+
+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>
+<body class="manpage">
<div id="header">
<h1>
git-filter-branch(1) Manual Page
@@ -580,19 +742,22 @@ git-filter-branch(1) Manual Page
</div>
</div>
<div id="content">
+<div class="sect1">
<h2 id="_synopsis">SYNOPSIS</h2>
<div class="sectionbody">
<div class="verseblock">
-<div class="verseblock-content"><em>git filter-branch</em> [--env-filter &lt;command&gt;] [--tree-filter &lt;command&gt;]
+<pre class="content"><em>git filter-branch</em> [--env-filter &lt;command&gt;] [--tree-filter &lt;command&gt;]
[--index-filter &lt;command&gt;] [--parent-filter &lt;command&gt;]
[--msg-filter &lt;command&gt;] [--commit-filter &lt;command&gt;]
[--tag-name-filter &lt;command&gt;] [--subdirectory-filter &lt;directory&gt;]
[--prune-empty]
[--original &lt;namespace&gt;] [-d &lt;directory&gt;] [-f | --force]
- [--] [&lt;rev-list options&gt;&#8230;]</div>
-<div class="verseblock-attribution">
+ [--] [&lt;rev-list options&gt;&#8230;]</pre>
+<div class="attribution">
</div></div>
</div>
+</div>
+<div class="sect1">
<h2 id="_description">DESCRIPTION</h2>
<div class="sectionbody">
<div class="paragraph"><p>Lets you rewrite git revision history by rewriting the branches mentioned
@@ -607,8 +772,8 @@ If you specify no filters, the commits will be recommitted without any
changes, which would normally have no effect. Nevertheless, this may be
useful in the future for compensating for some git bugs or such,
therefore such a usage is permitted.</p></div>
-<div class="paragraph"><p><strong>NOTE</strong>: This command honors <tt>.git/info/grafts</tt> file and refs in
-the <tt>refs/replace/</tt> namespace.
+<div class="paragraph"><p><strong>NOTE</strong>: This command honors <code>.git/info/grafts</code> file and refs in
+the <code>refs/replace/</code> namespace.
If you have any grafts or replacement refs defined, running this command
will make them permanent.</p></div>
<div class="paragraph"><p><strong>WARNING</strong>! The rewritten history will have different object names for all
@@ -625,7 +790,8 @@ if different from the rewritten ones, will be stored in the namespace
<div class="paragraph"><p>Note that since this operation is very I/O expensive, it might
be a good idea to redirect the temporary directory off-disk with the
<em>-d</em> option, e.g. on tmpfs. Reportedly the speedup is very noticeable.</p></div>
-<h3 id="_filters">Filters</h3><div style="clear:left"></div>
+<div class="sect2">
+<h3 id="_filters">Filters</h3>
<div class="paragraph"><p>The filters are applied in the order as listed below. The &lt;command&gt;
argument is always evaluated in the shell context using the <em>eval</em> command
(with the notable exception of the commit filter, for technical reasons).
@@ -642,6 +808,9 @@ rewritten, and "original sha1 id" otherwise; the <em>map</em> function can
return several ids on separate lines if your commit filter emitted
multiple commits.</p></div>
</div>
+</div>
+</div>
+<div class="sect1">
<h2 id="_options">OPTIONS</h2>
<div class="sectionbody">
<div class="dlist"><dl>
@@ -677,8 +846,8 @@ multiple commits.</p></div>
<p>
This is the filter for rewriting the index. It is similar to the
tree filter but does not check out the tree, which makes it much
- faster. Frequently used with <tt>git rm --cached
- --ignore-unmatch ...</tt>, see EXAMPLES below. For hairy
+ faster. Frequently used with <code>git rm --cached
+ --ignore-unmatch ...</code>, see EXAMPLES below. For hairy
cases, see <a href="git-update-index.html">git-update-index(1)</a>.
</p>
</dd>
@@ -724,8 +893,8 @@ have all of them as parents.</p></div>
convenience functions, too. For example, calling <em>skip_commit "$@"</em>
will leave out the current commit (but not its changes! If you want
that, use <em>git rebase</em> instead).</p></div>
-<div class="paragraph"><p>You can also use the <tt>git_commit_non_empty_tree "$@"</tt> instead of
-<tt>git commit-tree "$@"</tt> if you don&#8217;t wish to keep commits with a single parent
+<div class="paragraph"><p>You can also use the <code>git_commit_non_empty_tree "$@"</code> instead of
+<code>git commit-tree "$@"</code> if you don&#8217;t wish to keep commits with a single parent
and that makes no change to the tree.</p></div>
</dd>
<dt class="hdlist1">
@@ -775,7 +944,7 @@ to other tags will be rewritten to point to the underlying commit.</p></div>
and only one parent, it will hence keep merges points. Also, this
option is not compatible with the use of <em>--commit-filter</em>. Though you
just need to use the function <em>git_commit_non_empty_tree "$@"</em> instead
- of the <tt>git commit-tree "$@"</tt> idiom in your commit filter to make that
+ of the <code>git commit-tree "$@"</code> idiom in your commit filter to make that
happen.
</p>
</dd>
@@ -826,49 +995,53 @@ to other tags will be rewritten to point to the underlying commit.</p></div>
</p>
</dd>
</dl></div>
-<h3 id="Remap_to_ancestor">Remap to ancestor</h3><div style="clear:left"></div>
+<div class="sect2">
+<h3 id="Remap_to_ancestor">Remap to ancestor</h3>
<div class="paragraph"><p>By using <a href="rev-list.html">rev-list(1)</a> arguments, e.g., path limiters, you can limit the
set of revisions which get rewritten. However, positive refs on the command
line are distinguished: we don&#8217;t let them be excluded by such limiters. For
this purpose, they are instead rewritten to point at the nearest ancestor that
was not excluded.</p></div>
</div>
+</div>
+</div>
+<div class="sect1">
<h2 id="_examples">Examples</h2>
<div class="sectionbody">
<div class="paragraph"><p>Suppose you want to remove a file (containing confidential information
or copyright violation) from all commits:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --tree-filter 'rm filename' HEAD</tt></pre>
+<pre><code>git filter-branch --tree-filter 'rm filename' HEAD</code></pre>
</div></div>
<div class="paragraph"><p>However, if the file is absent from the tree of some commit,
-a simple <tt>rm filename</tt> will fail for that tree and commit.
-Thus you may instead want to use <tt>rm -f filename</tt> as the script.</p></div>
-<div class="paragraph"><p>Using <tt>--index-filter</tt> with <em>git rm</em> yields a significantly faster
-version. Like with using <tt>rm filename</tt>, <tt>git rm --cached filename</tt>
+a simple <code>rm filename</code> will fail for that tree and commit.
+Thus you may instead want to use <code>rm -f filename</code> as the script.</p></div>
+<div class="paragraph"><p>Using <code>--index-filter</code> with <em>git rm</em> yields a significantly faster
+version. Like with using <code>rm filename</code>, <code>git rm --cached filename</code>
will fail if the file is absent from the tree of a commit. If you
want to "completely forget" a file, it does not matter when it entered
-history, so we also add <tt>--ignore-unmatch</tt>:</p></div>
+history, so we also add <code>--ignore-unmatch</code>:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD</tt></pre>
+<pre><code>git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD</code></pre>
</div></div>
<div class="paragraph"><p>Now, you will get the rewritten history saved in HEAD.</p></div>
-<div class="paragraph"><p>To rewrite the repository to look as if <tt>foodir/</tt> had been its project
+<div class="paragraph"><p>To rewrite the repository to look as if <code>foodir/</code> had been its project
root, and discard all other history:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --subdirectory-filter foodir -- --all</tt></pre>
+<pre><code>git filter-branch --subdirectory-filter foodir -- --all</code></pre>
</div></div>
<div class="paragraph"><p>Thus you can, e.g., turn a library subdirectory into a repository of
-its own. Note the <tt>--</tt> that separates <em>filter-branch</em> options from
-revision options, and the <tt>--all</tt> to rewrite all branches and tags.</p></div>
+its own. Note the <code>--</code> that separates <em>filter-branch</em> options from
+revision options, and the <code>--all</code> to rewrite all branches and tags.</p></div>
<div class="paragraph"><p>To set a commit (which typically is at the tip of another
history) to be the parent of the current initial commit, in
order to paste the other history behind the current history:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --parent-filter 'sed "s/^\$/-p &lt;graft-id&gt;/"' HEAD</tt></pre>
+<pre><code>git filter-branch --parent-filter 'sed "s/^\$/-p &lt;graft-id&gt;/"' HEAD</code></pre>
</div></div>
<div class="paragraph"><p>(if the parent string is empty - which happens when we are dealing with
the initial commit - add graftcommit as a parent). Note that this assumes
@@ -876,30 +1049,30 @@ history with a single root (that is, no merge without common ancestors
happened). If this is not the case, use:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --parent-filter \
- 'test $GIT_COMMIT = &lt;commit-id&gt; &amp;&amp; echo "-p &lt;graft-id&gt;" || cat' HEAD</tt></pre>
+<pre><code>git filter-branch --parent-filter \
+ 'test $GIT_COMMIT = &lt;commit-id&gt; &amp;&amp; echo "-p &lt;graft-id&gt;" || cat' HEAD</code></pre>
</div></div>
<div class="paragraph"><p>or even simpler:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>echo "$commit-id $graft-id" &gt;&gt; .git/info/grafts
-git filter-branch $graft-id..HEAD</tt></pre>
+<pre><code>echo "$commit-id $graft-id" &gt;&gt; .git/info/grafts
+git filter-branch $graft-id..HEAD</code></pre>
</div></div>
<div class="paragraph"><p>To remove commits authored by "Darl McBribe" from the history:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --commit-filter '
+<pre><code>git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "Darl McBribe" ];
then
skip_commit "$@";
else
git commit-tree "$@";
- fi' HEAD</tt></pre>
+ fi' HEAD</code></pre>
</div></div>
<div class="paragraph"><p>The function <em>skip_commit</em> is defined as follows:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>skip_commit()
+<pre><code>skip_commit()
{
shift;
while [ -n "$1" ];
@@ -908,7 +1081,7 @@ git filter-branch $graft-id..HEAD</tt></pre>
map "$1";
shift;
done;
-}</tt></pre>
+}</code></pre>
</div></div>
<div class="paragraph"><p>The shift magic first throws away the tree id and then the -p
parameters. Note that this handles merges properly! In case Darl
@@ -919,23 +1092,23 @@ as their parents instead of the merge commit.</p></div>
by subsequent commits, will still be in the rewritten branch. If you want
to throw out <em>changes</em> together with the commits, you should use the
interactive mode of <em>git rebase</em>.</p></div>
-<div class="paragraph"><p>You can rewrite the commit log messages using <tt>--msg-filter</tt>. For
+<div class="paragraph"><p>You can rewrite the commit log messages using <code>--msg-filter</code>. For
example, <em>git svn-id</em> strings in a repository created by <em>git svn</em> can
be removed this way:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --msg-filter '
+<pre><code>git filter-branch --msg-filter '
sed -e "/^git-svn-id:/d"
-'</tt></pre>
+'</code></pre>
</div></div>
<div class="paragraph"><p>If you need to add <em>Acked-by</em> lines to, say, the last 10 commits (none
of which is a merge), use this command:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --msg-filter '
+<pre><code>git filter-branch --msg-filter '
cat &amp;&amp;
echo "Acked-by: Bugs Bunny &lt;bunny@bugzilla.org&gt;"
-' HEAD~10..HEAD</tt></pre>
+' HEAD~10..HEAD</code></pre>
</div></div>
<div class="paragraph"><p>To restrict rewriting to only part of the history, specify a revision
range in addition to the new branch name. The new branch name will
@@ -944,36 +1117,38 @@ will print.</p></div>
<div class="paragraph"><p>Consider this history:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt> D--E--F--G--H
+<pre><code> D--E--F--G--H
/ /
-A--B-----C</tt></pre>
+A--B-----C</code></pre>
</div></div>
<div class="paragraph"><p>To rewrite only commits D,E,F,G,H, but leave A, B and C alone, use:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch ... C..H</tt></pre>
+<pre><code>git filter-branch ... C..H</code></pre>
</div></div>
<div class="paragraph"><p>To rewrite commits E,F,G,H, use one of these:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch ... C..H --not D
-git filter-branch ... D..H --not C</tt></pre>
+<pre><code>git filter-branch ... C..H --not D
+git filter-branch ... D..H --not C</code></pre>
</div></div>
<div class="paragraph"><p>To move the whole tree into a subdirectory, or remove it from there:</p></div>
<div class="listingblock">
<div class="content">
-<pre><tt>git filter-branch --index-filter \
+<pre><code>git filter-branch --index-filter \
'git ls-files -s | sed "s-\t\"*-&amp;newsubdir/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &amp;&amp;
- mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD</tt></pre>
+ mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD</code></pre>
</div></div>
</div>
+</div>
+<div class="sect1">
<h2 id="_checklist_for_shrinking_a_repository">Checklist for Shrinking a Repository</h2>
<div class="sectionbody">
<div class="paragraph"><p>git-filter-branch is often used to get rid of a subset of files,
-usually with some combination of <tt>--index-filter</tt> and
-<tt>--subdirectory-filter</tt>. People expect the resulting repository to
+usually with some combination of <code>--index-filter</code> and
+<code>--subdirectory-filter</code>. People expect the resulting repository to
be smaller than the original, but you need a few more steps to
actually make it smaller, because git tries hard not to lose your
objects until you tell it to. First make sure that:</p></div>
@@ -981,13 +1156,13 @@ objects until you tell it to. First make sure that:</p></div>
<li>
<p>
You really removed all variants of a filename, if a blob was moved
- over its lifetime. <tt>git log --name-only --follow --all -- filename</tt>
+ over its lifetime. <code>git log --name-only --follow --all -- filename</code>
can help you find renames.
</p>
</li>
<li>
<p>
-You really filtered all refs: use <tt>--tag-name-filter cat -- --all</tt>
+You really filtered all refs: use <code>--tag-name-filter cat -- --all</code>
when calling git-filter-branch.
</p>
</li>
@@ -997,7 +1172,7 @@ to clone, that keeps your original intact.</p></div>
<div class="ulist"><ul>
<li>
<p>
-Clone it with <tt>git clone file:///path/to/repo</tt>. The clone
+Clone it with <code>git clone file:///path/to/repo</code>. The clone
will not have the removed objects. See <a href="git-clone.html">git-clone(1)</a>. (Note
that cloning with a plain path just hardlinks everything!)
</p>
@@ -1010,30 +1185,33 @@ warned.</p></div>
<div class="ulist"><ul>
<li>
<p>
-Remove the original refs backed up by git-filter-branch: say <tt>git
+Remove the original refs backed up by git-filter-branch: say <code>git
for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git
- update-ref -d</tt>.
+ update-ref -d</code>.
</p>
</li>
<li>
<p>
-Expire all reflogs with <tt>git reflog expire --expire=now --all</tt>.
+Expire all reflogs with <code>git reflog expire --expire=now --all</code>.
</p>
</li>
<li>
<p>
-Garbage collect all unreferenced objects with <tt>git gc --prune=now</tt>
+Garbage collect all unreferenced objects with <code>git gc --prune=now</code>
(or if your git-gc is not new enough to support arguments to
- <tt>--prune</tt>, use <tt>git repack -ad; git prune</tt> instead).
+ <code>--prune</code>, use <code>git repack -ad; git prune</code> instead).
</p>
</li>
</ul></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">