Quần Cam

Git LFS - Chí Phèo và nồi cháo hành của Thị Nở

Ở làng Vũ Đại, những năm đầu thế kỉ 21, phong trào phản đối U bờ và Gờ Ráp lên cao như Mùa Xuân Ả Rập.

Chuyện cái lò gạch cũ

Bá Kiến, chủ hãng taxi Sấp Mờ Lờ không thể để mình nằm ngoài trào lưu, quyết định làm một chiến dịch tẩy chay U Bờ và Gờ Ráp. Chí Phèo một designer tài năng ở huyện, nhanh chóng được liên hệ để thiết kế khẩu hiệu phản đối.

Chẳng mấy chốc Phèo đã thiết kế xong version đầu tiên a12345 nặng 100MB, đặt tên là BFF.psd - Big Fucking File (ăn theo anh Elon Musk đó mà). Rồi hắn commit cứ như một developer lành nghề vào repository rồi gửi file cho Bá Kiến.

Bá Kiến lầm bầm: “Tôi chạy taxi chứ có mở cà phê Đen Đá đâu mà anh thiết kế cho tôi trắng với chả đen”. Mặt Phèo tối sầm lại như cái design. Miệng đã bắt đầu lải nhải. Cơ mà hắn vẫn chiều khách chuyển tông sang màu vàng, rồi tiếp tục commit vào repo với version b23456.

Cây muốn lặng mà gió chẳng ngừng, feedback tiếp theo của Bá Kiến như bóp nát trái tim của Phèo: “Màu vàng của cậu nhìn như ấy”. Mặt Phèo đỏ lên, nốc hết một chai Red Label rồi bắt đầu chửi rủa. Cơ mà hắn cũng làm cho xong bằng cách đổi tông sang đỏ. Version lúc này đã được commit là c34567.

Xong việc, Phèo cầm vỏ chai Red Label qua trước nhà Bá Kiến, lăn đùng ra trước sân, la hét om sòm: “Kì này ông mà chê nữa thì tui rạch cho sấp mặt lờ, ủa lộn rạch mặt cho sấp lờ.”

Bá Kiến thấy thế rùng mình, “Thôi dại gì mà vào miệng cọp”, rồi approve bản thiết kế. Đây là cây commit cuối cùng của của Phèo.

git-no-lfs

Sau khi Bá Kiến approve, Phèo khui thêm một chai Red Label nữa và push repo lên Github.

Hắn vừa push vừa chửi. Bao giờ cũng thế, cứ rượu vào push code là hắn chửi. Bắt đầu hắn chửi Linus Torvalds. Có hề gì? Linux có của riêng nhà nào? Rồi hắn chửi Mark Zuckerberg. Thế cũng chẳng sao: Facebook ai cũng chơi nhưng chẳng là ai. Tức mình, hắn chửi ngay tất cả làng Vũ Đại. Nhưng cả làng Vũ Đại ai cũng nhủ: “Chắc nó trừ mình ra!”. Tức éo chịu được. Phèo nốc cho say, cho quên đi sự đời.

Tỉnh dậy Phèo thấy mình đang ở trong một cái lò gạch cũ với người đàn bà. Chuyện thể dục ABC trước đó của hai người thì chắc ai cũng biết.

Và cái nồi cháo hành

Về phần Bá Kiến sau khi nhận được repo chứa bản design của Phèo thì đã in ra hàng nghìn khẩu hiệu dán lên đít toàn bộ taxi của hãng mình.

taxi-uber

Hả hê, Bá Kiến quyết tiến tới làm thêm một website để tẩy chay U Bờ và Gờ Ráp nữa. Thế là Thị Nở,front-end dev nức tiếng vì “nhan sắc” ở huyện, được chọn để phát triển website.

Đêm xuống, ở cái lò gạch cũ của mình, sau khi XYZ với người đàn ông lạ mặt trong tay vẫn đang giữ chặt chai Red Label, Nở ngồi vào bàn và tiến hành clone repo của Bá Kiến.

Cloning into 'sml-uber-grab'...
remote: Counting objects: 112917, done.
remote: Compressing objects: 100% (27/27), done.
2.2% (2259/112917), 884.00 KiB | 9.00 KiB/s

“Đệch, cá mập lại cắn cáp làng Vũ Đại”, thị chửi thầm. Kiểu này chắc clone tới sáng mai. “Cơ mà làm quái gì mà repo nặng thế?”.

Thị liền mở github lên kiểm tra, dung lượng của repo những 1GB. Tức tối, Nở liền git blame và nhận ra thằng nằm sải lai ngoài kia chính là committer qua avatar trên Github.

Giận sôi người, Thị Nở hất nguyên nồi cháo hành đang nấu vào mặt Phèo, rồi buông câu hững hờ tưởng chỉ có trong ngôn tình “Ta đừng bao giờ gặp lại nhau nữa”. Cứ như là chưa bao giờ “ăn nằm” với nhau vậy.

Phèo lòng đau như cắt, nốc nốt phần còn lại của chai Red Label, rồi cầm vỏ chai qua nhà Bá Kiến.

Bá Kiến dụi mắt ngái ngủ. – Chẳng phải tôi đã trả tiền thiết kế cho anh rồi sao?

Hắn dõng dạc: – Tao muốn làm người lương thiện.

Bá Kiến cười ha hả: – ồ tưởng gì! Tôi chỉ cần anh lương thiện cho thiên hạ nhờ.

Hắn lắc đầu: – Không được! Ai cho tao lương thiện? Chỉ còn một cách này thôi … cách này…

Rồi phần tiếp theo của câu chuyện diễn ra rất đúng quy trình như câu chuyện của Nam Cao, Bá Kiến thăng thiên, Phèo tự vẫn, Nở chờ chửa, làng Vũ Đại nhao nhao.

Chuyện cái repo

Rốt cục chuyện gì đã xảy ra với cái repo? Điều gì đã khiến cho nó nặng những 1GB?

Nếu bạn có đọc bài viết Packfile - Người hùng của Git, ta biết rằng Git sẽ chỉ lưu delta vào packfiles và nén chúng để giảm dung lượng lưu trữ. Nhưng với những file kích thước to như Photoshop PSD hay hình ảnh JPG, PNG thì mọi chuyện lại khác, hầu như chúng không có delta, đồng thời thuật toán nén cũng không quá hiệu quả cho những loại file này, nên toàn bộ nội dung của file được lưu vào các git object. Thành thử ra kích thước của cái repo lên đến cả gigabyte.

Số phận của Phèo, Nở và Bá Kiến có lẽ đã rất khác nếu Phèo biết dùng Git LFS.

Git LFS

Git LFS (Large File Storage) là lời giải cho bài toán lưu trữ file lớn trong Git.

Cách sử dụng

Cách sử dụng Git LFS khá đơn giản. Đầu tiên bạn cần tải git-lfs

brew install git-lfs

Và trong trường hợp như của Phèo ở trên, anh ấy có thể ra lệnh cho LFS track những file *.psd trong repo của mình.

git lfs track "*.psd"

Rồi commit và push như thường. Khi Nở clone repo xuống, Git LFS chỉ tải phiên bản cuối cùng xuống nếu được yêu cầu.

Cách hoạt động

Thật ra cách Git LFS hoạt động đơn giản hơn chúng ta tưởng. Không có delta, không có packfile gì cao siêu cả.

Git LFS sẽ cắn vào các hook trong repo của bạn, sau đó thay vì để GIt ghi toàn bộ blob của BFF.psd, LFS sẽ upload file của bạn lên server LFS (git-lfs.github.com nếu bạn dùng service của Github), rồi ghi đè lại blob của BFF.psd trong git history.

Mỗi file blob của bạn giờ thay vì là nguyên cái blob, sẽ trở thành một pointer trỏ đến LFS server.

git-lfs

Cat blob object ra ta sẽ thấy là.

git cat-file -p 03da87d36665e6fedea9991bd3242ed1bf81acd4

version https://git-lfs.github.com/spec/v1
oid sha256:fdda9701f1d8ff56a5e8bcadcf5b04dba66ad7e08511700de4675d20fda2bc71
size 57809018

Bài viết này giúp tui tăng lương như thế nào?

Như thường lệ bài viết không giúp bạn tăng lương. Nhưng nó giúp bạn:

  1. Tiết kiệm được kha khá vùng nhớ với Git LFS.
  2. Thời gian clone repo ngắn hơn khá nhiều. Như với repo ở trên bạn tiết kiệm được đến 66.666% thời gian.

Một số chú ý khi dùng Git LFS

  1. Git LFS có thể trở nên chậm nếu bạn track quá nhiều file nên chỉ nên track những file lớn.
  2. Để migrate một repo đã có sẵn qua dùng Git LFS bạn có thể chạy lệnh git lfs migrate import.

Protocol

Có thể mình sẽ viết phần tiếp theo mô tả cách protocol LFS hoạt động, nhưng nó tùy vào việc mình có siêng hay không. Các bạn chờ nhé.

Trong thời gian chờ bạn có thể xem video này.


NGUY HIỂM! KHU VỰC NHIỀU GIÓ!
Khuyến cáo giữ chặt bàn phím và lướt thật nhanh khi đi qua khu vực này.
Chức năng này hỗ trợ markdown và các thứ liên quan.

Bài viết cùng chủ đề

Packfile - Người hùng thầm lặng của Git

Cung cấp một số thông tin cơ bản về cấu trúc dữ liệu và Packfile của Git và giúp cho tác giả tiết kiệm $10 Đỗ Năm Trăm.

[Phỏng vấn] Parse file XML kích thước lớn như thế nào?

DOM là cách thông thường và gần như là chuẩn mực để parse file XML, tuy nhiên với những file XML lớn thì dùng DOM không thực sự hiệu quả. Bài viết giới thiệu cách dùng SAX parser với Saxy.

Randomart và thuật toán The Drunken Bishop

Bài viết giới thiệu giải thuật The Drunken Bishop của OpenSSH.