Internals and Plumbing
所有的 objects (是說有被記錄的file 嗎?) 都是以 gzip 壓縮的方式存放,以 他的 sha value 為檔名(?)
git 有兩種保存 object 的方法:
- Loose Objects : 就整個 rev 的所有 file 的壓縮,會以 sha value 為檔名。為求快速,前兩個 char 會被當做 folder name
- Packed Objects : 有點像 diff,如果某個 rev 只是另一個 rev 加一個小小的修改,整個ˊ重存一次太浪費空間,所以就會以 diff 跟 base link 的方式存
所有的東西都放在 .git/objects 裡。
查看 Objects 的方法...
git 把每一個 file, commit, tree, tag 都當做是一個物件(object) 放在這個folder 裡。
所以.
$find . .git/objects
列出來的每個 object ,都可以用$git cat-file -t shavalue
來看他是屬於哪一個type.git 把你目前工作的 base 記錄在 .git/HEAD,可以cat 出來看:
ref: refs/heads/trysquash
-- 我現在是checkout trysquash 這個 branch 在工作。正因為 git 所有的東西(rev, commit, file, tag) 都是以 sha filename 放在 object,
所以剛剛那個 HEAD 的內容,只是指向 objects 中的一個 file。
$cat refs/heads/trysquash
2da4ad933b2079851c37e7334637d745bdfb9c94
看看是什麼type:$git cat-file -t 2da4
commit
再看一下 commit 的內容
$git cat-file commut 2da4
tree e233040dafb15380a01e73d420143a10d66019f4
parent ce00a162dd739865c16c3fab542fb4c9fa504ac2
author Charles Chang 1291615019 +0800
committer Charles Chang 1291615019 +0800
in trysquash
看一下這次 comit 有哪些東西
$fit ls-tree 2da4
100644 blob d79ded6406430e1ab113a70476fa560d938c9292 f1
只有 f1 這個 file.也可看這個 file 的內容
$git cat-file blob d79d
add new line
Reference
branch, remote-tracking branch (是什麼?) 還有tag 實際上都是 reference 到某一個 commit。
這些 reference 別人的記錄,都是記錄在 git/refs 下,並且每個type 都有一個 folder
$ls .git
heads remotes tags
沒有留言:
張貼留言