🏹
Gitコマンド入門::Gitオブジェクト(read-tree,--prefix)第五十二回
みなさんこんにちは! 今回は前回に引き続き、配管工事コマンドをやって行きますね。
git read-tree --prefix=<フォルダ名> <treeのハッシュ値>
を実行すると、それだけで、ディレクトリ構造が作成できるんですよね~ いたって簡単お手軽です!
前回の記事はこちらから!
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フォルダー
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 オブジェクトが格納できるので、これで、木のような枝分かれの状態となります!
それでは、今回はここまで、お疲れ様でした!
Discussion