Re: [PATCH v3] filter-branch: fix errors caused by refs that point at non-committish
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Mar 25, 2018, 16:25 UTC
- Message-ID
- <xmqqr2o8f7hd.fsf@gitster-ct.c.googlers.com>
- In-Reply-To
- <1521920467-6091-1-git-send-email-orga.chem.job@gmail.com>
Yuki Kokubun <orga.chem.job@gmail.com> writes:
> "git filter-branch -- --all" print error messages when refs that point at > objects that are not committish.
Grammo (third-person singular 'prints' misspelt without 's'; the "when" clause has a complex subject but no verb).
Perhaps this will salvage what you meant:
"git filter-branch -- --all" prints error messages when processing refs that point at objects that are not committish.
Show 8 quoted lines
> Such refs can be created by "git replace" with > trees or blobs. And also "git tag" with trees or blobs can create such refs. > > Filter these problematic refs out early, before they are seen by the logic to > see which refs have been modified and which have been left intact (which is > where the unwanted error messages come from), and warn that these refs are left > unwritten while doing so. > ---
Please sign-off your patch (cf. Documentation/SubmittingPatches).
Otherwise this round looks good.
Thanks.
Show 52 quoted lines
> git-filter-branch.sh | 14 ++++++++++++--
> t/t7003-filter-branch.sh | 14 ++++++++++++++
> 2 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/git-filter-branch.sh b/git-filter-branch.sh
> index 1b7e4b2..41efecb 100755
> --- a/git-filter-branch.sh
> +++ b/git-filter-branch.sh
> @@ -251,8 +251,18 @@ done < "$tempdir"/backup-refs
>
> # The refs should be updated if their heads were rewritten
> git rev-parse --no-flags --revs-only --symbolic-full-name \
> - --default HEAD "$@" > "$tempdir"/raw-heads || exit
> -sed -e '/^^/d' "$tempdir"/raw-heads >"$tempdir"/heads
> + --default HEAD "$@" > "$tempdir"/raw-refs || exit
> +while read ref
> +do
> + case "$ref" in ^?*) continue ;; esac
> +
> + if git rev-parse --verify "$ref"^0 >/dev/null 2>&1
> + then
> + echo "$ref"
> + else
> + warn "WARNING: not rewriting '$ref' (not a committish)"
> + fi
> +done >"$tempdir"/heads <"$tempdir"/raw-refs
>
> test -s "$tempdir"/heads ||
> die "You must specify a ref to rewrite."
> diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
> index 7cb6079..04f79f3 100755
> --- a/t/t7003-filter-branch.sh
> +++ b/t/t7003-filter-branch.sh
> @@ -470,4 +470,18 @@ test_expect_success 'tree-filter deals with object name vs pathname ambiguity' '
> git show HEAD:$ambiguous
> '
>
> +test_expect_success 'rewrite repository including refs that point at non-commit object' '
> + test_when_finished "git reset --hard original" &&
> + tree=$(git rev-parse HEAD^{tree}) &&
> + test_when_finished "git replace -d $tree" &&
> + echo A >new &&
> + git add new &&
> + new_tree=$(git write-tree) &&
> + git replace $tree $new_tree &&
> + git tag -a -m "tag to a tree" treetag $new_tree &&
> + git reset --hard HEAD &&
> + git filter-branch -f -- --all >filter-output 2>&1 &&
> + ! fgrep fatal filter-output
> +'
> +
> test_done