]> git.ipfire.org Git - thirdparty/git.git/blobdiff - git-filter-branch.sh
git-submodule: replace duplicated code with a module_list function
[thirdparty/git.git] / git-filter-branch.sh
index 80e99e539477cbd7266b19c1bd90d424cf1341ee..2871a59e3280584a2620a67f53e2e28dc808dac0 100755 (executable)
@@ -97,9 +97,11 @@ USAGE="[--env-filter <command>] [--tree-filter <command>] \
 OPTIONS_SPEC=
 . git-sh-setup
 
-git diff-files --quiet &&
+if [ "$(is_bare_repository)" = false ]; then
+       git diff-files --quiet &&
        git diff-index --cached --quiet HEAD -- ||
        die "Cannot rewrite branch(es) with a dirty working directory."
+fi
 
 tempdir=.git-rewrite
 filter_env=
@@ -234,7 +236,7 @@ case "$filter_subdir" in
        ;;
 *)
        git rev-list --reverse --topo-order --default HEAD \
-               --parents --full-history "$@" -- "$filter_subdir"
+               --parents "$@" -- "$filter_subdir"
 esac > ../revs || die "Could not get the commits"
 commits=$(wc -l <../revs | tr -d " ")
 
@@ -359,9 +361,17 @@ do
        ;;
        $_x40)
                echo "Ref '$ref' was rewritten"
-               git update-ref -m "filter-branch: rewrite" \
-                               "$ref" $rewritten $sha1 ||
-                       die "Could not rewrite $ref"
+               if ! git update-ref -m "filter-branch: rewrite" \
+                                       "$ref" $rewritten $sha1 2>/dev/null; then
+                       if test $(git cat-file -t "$ref") = tag; then
+                               if test -z "$filter_tag_name"; then
+                                       warn "WARNING: You said to rewrite tagged commits, but not the corresponding tag."
+                                       warn "WARNING: Perhaps use '--tag-name-filter cat' to rewrite the tag."
+                               fi
+                       else
+                               die "Could not rewrite $ref"
+                       fi
+               fi
        ;;
        *)
                # NEEDSWORK: possibly add -Werror, making this an error
@@ -406,15 +416,17 @@ if [ "$filter_tag_name" ]; then
                echo "$ref -> $new_ref ($sha1 -> $new_sha1)"
 
                if [ "$type" = "tag" ]; then
-                       new_sha1=$(git cat-file tag "$ref" |
+                       new_sha1=$( ( printf 'object %s\ntype commit\ntag %s\n' \
+                                               "$new_sha1" "$new_ref"
+                               git cat-file tag "$ref" |
                                sed -n \
                                    -e "1,/^$/{
-                                         s/^object .*/object $new_sha1/
-                                         s/^type .*/type commit/
-                                         s/^tag .*/tag $new_ref/
+                                         /^object /d
+                                         /^type /d
+                                         /^tag /d
                                        }" \
                                    -e '/^-----BEGIN PGP SIGNATURE-----/q' \
-                                   -e 'p' |
+                                   -e 'p' |
                                git mktag) ||
                                die "Could not create new tag object for $ref"
                        if git cat-file tag "$ref" | \
@@ -434,18 +446,20 @@ rm -rf "$tempdir"
 
 trap - 0
 
-unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE
-test -z "$ORIG_GIT_DIR" || {
-       GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR
-}
-test -z "$ORIG_GIT_WORK_TREE" || {
-       GIT_WORK_TREE="$ORIG_GIT_WORK_TREE" &&
-       export GIT_WORK_TREE
-}
-test -z "$ORIG_GIT_INDEX_FILE" || {
-       GIT_INDEX_FILE="$ORIG_GIT_INDEX_FILE" &&
-       export GIT_INDEX_FILE
-}
-git read-tree -u -m HEAD
+if [ "$(is_bare_repository)" = false ]; then
+       unset GIT_DIR GIT_WORK_TREE GIT_INDEX_FILE
+       test -z "$ORIG_GIT_DIR" || {
+               GIT_DIR="$ORIG_GIT_DIR" && export GIT_DIR
+       }
+       test -z "$ORIG_GIT_WORK_TREE" || {
+               GIT_WORK_TREE="$ORIG_GIT_WORK_TREE" &&
+               export GIT_WORK_TREE
+       }
+       test -z "$ORIG_GIT_INDEX_FILE" || {
+               GIT_INDEX_FILE="$ORIG_GIT_INDEX_FILE" &&
+               export GIT_INDEX_FILE
+       }
+       git read-tree -u -m HEAD
+fi
 
 exit $ret