From: Philip Oakley Date: Mon, 02 Sep 2013 21:50:06 GMT Subject: Re: [PATCH v3 07/11] Documentation/replace: tell that -f option bypasses the type check Message-ID: <66A16BF0137D40568A34C316DDA6D32E@PhilipOakley> In-Reply-To: <20130902.081157.986549849748779440.chriscool@tuxfamily.org> From: "Christian Couder" > From: "Philip Oakley" >> >> From: "Christian Couder" >> >>> Maybe we can show that in an example. But I think the patch is quite >>> clear as it is and should be enough. >>> >>> If we really want to correct some false beliefs, the best would be >>> to >>> state the truth where those false beliefs are stated. >>> >> I've added a sub-comment to the original SO post that started this >> thread (my post $gmane/231598 - SO/a/18027030/717355), but given the >> guy's blog has comments going back to 2009 I suspect its a bit of a >> http://xkcd.com/386/ task, hence my desire that it's explicitly >> mentioned in the 'replace' documentation. In addition, if the guy >> doesn't correct his post I'll mark it down in a couple of days to >> make >> it plain to other readers it's in error. >> >> The creation of a (merge?) commit that's equivalent to a graft line >> isn't something that jumps out (to me) as an easy couple lines of >> bash >> script. >> >> A 'graft2replace' script (or 'git-graft' command) which takes an >> existing graft file (or command line list) and creates the >> replacement >> objects and then does the replace, all while still in a dirty tree >> would be the holy grail for properly deprecating grafts (which are >> sooo easy to create) > > You mean something like the following: > > $ cat ./graft2replace.sh > #!/bin/bash > > while read orig parents > do > printf "%s" "git cat-file commit $orig" > printf "%s" " | perl -n -e 'print unless /^parent /'" > insn='' > for commit in $parents; do insn="$insn print \"parent > $commit\\n\";"; done > printf "%s" " | perl -n -e 'print; if (/^tree /) { $insn }'" > printf "%s\n" " > new_commit.txt" > printf "%s\n" 'REPL=$(git hash-object -t commit -w > new_commit.txt)' Does `hash-object` do the inverese of `cat-file commit`? I didn't find the hash-object(1) man page very informative on that matter and a (very) quick look at its code made me think it was just hashing the raw contents which wouldn't be what what was wanted. > printf "%s\n" "git replace $orig \$REPL" > done > > This generates shell instructions from a graft file. Then you only > need to execute the generated shell instructions. > For example: > > $ cat graft_file.txt > 5bf34fff3186254d7254583675d10ddf98df989b > 79fe155489351e8af829a3106e7150397c57d863 > dcfbab6bea3df3166503f3084cec2679f10f9e80 > fb5657082148297b61fbca7e64d51c1e7870309a > > $ cat graft_file.txt | ./graft2replace.sh > git cat-file commit 5bf34fff3186254d7254583675d10ddf98df989b | > perl -n -e 'print unless /^parent /' | perl -n -e 'print; if (/^tree > /) { print "parent 79fe155489351e8af829a3106e7150397c57d863\n"; print > "parent dcfbab6bea3df3166503f3084cec2679f10f9e80\n"; }' > > new_commit.txt > REPL=$(git hash-object -t commit -w new_commit.txt) > git replace 5bf34fff3186254d7254583675d10ddf98df989b $REPL > git cat-file commit fb5657082148297b61fbca7e64d51c1e7870309a | > perl -n -e 'print unless /^parent /' | perl -n -e 'print; if (/^tree > /) { }' > new_commit.txt > REPL=$(git hash-object -t commit -w new_commit.txt) > git replace fb5657082148297b61fbca7e64d51c1e7870309a $REPL > > Note that I haven't really tested it. > > Best, > Christian. > -- I think we could call it 'git-graft', being the help function/script that converts raw grafts to proper object replacements ;-) Philip