On Fri, 2008-03-28 at 17:43 +0100, Johannes Sixt wrote: > Alex Bennee schrieb: > > git-checkout dev-branch > > git-filter-branch --tree-filter 'rm -rf big_dira big_dirb' HEAD > > You really shouldn't do it this way, unless you do it on a ramdisk. Better > use an --index-filter. This is modeled after the last example in the man > page (and, of course, untested): I missed the implications of the last example... > git filter-branch --index-filter \ > 'git ls-files -s | > grep -v " big_dira" | > grep -v " big_dirb" | > GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ > git update-index --index-info && > mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD > > where the space before big_dir is actually a literal TAB! Good example. Maybe we should add the following (because plenty of examples is always a good thing IMHO)? >From 341b480bad4ed9f99a54dc66ba20b0cead4594b5 Mon Sep 17 00:00:00 2001 From: Alex Bennee <Alex.Bennee@xxxxxxxxxxxxxxxxxxxxxx> Date: Fri, 28 Mar 2008 18:00:20 +0000 Subject: [PATCH] Update git filter-branch examples for cleaning directories I had to do this to a tree I imported from CVS which had a lot of cruft in it which was taking ages. Luckily Johannes Sixt submitted this scriplet on the list before I finished which makes things clearer. --- Documentation/git-filter-branch.txt | 21 +++++++++++++++++++++ 1 files changed, 21 insertions(+), 0 deletions(-) diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt index 543a1cf..0e4b581 100644 --- a/Documentation/git-filter-branch.txt +++ b/Documentation/git-filter-branch.txt @@ -184,6 +184,27 @@ git filter-branch --index-filter 'git update-index --remove filename' HEAD Now, you will get the rewritten history saved in HEAD. +If you need to remove whole directories it is tempting to use "rm -rf" +in the --tree-filter form, however this will generate a lot of disk IO +on big trees. Hence it's more preferable to use the index filter. For +example: + +-------------------------------------------------------------------------- +git filter-branch --index-filter \ + 'git ls-files -s | + grep -v " big_dira" | + grep -v " big_dirb" | + GIT_INDEX_FILE=$GIT_INDEX_FILE.new \ + git update-index --index-info && + mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE' HEAD +-------------------------------------------------------------------------- + +NB: The grep is matching literal TABs from the output of "git +ls-files". Try <ctrl-v><tab> if your shell keeps giving you a directory +listing every time you hit tab. + + + 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: -- 1.5.5.rc0.6.gdeda.dirty -- Alex, homepage: http://www.bennee.com/~alex/ We reject: kings, presidents, and voting. We believe in: rough consensus and working code. -- Dave Clark -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html