summaryrefslogtreecommitdiffstats
path: root/git-filter-branch.html
diff options
context:
space:
mode:
authorJunio C Hamano <junio@hera.kernel.org>2007-07-04 06:41:40 +0000
committerJunio C Hamano <junio@hera.kernel.org>2007-07-04 06:41:40 +0000
commitbb0f404400efdcb2661c4e23e54c335fd41d2031 (patch)
treebf8bca8d7c9e5f7960c7a337e6c52f52e490c644 /git-filter-branch.html
parent1d90cb06fff9524ece5485f8d716da466af822d7 (diff)
downloadgit-htmldocs-bb0f404400efdcb2661c4e23e54c335fd41d2031.tar.gz
Autogenerated HTML docs for v1.5.3-rc0-11-ge2b1a
Diffstat (limited to 'git-filter-branch.html')
-rw-r--r--git-filter-branch.html559
1 files changed, 559 insertions, 0 deletions
diff --git a/git-filter-branch.html b/git-filter-branch.html
new file mode 100644
index 000000000..f241d88cb
--- /dev/null
+++ b/git-filter-branch.html
@@ -0,0 +1,559 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
+ "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<meta name="generator" content="AsciiDoc 7.0.2" />
+<style type="text/css">
+/* Debug borders */
+p, li, dt, dd, div, pre, h1, h2, h3, h4, h5, h6 {
+/*
+ border: 1px solid red;
+*/
+}
+
+body {
+ margin: 1em 5% 1em 5%;
+}
+
+a { color: blue; }
+a:visited { color: fuchsia; }
+
+em {
+ font-style: italic;
+}
+
+strong {
+ font-weight: bold;
+}
+
+tt {
+ color: navy;
+}
+
+h1, h2, h3, h4, h5, h6 {
+ color: #527bbd;
+ font-family: sans-serif;
+ margin-top: 1.2em;
+ margin-bottom: 0.5em;
+ line-height: 1.3;
+}
+
+h1 {
+ border-bottom: 2px solid silver;
+}
+h2 {
+ border-bottom: 2px solid silver;
+ padding-top: 0.5em;
+}
+
+div.sectionbody {
+ font-family: serif;
+ margin-left: 0;
+}
+
+hr {
+ border: 1px solid silver;
+}
+
+p {
+ margin-top: 0.5em;
+ margin-bottom: 0.5em;
+}
+
+pre {
+ padding: 0;
+ margin: 0;
+}
+
+span#author {
+ color: #527bbd;
+ font-family: sans-serif;
+ font-weight: bold;
+ font-size: 1.2em;
+}
+span#email {
+}
+span#revision {
+ font-family: sans-serif;
+}
+
+div#footer {
+ font-family: sans-serif;
+ font-size: small;
+ border-top: 2px solid silver;
+ padding-top: 0.5em;
+ margin-top: 4.0em;
+}
+div#footer-text {
+ float: left;
+ padding-bottom: 0.5em;
+}
+div#footer-badges {
+ float: right;
+ padding-bottom: 0.5em;
+}
+
+div#preamble,
+div.tableblock, div.imageblock, div.exampleblock, div.verseblock,
+div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
+div.admonitionblock {
+ margin-right: 10%;
+ margin-top: 1.5em;
+ margin-bottom: 1.5em;
+}
+div.admonitionblock {
+ margin-top: 2.5em;
+ margin-bottom: 2.5em;
+}
+
+div.content { /* Block element content. */
+ padding: 0;
+}
+
+/* Block element titles. */
+div.title, caption.title {
+ font-family: sans-serif;
+ font-weight: bold;
+ text-align: left;
+ margin-top: 1.0em;
+ margin-bottom: 0.5em;
+}
+div.title + * {
+ margin-top: 0;
+}
+
+td div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content div.title:first-child {
+ margin-top: 0.0em;
+}
+div.content + div.title {
+ margin-top: 0.0em;
+}
+
+div.sidebarblock > div.content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+
+div.listingblock > div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock > div.content {
+ padding-left: 2.0em;
+}
+div.quoteblock .attribution {
+ text-align: right;
+}
+
+div.admonitionblock .icon {
+ vertical-align: top;
+ font-size: 1.1em;
+ font-weight: bold;
+ text-decoration: underline;
+ color: #527bbd;
+ padding-right: 0.5em;
+}
+div.admonitionblock td.content {
+ padding-left: 0.5em;
+ border-left: 2px solid silver;
+}
+
+div.exampleblock > div.content {
+ border-left: 2px solid silver;
+ padding: 0.5em;
+}
+
+div.verseblock div.content {
+ white-space: pre;
+}
+
+div.imageblock div.content { padding-left: 0; }
+div.imageblock img { border: 1px solid silver; }
+span.image img { border-style: none; }
+
+dl {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+dt {
+ margin-top: 0.5em;
+ margin-bottom: 0;
+ font-style: italic;
+}
+dd > *:first-child {
+ margin-top: 0;
+}
+
+ul, ol {
+ list-style-position: outside;
+}
+ol.olist2 {
+ list-style-type: lower-alpha;
+}
+
+div.tableblock > table {
+ border-color: #527bbd;
+ border-width: 3px;
+}
+thead {
+ font-family: sans-serif;
+ font-weight: bold;
+}
+tfoot {
+ font-weight: bold;
+}
+
+div.hlist {
+ margin-top: 0.8em;
+ margin-bottom: 0.8em;
+}
+td.hlist1 {
+ vertical-align: top;
+ font-style: italic;
+ padding-right: 0.8em;
+}
+td.hlist2 {
+ vertical-align: top;
+}
+
+@media print {
+ div#footer-badges { display: none; }
+}
+include::./stylesheets/xhtml11-manpage.css[]
+/* Workarounds for IE6's broken and incomplete CSS2. */
+
+div.sidebar-content {
+ background: #ffffee;
+ border: 1px solid silver;
+ padding: 0.5em;
+}
+div.sidebar-title, div.image-title {
+ font-family: sans-serif;
+ font-weight: bold;
+ margin-top: 0.0em;
+ margin-bottom: 0.5em;
+}
+
+div.listingblock div.content {
+ border: 1px solid silver;
+ background: #f4f4f4;
+ padding: 0.5em;
+}
+
+div.quoteblock-content {
+ padding-left: 2.0em;
+}
+
+div.exampleblock-content {
+ border-left: 2px solid silver;
+ padding-left: 0.5em;
+}
+</style>
+<title>git-filter-branch(1)</title>
+</head>
+<body>
+<div id="header">
+<h1>
+git-filter-branch(1) Manual Page
+</h1>
+<h2>NAME</h2>
+<div class="sectionbody">
+<p>git-filter-branch -
+ Rewrite branches
+</p>
+</div>
+</div>
+<h2>SYNOPSIS</h2>
+<div class="sectionbody">
+<div class="verseblock">
+<div 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;]
+ [-d &lt;directory&gt;] &lt;new-branch-name&gt; [&lt;rev-list options&gt;&#8230;]</div></div>
+</div>
+<h2>DESCRIPTION</h2>
+<div class="sectionbody">
+<p>Lets you rewrite git revision history by creating a new branch from
+your current branch, applying custom filters on each revision.
+Those filters can modify each tree (e.g. removing a file or running
+a perl rewrite on all files) or information about each commit.
+Otherwise, all information (including original commit times or merge
+information) will be preserved.</p>
+<p>The command takes the new branch name as a mandatory argument and
+the filters as optional arguments. If you specify no filters, the
+commits will be recommitted without any changes, which would normally
+have no effect and result in the new branch pointing to the same
+branch as your current branch. Nevertheless, this may be useful in
+the future for compensating for some git bugs or such, therefore
+such a usage is permitted.</p>
+<p>WARNING! The rewritten history will have different object names for all
+the objects and will not converge with the original branch. You will not
+be able to easily push and distribute the rewritten branch on top of the
+original branch. Please do not use this command if you do not know the
+full implications, and avoid using it anyway, if a simple single commit
+would suffice to fix your problem.</p>
+<p>Always verify that the rewritten version is correct before disposing
+the original branch.</p>
+<p>Note that since this operation is extensively I/O expensive, it might
+be a good idea to redirect the temporary directory off-disk, e.g. on
+tmpfs. Reportedly the speedup is very noticeable.</p>
+<h3>Filters</h3>
+<p>The filters are applied in the order as listed below. The &lt;command&gt;
+argument is always evaluated in shell using the <em>eval</em> command.
+Prior to that, the $GIT_COMMIT environment variable will be set to contain
+the id of the commit being rewritten. Also, GIT_AUTHOR_NAME,
+GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL,
+and GIT_COMMITTER_DATE is set according to the current commit.</p>
+<p>A <em>map</em> function is available that takes an "original sha1 id" argument
+and outputs a "rewritten sha1 id" if the commit has been already
+rewritten, fails otherwise; the <em>map</em> function can return several
+ids on separate lines if your commit filter emitted multiple commits.</p>
+</div>
+<h2>OPTIONS</h2>
+<div class="sectionbody">
+<dl>
+<dt>
+--env-filter &lt;command&gt;
+</dt>
+<dd>
+<p>
+ This is the filter for modifying the environment in which
+ the commit will be performed. Specifically, you might want
+ to rewrite the author/committer name/email/time environment
+ variables (see <a href="git-commit.html">git-commit(1)</a> for details). Do not forget
+ to re-export the variables.
+</p>
+</dd>
+<dt>
+--tree-filter &lt;command&gt;
+</dt>
+<dd>
+<p>
+ This is the filter for rewriting the tree and its contents.
+ The argument is evaluated in shell with the working
+ directory set to the root of the checked out tree. The new tree
+ is then used as-is (new files are auto-added, disappeared files
+ are auto-removed - neither .gitignore files nor any other ignore
+ rules HAVE ANY EFFECT!).
+</p>
+</dd>
+<dt>
+--index-filter &lt;command&gt;
+</dt>
+<dd>
+<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. For hairy cases, see <a href="git-update-index.html">git-update-index(1)</a>.
+</p>
+</dd>
+<dt>
+--parent-filter &lt;command&gt;
+</dt>
+<dd>
+<p>
+ This is the filter for rewriting the commit's parent list.
+ It will receive the parent string on stdin and shall output
+ the new parent string on stdout. The parent string is in
+ a format accepted by <a href="git-commit-tree.html">git-commit-tree(1)</a>: empty for
+ the initial commit, "-p parent" for a normal commit and
+ "-p parent1 -p parent2 -p parent3 &#8230;" for a merge commit.
+</p>
+</dd>
+<dt>
+--msg-filter &lt;command&gt;
+</dt>
+<dd>
+<p>
+ This is the filter for rewriting the commit messages.
+ The argument is evaluated in the shell with the original
+ commit message on standard input; its standard output is
+ used as the new commit message.
+</p>
+</dd>
+<dt>
+--commit-filter &lt;command&gt;
+</dt>
+<dd>
+<p>
+ This is the filter for performing the commit.
+ If this filter is specified, it will be called instead of the
+ <a href="git-commit-tree.html">git-commit-tree(1)</a> command, with arguments of the form
+ "&lt;TREE_ID&gt; [-p &lt;PARENT_COMMIT_ID&gt;]&#8230;" and the log message on
+ stdin. The commit id is expected on stdout.
+</p>
+<p>As a special extension, the commit filter may emit multiple
+commit ids; in that case, ancestors of the original commit will
+have all of them as parents.</p>
+</dd>
+<dt>
+--tag-name-filter &lt;command&gt;
+</dt>
+<dd>
+<p>
+ This is the filter for rewriting tag names. When passed,
+ it will be called for every tag ref that points to a rewritten
+ object (or to a tag object which points to a rewritten object).
+ The original tag name is passed via standard input, and the new
+ tag name is expected on standard output.
+</p>
+<p>The original tags are not deleted, but can be overwritten;
+use "--tag-name-filter=cat" to simply update the tags. In this
+case, be very careful and make sure you have the old tags
+backed up in case the conversion has run afoul.</p>
+<p>Note that there is currently no support for proper rewriting of
+tag objects; in layman terms, if the tag has a message or signature
+attached, the rewritten tag won't have it. Sorry. (It is by
+definition impossible to preserve signatures at any rate.)</p>
+</dd>
+<dt>
+--subdirectory-filter &lt;directory&gt;
+</dt>
+<dd>
+<p>
+ Only ever look at the history, which touches the given subdirectory.
+ The result will contain that directory as its project root.
+</p>
+</dd>
+<dt>
+-d &lt;directory&gt;
+</dt>
+<dd>
+<p>
+ Use this option to set the path to the temporary directory used for
+ rewriting. When applying a tree filter, the command needs to
+ temporary checkout the tree to some directory, which may consume
+ considerable space in case of large projects. By default it
+ does this in the <em>.git-rewrite/</em> directory but you can override
+ that choice by this parameter.
+</p>
+</dd>
+<dt>
+&lt;rev-list-options&gt;
+</dt>
+<dd>
+<p>
+ When options are given after the new branch name, they will
+ be passed to <a href="git-rev-list.html">git-rev-list(1)</a>. Only commits in the resulting
+ output will be filtered, although the filtered commits can still
+ reference parents which are outside of that set.
+</p>
+</dd>
+</dl>
+</div>
+<h2>Examples</h2>
+<div class="sectionbody">
+<p>Suppose you want to remove a file (containing confidential information
+or copyright violation) from all commits:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch --tree-filter 'rm filename' newbranch</tt></pre>
+</div></div>
+<p>A significantly faster version:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch --index-filter 'git update-index --remove filename' newbranch</tt></pre>
+</div></div>
+<p>Now, you will get the rewritten history saved in the branch <em>newbranch</em>
+(your current branch is left untouched).</p>
+<p>To "etch-graft" a commit to the revision history (set a commit to be
+the parent of the current initial commit and propagate that):</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch --parent-filter sed\ 's/^$/-p &lt;graft-id&gt;/' newbranch</tt></pre>
+</div></div>
+<p>(if the parent string is empty - therefore we are dealing with the
+initial commit - add graftcommit as a parent). Note that this assumes
+history with a single root (that is, no merge without common ancestors
+happened). If this is not the case, use:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch --parent-filter \
+ 'cat; test $GIT_COMMIT = &lt;commit-id&gt; &amp;&amp; echo "-p &lt;graft-id&gt;"' newbranch</tt></pre>
+</div></div>
+<p>To remove commits authored by "Darl McBribe" from the history:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch --commit-filter '
+ if [ "$GIT_AUTHOR_NAME" = "Darl McBribe" ];
+ then
+ shift;
+ while [ -n "$1" ];
+ do
+ shift;
+ echo "$1";
+ shift;
+ done;
+ else
+ git commit-tree "$@";
+ fi' newbranch</tt></pre>
+</div></div>
+<p>The shift magic first throws away the tree id and then the -p
+parameters. Note that this handles merges properly! In case Darl
+committed a merge between P1 and P2, it will be propagated properly
+and all children of the merge will become merge commits with P1,P2
+as their parents instead of the merge commit.</p>
+<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
+point to the top-most revision that a <em>git rev-list</em> of this range
+will print.</p>
+<p>Note that the changes introduced by the commits, and not reverted by
+subsequent commits, will still be in the rewritten branch. If you want
+to throw out _changes_ together with the commits, you should use the
+interactive mode of <a href="git-rebase.html">git-rebase(1)</a>.</p>
+<p>Consider this history:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt> D--E--F--G--H
+ / /
+A--B-----C</tt></pre>
+</div></div>
+<p>To rewrite only commits D,E,F,G,H, but leave A, B and C alone, use:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch ... new-H C..H</tt></pre>
+</div></div>
+<p>To rewrite commits E,F,G,H, use one of these:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>git filter-branch ... new-H C..H --not D
+git filter-branch ... new-H D..H --not C</tt></pre>
+</div></div>
+<p>To move the whole tree into a subdirectory, or remove it from there:</p>
+<div class="listingblock">
+<div class="content">
+<pre><tt>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' directorymoved</tt></pre>
+</div></div>
+</div>
+<h2>Author</h2>
+<div class="sectionbody">
+<p>Written by Petr "Pasky" Baudis &lt;pasky@suse.cz&gt;,
+and the git list &lt;git@vger.kernel.org&gt;</p>
+</div>
+<h2>Documentation</h2>
+<div class="sectionbody">
+<p>Documentation by Petr Baudis and the git list.</p>
+</div>
+<h2>GIT</h2>
+<div class="sectionbody">
+<p>Part of the <a href="git.html">git(7)</a> suite</p>
+</div>
+<div id="footer">
+<div id="footer-text">
+Last updated 04-Jul-2007 06:40:54 UTC
+</div>
+</div>
+</body>
+</html>