🏹

Gitコマンド入門::Gitオブジェクト(read-tree,--prefix)第五十二回

4 min read

みなさんこんにちは! 今回は前回に引き続き、配管工事コマンドをやって行きますね。
git read-tree --prefix=<フォルダ名> <treeのハッシュ値> を実行すると、それだけで、ディレクトリ構造が作成できるんですよね~ いたって簡単お手軽です!

前回の記事はこちらから!

https://zenn.dev/shiozumi/articles/b2bd54b8862a1a

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

今日の課題も前回同様、ここを参考にしています!

https://git-scm.com/book/ja/v2/Gitの内側-Gitオブジェクト

それでは早速いつもの~ git initから!

$ mkdir func0052 && cd $_
// フォルダー作成と移動を同時に実行、
// 第52回なので、func0052

$ git init
// 毎度のイニシャル!

echo 'version 1' | git hash-object -w --stdin

$ echo 'version 1' | git hash-object -w --stdin
83baae61804e65cc73a7201a7252750c76066a30

$ find .git/objects/ -type f
.git/objects/83/baae61804e65cc73a7201a7252750c76066a30

$ git cat-file -t 83baae61804e65cc73a7201a7252750c76066a30
blob
// まずは、blob オブジェクトが作成されました!

$ git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30
version 1
// ファイルの中身も、確認して置きます!

git update-index --add --cacheinfo

$ git update-index --add --cacheinfo 100644 \
83baae61804e65cc73a7201a7252750c76066a30 version_1.txt

これで、ステージングエリアに、add 完了、ファイル名は、version_1.txt です。

git write-tree

$ git write-tree
add3bb0fc5fcc07d12fe6bcf722dc5ae59922f3a

$ git cat-file -t add3bb0fc5fcc07d12fe6bcf722dc5ae59922f3a
tree
// tree オブジェクトが作成されました!

$ git cat-file -p add3bb0fc5fcc07d12fe6bcf722dc5ae59922f3a
100644 blob 83baae61804e65cc73a7201a7252750c76066a30    version_1.txt
// ファイルの中身も、確認して置きます!

これで、tree オブジェクトの作成完了! version_1.txt を含んでいることも確認!

git read-tree --prefix=<フォルダ名> ハッシュ値

では、今回の目玉コマンド! tree にフォルダー名を付けます!

$ git read-tree --prefix=backup add3bb0fc5fcc07d12fe6bcf722dc5ae59922f3a

$ git write-tree
1ec0006f5de19bf48b31d682a9add333d410fa63

$ git cat-file -t 1ec0006f5de19bf48b31d682a9add333d410fa63
tree
// 当然、treeオブジェクトですね!

$ git cat-file -p 1ec0006f5de19bf48b31d682a9add333d410fa63
040000 tree add3bb0fc5fcc07d12fe6bcf722dc5ae59922f3a    backup
100644 blob 83baae61804e65cc73a7201a7252750c76066a30    version_1.txt
// backup は作成されたものの、version_1.txt がここにもある?

echo '1st' | git commit-tree ハッシュ値

まずは、この状態でコミットしてみましょう!

$ echo '1st' | git commit-tree 1ec0006f5de19bf48b31d682a9add333d410fa63
9454f08df64378af8aef53e17728467724f223a5

$ git cat-file -p 9454f08df64378af8aef53e17728467724f223a5
tree 1ec0006f5de19bf48b31d682a9add333d410fa63
author Makoto Shiozumi <shiozumi@esmile-hd.com> 1616049297 +0900
committer Makoto Shiozumi <shiozumi@esmile-hd.com> 1616049297 +0900

1st

$ git log --stat 9454f08df64378af8aef53e17728467724f223a5

commit 9454f08df64378af8aef53e17728467724f223a5
Author: Makoto Shiozumi <shiozumi@esmile-hd.com>
Date:   Thu Mar 18 15:34:57 2021 +0900

    1st

 backup/version_1.txt | 1 +
 version_1.txt        | 1 +
 2 files changed, 2 insertions(+)
 
// やはり、version_1.txt が重複して登録されました。

$ git reset --hard 9454f08df64378af8aef53e17728467724f223a5
HEAD is now at 9454f08 1st

$ ls -a *
version_1.txt <!-- カレントフォルダー

backup:
.  ..  version_1.txt  <!-- backupフォルダー

version_1.txt がカレントフォルダーと、backupファルダーの両方にありますね。><

git update-index --remove version_1.txt

どうやら、read-tree した時点では、ステージングエリアに、version_1.txt が残っているようです。それを消さないと、ダメですね。(^▽^;)

// では、もう一度、最初からやり直し!
$ git init ~
$ git read-tree --prefix=backup ハッシュ値!
// ここまで、同じ!

// フォルダーの設定をしたあとに、ステージングエリアから削除!
$ git update-index --remove version_1.txt

// そして、この状態で、write-tree
$ git write-tree
b10871933e8fbba035c8a851c2e659371874e76b

$ git cat-file -t b10871933e8fbba035c8a851c2e659371874e76b
tree
// tree オブジェクト完成!

// これで、backup フォルダーのみを含んだ、treeが出来ました!
$ git cat-file -p b10871933e8fbba035c8a851c2e659371874e76b
040000 tree add3bb0fc5fcc07d12fe6bcf722dc5ae59922f3a    backup

$ echo '1st' | git commit-tree  b10871933e8fbba035c8a851c2e659371874e76b
160296324846b878475a159c383d2566896423ae

$ git log --stat 160296324846b878475a159c383d2566896423ae

commit 160296324846b878475a159c383d2566896423ae
Author: Makoto Shiozumi <shiozumi@esmile-hd.com>
Date:   Thu Mar 18 15:54:14 2021 +0900

    1st

 backup/version_1.txt | 1 +
 1 file changed, 1 insertion(+)
 
// これで、backup/version_1.txt のみがリポジトリに登録されましたね!

さあ、これでフォルダー構造も作成できますね! そして、tree オブジェクトの中には、blob の他、tree オブジェクトが格納できるので、これで、木のような枝分かれの状態となります!

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/98a9eabe91682a
https://twitter.com/esmile2013