Re: [PATCH v3 07/11] Documentation/replace: tell that -f option bypasses the type check
- From
Christian Couder <christian.couder@gmail.com>
- Date
- Sep 3, 2013, 09:29 UTC
- Message-ID
- <CAP8UFD31dawrGEiukHYvfUFtDtqrK-OLMLdqFfdOBU=rDYuAcQ@mail.gmail.com>
- In-Reply-To
- <66A16BF0137D40568A34C316DDA6D32E@PhilipOakley>
On Mon, Sep 2, 2013 at 11:50 PM, Philip Oakley <philipoakley@iee.org> wrote:
Show 25 quoted lines
>
> From: "Christian Couder" <chriscool@tuxfamily.org>
>
>> 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 $RShow 27 quoted lines
>> 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.