diff options
Diffstat (limited to 'git-filter-branch.sh')
-rwxr-xr-x | git-filter-branch.sh | 57 |
1 files changed, 53 insertions, 4 deletions
diff --git a/git-filter-branch.sh b/git-filter-branch.sh index fff8093d4..98f1779cf 100755 --- a/git-filter-branch.sh +++ b/git-filter-branch.sh @@ -275,15 +275,57 @@ commits=$(wc -l <../revs | tr -d " ") test $commits -eq 0 && die "Found nothing to rewrite" # Rewrite the commits +report_progress () +{ + if test -n "$progress" && + test $git_filter_branch__commit_count -gt $next_sample_at + then + count=$git_filter_branch__commit_count + + now=$(date +%s) + elapsed=$(($now - $start_timestamp)) + remaining=$(( ($commits - $count) * $elapsed / $count )) + if test $elapsed -gt 0 + then + next_sample_at=$(( ($elapsed + 1) * $count / $elapsed )) + else + next_sample_at=$(($next_sample_at + 1)) + fi + progress=" ($elapsed seconds passed, remaining $remaining predicted)" + fi + printf "\rRewrite $commit ($count/$commits)$progress " +} git_filter_branch__commit_count=0 + +progress= start_timestamp= +if date '+%s' 2>/dev/null | grep -q '^[0-9][0-9]*$' +then + next_sample_at=0 + progress="dummy to ensure this is not empty" + start_timestamp=$(date '+%s') +fi + +if test -n "$filter_index" || + test -n "$filter_tree" || + test -n "$filter_subdir" +then + need_index=t +else + need_index= +fi + while read commit parents; do git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1)) - printf "\rRewrite $commit ($git_filter_branch__commit_count/$commits)" + + report_progress case "$filter_subdir" in "") - GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit + if test -n "$need_index" + then + GIT_ALLOW_NULL_SHA1=1 git read-tree -i -m $commit + fi ;; *) # The commit may not have the subdirectory at all @@ -319,7 +361,7 @@ while read commit parents; do die "tree filter failed: $filter_tree" ( - git diff-index -r --name-only --ignore-submodules $commit && + git diff-index -r --name-only --ignore-submodules $commit -- && git ls-files --others ) > "$tempdir"/tree-state || exit git update-index --add --replace --remove --stdin \ @@ -357,8 +399,15 @@ while read commit parents; do } <../commit | eval "$filter_msg" > ../message || die "msg filter failed: $filter_msg" + + if test -n "$need_index" + then + tree=$(git write-tree) + else + tree="$commit^{tree}" + fi workdir=$workdir @SHELL_PATH@ -c "$filter_commit" "git commit-tree" \ - $(git write-tree) $parentstr < ../message > ../map/$commit || + "$tree" $parentstr < ../message > ../map/$commit || die "could not write rewritten commit" done <../revs |