From: "Christian Couder" <chriscool@xxxxxxxxxxxxx>
From: "Philip Oakley" <philipoakley@xxxxxxx>
From: "Christian Couder" <chriscool@xxxxxxxxxxxxx>
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
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html