Makefile: rebuild git.o on version change, clean up git$X flags
[gitweb.git] / Documentation / git-filter-branch.txt
index 2074f319a02a9ef6a97ece2129170701024d33cb..eaea82d0a690154223d0553603a08cf1fa27c8ce 100644 (file)
@@ -31,7 +31,7 @@ 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.
 
-WARNING! The rewritten history will have different object names for all
+*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
@@ -50,16 +50,18 @@ Filters
 ~~~~~~~
 
 The filters are applied in the order as listed below.  The <command>
-argument is always evaluated in shell using the 'eval' command.
+argument is always evaluated in shell using the 'eval' command (with the
+notable exception of the commit filter, for technical reasons).
 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.
+and GIT_COMMITTER_DATE are set according to the current commit.
 
 A 'map' 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 'map' function can return several
-ids on separate lines if your commit filter emitted multiple commits.
+rewritten, and "original sha1 id" otherwise; the 'map' function can
+return several ids on separate lines if your commit filter emitted
+multiple commits.
 
 
 OPTIONS
@@ -78,7 +80,7 @@ OPTIONS
        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!).
+       rules *HAVE ANY EFFECT*!).
 
 --index-filter <command>::
        This is the filter for rewriting the index.  It is similar to the
@@ -128,8 +130,9 @@ attached, the rewritten tag won't have it.  Sorry.  (It is by
 definition impossible to preserve signatures at any rate.)
 
 --subdirectory-filter <directory>::
-       Only ever look at the history, which touches the given subdirectory.
-       The result will contain that directory as its project root.
+       Only look at the history which touches the given subdirectory.
+       The result will contain that directory (and only that) as its
+       project root.
 
 -d <directory>::
        Use this option to set the path to the temporary directory used for
@@ -165,12 +168,13 @@ git filter-branch --index-filter 'git update-index --remove filename' newbranch
 Now, you will get the rewritten history saved in the branch 'newbranch'
 (your current branch is left untouched).
 
-To "etch-graft" a commit to the revision history (set a commit to be
-the parent of the current initial commit and propagate that):
+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:
 
-----------------------------------------------------------------------
-git filter-branch --parent-filter sed\ 's/^$/-p <graft-id>/' newbranch
-----------------------------------------------------------------------
+------------------------------------------------------------------------
+git filter-branch --parent-filter 'sed "s/^\$/-p <graft-id>/"' newbranch
+------------------------------------------------------------------------
 
 (if the parent string is empty - therefore we are dealing with the
 initial commit - add graftcommit as a parent).  Note that this assumes
@@ -182,6 +186,13 @@ git filter-branch --parent-filter \
        'cat; test $GIT_COMMIT = <commit-id> && echo "-p <graft-id>"' newbranch
 -------------------------------------------------------------------------------
 
+or even simpler:
+
+-----------------------------------------------
+echo "$commit-id $graft-id" >> .git/info/grafts
+git filter-branch newbranch $graft-id..
+-----------------------------------------------
+
 To remove commits authored by "Darl McBribe" from the history:
 
 ------------------------------------------------------------------------------