Re: [BUG] Cannot push some grafted branches
From: Michael J Gruber <hidden>
Date: 2016-06-15 22:55:35
Junio C Hamano venit, vidit, dixit 21.12.2012 17:58:
Michael J Gruber [off-list ref] writes:quoted
While replace refs are much more general than grafts, it seems the two main uses are: - grafts (change the recorded parents for a commit) - svn cleanup (convert tagging commits into tag objects) The latter one being quite a special case already. The script below has helped me move from grafts to replace objects. While not being super clean, something like it may be fit for contrib. I think we ought to help John Doe get along with parents, while we can safely leave most more advanced operations to people who know how to edit a raw object file. Putting that facility into "git-commit" seems to be too encouraging, though - people would use replace when they should use amend or rebase-i. I'd prefer a special git-replace mode (be it "--graft" or "--graft-commit") which does just what my script does. We could add things like "--commit-tag" later, a full blown "object-factory" seems like overkill. Michael --->%--- #!/bin/sh die () { echo "$@" rm -f "$commitfile" exit 1 } warn () { echo "$@" } test $# -gt 0 || die "Usage: $0 <commit> [<parent>]*" for commit do git rev-parse --verify -q "$commit" >/dev/null || die "Cannot parse $commit." test x$(git cat-file -t $commit) == "xcommit" || die "$commit is no commit."s/==/=/ or you have to say #!/bin/bash on the first line, I think. Appears multiple times throughout this script.quoted
done commit="$1" shift commitfile=$(mktemp) git cat-file commit "$commit" | while read a b do if test "$a" != "parent" then echo $a $bYou are losing information on non-header lines by reading without "-r" in the above, and also multi-line headers (e.g. mergetag), aren't you?
Oh yes, it has bashisms and imperfections. It's not a submitted patch, not even RFC. It's meant to show the git-replace mode that many users could benefit from: works for commits only and replaces the parent list, but takes any rev arguments as the new parents, rather than forcing the user to specify a full sha1.
quoted
fi if test "$a" == "tree" then for parent do echo "parent $(git rev-parse $parent)" done fi done >$commitfile hash=$(git hash-object -t commit -w "$commitfile") || die "Cannot create commit object." git replace "$commit" $hash rm -f $commitfile