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
From: Shawn O. Pearce <hidden> Date: 2016-06-15 22:48:00
Gavin Beatty [off-list ref] wrote:
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.
On Mon, Jan 11, 2010 at 1:14 PM, Gavin Beatty [off-list ref] 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
On Mon, Jan 11, 2010 at 19:38, Avery Pennarun [off-list ref] wrote:
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