threads / discuss / 22171

Problem creating commits/trees with commit-tree/mktree

Subject: Problem creating commits/trees with commit-tree/mktree

## tl;dr

4 messages between Jan 11, 2010 and Jan 14, 2010.

replies: 3people: 3as markdown or json

Gavin Beatty· Jan 11, 2010, 18:14 UTC · lore
Hello,

I want to write commits to a branch without touching the index or having a checkout (for a git subcommand I'm writing).

I can create new blobs and trees but can't figure out how to commit a new tree/blob _with_ the old tree.

Currently, I do something a lot like:

objsha=$(echo 'contents' | git hash-object -w --stdin) objtreesha=$(printf "100644 blob $objsha\tfile.txt\000" | git mktree -z) newtreesha=$(printf "040000 tree $objtreesha\ttreefileisin\000" | git mktree -z) echo 'commit msg' | git commit-tree $newtreesha -p $(git rev-parse refs/heads/new)

I get a commit with treefileisin/file.txt. I haven't included the other trees/files so they are gone in this commit. How do I include them? Is commit-tree the wrong tool?

Is there some way to use git ls-tree that I don't know about?
Gavin
-- 
Gavin Beatty

SEMPER UBI SUB UBI
Shawn O. Pearce· Jan 11, 2010, 18:17 UTC · re: Gavin Beatty · lore

Re: Problem creating commits/trees with commit-tree/mktree

Gavin Beatty <gavinbeatty@gmail.com> wrote:
Show 11 quoted lines
> I want to write commits to a branch without touching the index or
> having a checkout (for a git subcommand I'm writing).
> 
> I can create new blobs and trees but can't figure out how to commit a
> new tree/blob _with_ the old tree.
> 
> Currently, I do something a lot like:
> 
> objsha=$(echo 'contents' | git hash-object -w --stdin)
> objtreesha=$(printf "100644 blob $objsha\tfile.txt\000" | git mktree -z)
> newtreesha=$(printf "040000 tree $objtreesha\ttreefileisin\000" | git mktree -z)
You aren't feeding in the old tree contents as part of this command.

If you are really doing this via a script, you should look at git-fast-import. Its faster, and its language better supports this notion of editing an existing tree.

-- 
Shawn.
Avery Pennarun· Jan 11, 2010, 18:38 UTC · re: Gavin Beatty · lore

Re: Problem creating commits/trees with commit-tree/mktree

On Mon, Jan 11, 2010 at 1:14 PM, Gavin Beatty <gavinbeatty@gmail.com> wrote:
> I can create new blobs and trees but can't figure out how to commit a
> new tree/blob _with_ the old tree.
[...]
> I get a commit with treefileisin/file.txt. I haven't included the
> other trees/files so they are gone in this commit. How do I include
> them? Is commit-tree the wrong tool?

When I'm doing similar things, I often prefer just using a temporary git index file to keep track of my intermediate trees. Just set GIT_INDEX_FILE to point at a temporary file; then you can use git-read-tree to read in an old tree, and git-update-index (particularly with the --stdin flag) to update it. Then you can use git-write-tree to convert the temporary index into a real tree object.

Have fun,
Avery
Gavin Beatty· Jan 14, 2010, 23:18 UTC · re: Avery Pennarun · lore

Re: Problem creating commits/trees with commit-tree/mktree

On Mon, Jan 11, 2010 at 19:38, Avery Pennarun <apenwarr@gmail.com> wrote:
Show 6 quoted lines
> When I'm doing similar things, I often prefer just using a temporary
> git index file to keep track of my intermediate trees.  Just set
> GIT_INDEX_FILE to point at a temporary file; then you can use
> git-read-tree to read in an old tree, and git-update-index
> (particularly with the --stdin flag) to update it.  Then you can use
> git-write-tree to convert the temporary index into a real tree object.

Your suggestion works well. git update-index --info-only -z --index-info takes ls-tree -r -z style format and pre-existing objects: just as I wanted.

Thanks, git-fast-import was too much for the quite simple git-related code I need.

-- 
Gavin Beatty

SEMPER UBI SUB UBI

← back to recent threads