Code

documentation: replace Discussion section by link to user-manual chapter
[git.git] / git-filter-branch.sh
index 0ff3475525a0d50739f218abbac91eb2dc926430..a4b6577bd496819232754c1275b7c1e798b0470c 100755 (executable)
@@ -8,9 +8,6 @@
 # a new branch. You can specify a number of filters to modify the commits,
 # files and trees.
 
-USAGE="git-filter-branch [-d TEMPDIR] [FILTERS] DESTBRANCH [REV-RANGE]"
-. git-sh-setup
-
 warn () {
         echo "$*" >&2
 }
@@ -26,6 +23,20 @@ map()
        fi
 }
 
+# if you run 'skip_commit "$@"' in a commit filter, it will print
+# the (mapped) parents, effectively skipping the commit.
+
+skip_commit()
+{
+       shift;
+       while [ -n "$1" ];
+       do
+               shift;
+               map "$1";
+               shift;
+       done;
+}
+
 # override die(): this version puts in an extra line break, so that
 # the progress is still visible
 
@@ -69,6 +80,20 @@ set_ident () {
        echo "[ -n \"\$GIT_${uid}_NAME\" ] || export GIT_${uid}_NAME=\"\${GIT_${uid}_EMAIL%%@*}\""
 }
 
+# This script can be sourced by the commit filter to get the functions
+test "a$SOURCE_FUNCTIONS" = a1 && return
+this_script="$(cd "$(dirname "$0")"; pwd)"/$(basename "$0")
+export this_script
+
+USAGE="[--env-filter <command>] [--tree-filter <command>] \
+[--index-filter <command>] [--parent-filter <command>] \
+[--msg-filter <command>] [--commit-filter <command>] \
+[--tag-name-filter <command>] [--subdirectory-filter <directory>] \
+[--original <namespace>] [-d <directory>] [-f | --force] \
+[<rev-list options>...]"
+
+. git-sh-setup
+
 tempdir=.git-rewrite
 filter_env=
 filter_tree=
@@ -125,7 +150,7 @@ do
                filter_msg="$OPTARG"
                ;;
        --commit-filter)
-               filter_commit="$OPTARG"
+               filter_commit='SOURCE_FUNCTIONS=1 . "$this_script";'" $OPTARG"
                ;;
        --tag-name-filter)
                filter_tag_name="$OPTARG"
@@ -134,7 +159,7 @@ do
                filter_subdir="$OPTARG"
                ;;
        --original)
-               orig_namespace="$OPTARG"
+               orig_namespace=$(expr "$OPTARG/" : '\(.*[^/]\)/*$')/
                ;;
        *)
                usage
@@ -170,13 +195,6 @@ do
        esac
 done < "$tempdir"/backup-refs
 
-case "$GIT_DIR" in
-/*)
-       ;;
-*)
-       GIT_DIR="$(pwd)/../../$GIT_DIR"
-       ;;
-esac
 export GIT_DIR GIT_WORK_TREE=.
 
 # These refs should be updated if their heads were rewritten
@@ -298,7 +316,7 @@ do
        # Assign the boundarie(s) in the set of rewritten commits
        # as the replacement commit(s).
        # (This would look a bit nicer if --not --stdin worked.)
-       for p in $((cd "$workdir"/../map; ls | sed "s/^/^/") |
+       for p in $( (cd "$workdir"/../map; ls | sed "s/^/^/") |
                git rev-list $ref --boundary --stdin |
                sed -n "s/^-//p")
        do