Open3
Gitのbareリポジトリはindexを持てる
前Gitのbareリポジトリに直接コミットを作成するってのをやった。
これは手でindexのパスを指定してコミットしていたが、
によると直接できるらしい。indexへの書き込みさえ実現できれば、後は
で実際のコミットが作成できる。
できた
$ 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を作成することもできる。
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