ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2010年12月6日 星期一

notes on reading git community book

翻譯一下 git community book
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 的方式存
* packed object 要手動用 git gc 來作,否則都是用 Loose objects 的方式存。

所有的東西都放在 .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

沒有留言:

標籤

網誌存檔