git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: How to put tree into index

From
Matthew Cengia <mattcen@gmail.com>
Date
Nov 20, 2013, 12:25 UTC
Message-ID
<20131120122537.GE26413@debian.cengia.id.au>
In-Reply-To
<20131120154714.39fc5202@snail>

On 2013-11-20 15:47, Alexander GQ Gerasiov wrote: [...]

> So my question is
> How to put into index tree-object with known sha1 and given name?

I was just reading about something very similar in the Git book: http://git-scm.com/book/en/Git-Internals-Git-Objects#Tree-Objects (read the entire Tree Objects section), and then came up with this, which I think does what you want except it doesn't erase the previous contents of dir2/subdir1:

mattcen@wasp:repo$ ls -la total 8 drwxrwxr-x 2 mattcen mattcen 4096 Nov 20 23:12 . drwx------ 3 mattcen mattcen 4096 Nov 20 23:12 ..

mattcen@wasp:repo$ git init Initialized empty Git repository in /tmp/with-temp-dir.ZDw19F/repo/.git/

mattcen@wasp:repo(master)$ touch .gitignore
mattcen@wasp:repo(master)$ git add .gitignore
mattcen@wasp:repo(master)$ git commit -m Initial\ commit
[master (root-commit) 43d7ee6] Initial commit
 0 files changed
 create mode 100644 .gitignore
mattcen@wasp:repo(master)$ mkdir -p dir1 dir2/subdir1
mattcen@wasp:repo(master)$ touch dir1/file{1..3} dir2/subdir1/some\ files
mattcen@wasp:repo(master)$ git add -A
mattcen@wasp:repo(master)$ git commit -m Add\ files
[master 2654d91] Add files
 0 files changed
 create mode 100644 dir1/file1
 create mode 100644 dir1/file2
 create mode 100644 dir1/file3
 create mode 100644 dir2/subdir1/some files
mattcen@wasp:repo(master)$ git branch A

mattcen@wasp:repo(master)$ git checkout -b B Switched to a new branch 'B'

mattcen@wasp:repo(B)$ git cat-file -p A^{tree} | grep dir1 040000 tree 9599fdeb034597d90d72d2f58396dee096885b79 dir1

mattcen@wasp:repo(B)$ git read-tree --prefix=dir2/subdir1 9599fdeb034597d90d72d2f58396dee096885b79

mattcen@wasp:repo(B)$ git write-tree e1d5abac94058d1f321a3aa087f18d796efc8a0e

mattcen@wasp:repo(B)$ git checkout .

mattcen@wasp:repo(B)$ find * dir1 dir1/file3 dir1/file1 dir1/file2 dir2 dir2/subdir1 dir2/subdir1/some files dir2/subdir1/file3 dir2/subdir1/file1 dir2/subdir1/file2

Hope this helps.
-- 
Regards,
Previous: Alexander GQ GerasiovNext: Johannes Sixt
Message 2 of 3 in “How to put tree into index”
  1. Alexander GQ GerasiovNov 20, 2013
  2. Matthew CengiaNov 20, 2013
  3. Johannes SixtNov 20, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.