On Mon, Sep 2, 2013 at 11:50 PM, Philip Oakley <philipoakley@xxxxxxx> wrote: > > From: "Christian Couder" <chriscool@xxxxxxxxxxxxx> > >> 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. I agree with Jonathan's suggest to add an EXAMPLE section in hash-object(1) manpage and maybe a new gitobject(5) manpage too. You can also find a few examples of how git hash-object can be used in t/t6050-replace.sh: For example: R=$(git cat-file commit $HASH2 | sed -e "s/A U/O/" | git hash-object -t commit --stdin -w) && git cat-file commit $R | grep "author O Thor" && git update-ref refs/replace/$HASH2 $R >> 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. Also note that it is obviously broken if you have commits with a commit message that has lines starting with 'parent ' or 'tree '. > I think we could call it 'git-graft', being the help function/script that > converts raw grafts to proper object replacements ;-) I will have a look at improving it, testing it and sending a patch to put it in contrib/. Thanks, Christian. -- 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