Open3

Gitのbareリポジトリはindexを持てる

okuokuokuoku

できた

$ git init --bare
Initialized empty Git repository in /home/oku/bare.git/

$ touch test.txt

$ git hash-object -w test.txt
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git read-tree --empty

$ git update-index --add --cacheinfo 100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 test.txt

$ git write-tree
5efb9bc29c482e023e40e0a2b3b7e49cec842034

$ git commit-tree 5efb9bc29c482e023e40e0a2b3b7e49cec842034 -m "temp"
9c0330554c375a0c82bca0dcee03a0e23d8bc579

$ git update-ref refs/heads/master 9c0330554c375a0c82bca0dcee03a0e23d8bc579

$ git log
commit 9c0330554c375a0c82bca0dcee03a0e23d8bc579 (HEAD -> master)
Author: okuoku <mjt@cltn.org>
Date:   Wed Nov 9 05:22:31 2022 +0900

    temp

↑ の記事だと実際にコミットを作成し read-tree コマンドで読んでいるが、 git read-tree --empty で空のindexを作成することもできる。

okuokuokuoku

update-index の表記

1 argが推奨らしい。↑ では3 arg表記。

--cacheinfo <mode>,<object>,<path>
--cacheinfo <mode> <object> <path>

Directly insert the specified info into the index. For backward compatibility, you can also give these three arguments as three separate parameters, but new users are encouraged to use a single-parameter form.

pathにカンマ含めたくなったらどうすんの。。?単に4つ以上の指定だったら無視する(pathの一部と見做す)実装なのかな。。

$ git update-index --add --cacheinfo 100644,e69de29bb2d1d6434b8b29ae775ad8c2e48c5391,a/b/c/test.txt,next

$ git write-tree
3c065c6edd4661187c8875586b373f206cb521b7

$ git ls-tree -r 3c065c6edd4661187c8875586b373f206cb521b7
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b/c/test.txt,next

... 確かにカンマを含められるけど思ってたのと違う! なんと ls-tree -r はパス名を勝手にfoldする ようだ。この動作を止めるには -t を与える:

$ git ls-tree -tr 3c065c6edd4661187c8875586b373f206cb521b7
040000 tree de29b5c2da1366e41228b2d926750931bc8c439d    a
040000 tree 9d68dd349406c07b2ee073e733fcfa914cd77f27    a/b
040000 tree a07c8581396d15aa17ea1b6c632c1f12031ab629    a/b/c
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391    a/b/c/test.txt,next