[Git 101] P4: Hiểu Về Thư Mục .git

Tú Phạm - Tony
Eway Engineering
Published in
4 min readJun 21, 2018

God made Universe in 6 days,

Linus made Git in 4 and Git self-hosted in 1

Hãy đi vào bản chất

Có quá nhiều bài viết hướng dẫn về Git command trên internet nhưng không nhiều người giải thích rõ Git hoạt động như thế nào. Câu lệnh bạn vừa thực hiện có ý nghĩ gì với hệ thống? Tại sao bạn có thể / không thể làm việc này?

Thư mục .git chính là nơi chứa toàn bộ dữ liệu giúp Git vận hành, vì vậy nó chính là gì chìa khóa để trả lời rất nhiều câu hỏi.

Bên trong thư mục .git

1. Tổng quát thư mục: ls -lah .git

2. Chi tiết thư mục: tree .git
| — COMMIT_EDITMSG
| — FETCH_HEAD
| — HEAD
| — ORIG_HEAD
| — branches
| — config
| — description
| — hooks
| | — applypatch-msg.sample
| | — commit-msg.sample
| | — post-update.sample
| | — pre-applypatch.sample
| | — pre-commit.sample
| | — pre-push.sample
| | — pre-rebase.sample
| | — prepare-commit-msg.sample
| ` — update.sample
| — index
| — info
| ` — exclude
| — logs
| | — HEAD
| ` — refs
| | — heads
| | ` — master
| ` — remotes
| ` — origin
| | — HEAD
| ` — master
| — objects
| | — 00
| | | — 1f2474338579825f10ead2e615e0fd2c7fef5d
| | ` — 3f8a92672873a15657757db641db839ac00a94
| | — 01
| | | — 8768773696772b7dc21183940afaf50cac4afc
| | | — c9c06e071afacafecff546f14345ff540ac38f
| | ` — f4d5b27da39a65f65d81e5686aa76ad0751ef9
| | — 02

| | — info
| ` — pack
| | — pack-1557677c215d19c278d6d6629c9229d9c3a836a1.idx
| | — pack-1557677c215d19c278d6d6629c9229d9c3a836a1.pack
| | — pack-8156d42e39ebe588b640fae9a1908f9b4715cc2d.idx
| | — pack-8156d42e39ebe588b640fae9a1908f9b4715cc2d.pack
| | — pack-c3b615dec77e9ef334851701c0133ab1aa4ca55e.idx
| ` — pack-c3b615dec77e9ef334851701c0133ab1aa4ca55e.pack
| — packed-refs
| — refs
| | — heads
| | ` — master
| | — remotes
| | ` — origin
| | | — HEAD
| | ` — master
| ` — tags
` — sourcetreeconfig

2. Tác dụng của từng file / folder

2.1 File COMMIT_EDITMSG

Commit message cuối cùng

2.2 File FETCH_HEAD

Giá trị SHA của brand/remote head mới nhất được cập nhật  bởi lệnh git fetch

2.3 File HEAD

Branch hiện tại đang làm việc

2.4 File ORIG_HEAD

Khi thực hiện lệnh merge thì đây là giá trị SHA của branch bạn merge vào

2.5 File config

File cấu hình của repo, thường bao gồm địa chỉ của remote, branch master, ...

2.6 File description

Được sử dụng bởi gitweb, hiện không còn phổ biến

2.7 Folder hooks

Bao gồm một tập các script được viết sẵn được gọi đến trong nhiều trường hợp theo từng kịch bản ví dụ sau khi commit hoặc trước khi rebase

2.8 File index

Index là file nhị phân động và tạm thời miêu tả cấu trúc thư mục của toàn bộ repo và trạng thái của dự án được thể hiện thông qua commit và tree tại một thời điểm nào đó trong lịch sử phát triển

2.9 Folder info

Chứa file exclude có thể sử dụng thay .gitignore trong một số trường hợp

2.10 Folder logs

Chứa lịch sử của từng branch, thường được sử dụng bởi lệnh reflog

2.11 Folder objects

Chứa toàn bộ dữ liệu object của Git được đánh chỉ mục bởi SHA. Git có bốn loại object là: Blobs, Trees, Commits, Tags

  • Blobs: là file nhị phân có thể chứa được mọi loại dữ liệu bất kể là dữ liệu của chương trình gì.
  • Trees: lớp đại diện cho thông tin thư mục như thông tin định danh của blob, đường dẫn, chứa một ít metadata chứa thông tin cấu trúc và các thư mục nhỏ có trong thư mục đó.
  • Commits: Chứa metadata có thông tin về mọi thứ như tên tác giả, người tải lên (commiter), ngày tải lên, thông tin log…
  • Tags: đánh dấu cho dễ đọc. thấy vì một cái tên dài như là 9da581d910c9c4ac93557ca4859e767f5caf5169, chúng ta có thể tên tag là Ver-1.0- Alpha. Dễ nhớ và dễ sử dụng hơn

2.12 Folder refs

Gồm toàn bộ các nhánh đang có trên hệ thống của heads / remotes / tags

Bạn biết gì khi thấy toàn bộ thư mục .git

  • Tốc độ của Git dựa trên hiệu năng của máy local (CPU / Disk IO)
  • Lệnh commit làm gì?

Commit bản chất là tạo ra một snapshot thay đổi trong project. File thay đổi được nén lại và lưu trữ trong thư mục objects với tên file là giá trị hash của file nén.

Ví dụ ta có một commit:

commit dd0343b642986608c7bbc31231d8491339dab775
Author: Tu Pham <tupp@eway.vn>
Date: Wed Nov 15 16:42:19 2017 +0700

feat support login by email

Sau khi commit sẽ có một file tương ưng bên trong thư mục objects

  • Dữ liệu tạo ra bởi lệnh commit sẽ tồn tại vĩnh viễn

Đừng commit Video yêu thích của bạn lên!

  • Dùng lệnh git clone -depth [depth] [remote-url]

Độ lớn của project Jira là 677MB với hơn 47,000 commit. Shallow clone mất 29.5 giây, full clone mất 4 phút 24 giây (Thông tin từ Jira)

  • HEAD và các file tương tự chỉ đóng vai trò con trỏ vào branch

--

--

Tú Phạm - Tony
Eway Engineering

Ceo @AdFlex, ex CTO @ Eway, Co-founder of DYNO, Google Developer Expert on Cloud Platform