Git là một công cụ được sử dụng rộng rãi cho quản lý phiên bản, hỗ trợ quản lý dự án phát triển phần mềm, quy trình khoa học dữ liệu và thậm chí cả kho tài liệu. Tuy nhiên, Git truyền thống có những hạn chế khi xử lý tệp lớn. Các tệp lớn sẽ bị nhân bản ở mỗi lần commit, khiến kho phình to và quy trình làm việc chậm lại do phải sao chép nhiều bản của tệp lớn khi kéo thay đổi. Vì lý do đó, quản lý tệp lớn với Git có thể trở nên kém hiệu quả vì các nguyên nhân sau:
Kích thước kho lớn: Lưu trữ tệp lớn trực tiếp trong kho Git làm tăng kích thước tổng thể, khiến thao tác clone và fetch chậm, đặc biệt khi làm việc với kho từ xa có thể yêu cầu tải lên/tải xuống tệp.
Lưu trữ và quản lý phiên bản kém hiệu quả: Mỗi lần tệp lớn được sửa, Git lưu một phiên bản mới trong lịch sử, dẫn đến kho phình to nhanh chóng.
Vấn đề hiệu năng: Với kho dữ liệu lớn, các thao tác Git (ví dụ: clone, pull, push) trở nên chậm đáng kể và cần nhiều dung lượng lưu trữ hơn.
Trong hướng dẫn này, chúng ta sẽ xem xét chuyên sâu Git Large File Storage (Git LFS), một phần mở rộng của Git hỗ trợ làm việc với các tệp lớn trong kho của bạn. Nó cho phép chúng ta lưu trữ thay đổi của các tệp lớn hiệu quả hơn mà không bị trùng lặp hay tốn thêm lưu trữ. Bạn nên dùng nó bất cứ khi nào dự kiến có các tệp nhị phân lớn trong kho. Tôi sẽ bắt đầu bằng cách giải thích chi tiết hơn Git LFS là gì, hoạt động ra sao, khi nào nên dùng và cách thiết lập hiệu quả.
Git Large File Storage (Git LFS) là một phần mở rộng cho Git giúp cải thiện việc xử lý các tệp lớn.
Nó thay đổi cách Git xử lý việc fetch và clone bằng cách bổ sung chức năng tải dữ liệu từ kho từ xa theo kiểu lazy và thêm một số tính năng quản lý tệp thông minh vào Git.
Ở mọi khía cạnh khác, trải nghiệm người dùng liền mạch và giống hệt Git thông thường.
Git LFS khác gì so với theo dõi tiêu chuẩn của Git
Trong Git truyền thống, chúng ta lưu toàn bộ lịch sử của kho trong thư mục .git. Điều này bao gồm các tệp văn bản thực tế đã được thay đổi theo thời gian. Ngoài ra, toàn bộ kho được tải xuống khi chúng ta gọi git fetch hoặc git clone để có sẵn tất cả tệp. Khi sử dụng Git LFS, một vài điều sẽ thay đổi.
Thứ nhất, Git LFS thay thế các tệp lớn bằng các con trỏ nhẹ đến bộ nhớ từ xa, giảm nhu cầu lưu trữ mọi tệp. Thứ hai, các tệp lớn chỉ được tải xuống khi checkout sang nhánh, nghĩa là chúng ta chỉ tải các tệp lớn khi sẵn sàng làm việc với chúng.
Cuối cùng, nó quản lý bộ nhớ kho cục bộ của bạn để dọn dẹp các phiên bản cũ của tệp, giúp môi trường làm việc gọn gàng.
Git LFS hoạt động như thế nào?
Git LFS sử dụng cơ chế lưu trữ dựa trên con trỏ. Như đã đề cập, khi bạn chỉ định một tệp để LFS theo dõi, Git LFS sẽ thay thế tệp đó bằng một tệp con trỏ trong kho và cũng đặt một bản sao cục bộ trong bộ nhớ đệm.
Khi bạn push các commit, bộ nhớ đệm cục bộ được cập nhật lên kho lưu trữ từ xa (ví dụ: máy chủ LFS của GitHub, GitLab, Bitbucket). Nếu có thay đổi và bạn checkout, thì các thay đổi này cập nhật bộ nhớ đệm cục bộ để cung cấp cho bạn bản làm việc mới nhất.
Nếu bạn muốn tìm hiểu về một trong những kho từ xa phổ biến nhất, GitHub, hãy xem khóa học Nhập môn GitHub.
Có nhiều lợi ích khi sử dụng Git LFS. Nó giữ cho kích thước kho nhỏ và dễ quản lý. Nó cũng cải thiện hiệu năng cho các nhóm làm việc với tệp lớn. Đồng thời, bằng cách tránh trùng lặp không cần thiết của các tệp lớn, nó giúp kích thước kho cục bộ của bạn ở mức hợp lý.
Thiết lập Git LFS
Trước khi sử dụng Git LFS, cần một vài bước để thiết lập. Đây là một quy trình tương đối đơn giản, bao gồm cài đặt phần mở rộng. Nếu bạn có các kho hiện có, bạn sẽ cần di chuyển chúng. Nếu tạo kho mới, bạn có thể khởi tạo Git LFS ngay.
Cài đặt Git LFS
Để sử dụng Git LFS, bạn phải cài đặt nó trên hệ thống. Cách đơn giản nhất là truy cập trang web của git-lfs và cài đặt. Sau khi làm xong, bạn chạy git lfs install một lần trong cửa sổ dòng lệnh để khởi tạo và cài đặt Git LFS hoàn chỉnh.
Sử dụng Git LFS
Sau khi cài đặt, bạn cần đảm bảo Git LFS được cấu hình cho từng kho. Các dịch vụ Git từ xa khác nhau (ví dụ GitHub so với Bitbucket) sẽ có các bước hơi khác nhau. Tốt nhất là làm theo các bước khuyến nghị cho dịch vụ Git từ xa cụ thể của bạn. Ở mức tổng quát, nếu bạn khởi tạo một kho mới, bạn có thể chạy git lfs install trong kho đó để khởi tạo các hook rồi thêm các tệp để theo dõi. Nếu bạn có một kho hiện có, bạn có thể dùng git lfs migrate và sau đó thực hiện các bước dọn dẹp thư mục .git:
Hãy cùng xem một số cách sử dụng Git LFS trong dự án. Chúng ta sẽ đề cập các bước theo dõi, commit, clone và pull các tệp lớn từ một kho Git LFS.
Theo dõi tệp lớn (git lfs track)
Để bắt đầu theo dõi các loại tệp cụ thể, chúng ta có thể dùng lệnh git lfs track <file type>. Chẳng hạn, nếu tôi muốn theo dõi các tệp CSV, tôi sẽ viết lệnh: git lfs track "*.csv". Lệnh này cũng thêm thông tin vào tệp .gitattributes để đảm bảo chúng ta dùng Git LFS cho tệp này. Bây giờ chúng ta phải push tệp .gitattributes trước để đảm bảo theo dõi LFS đúng cách.
Sau khi thêm theo dõi, bạn có thể thêm và commit như bình thường:
git add largefile.csv
git commit -m "Adding large file with Git LFS"
git push origin mainĐược hỗ trợ bởi
Ở phía sau, Git LFS lưu trữ tệp riêng và thay thế nó bằng một con trỏ trong kho. Trải nghiệm nhìn chung sẽ khá liền mạch.
Clone kho có Git LFS (git lfs clone)
Nếu bạn dùng phiên bản Git mới hơn (>= 2.3.0) thì lệnh git clone sẽ tự động hoạt động cho cả tệp LFS và không LFS. Nếu bạn đang dùng phiên bản Git cũ hơn, bạn sẽ cần dùng lệnh chuyên biệt git lfs clone. Lệnh này hoạt động khác so với clone thông thường vì nó sẽ tham chiếu thông tin con trỏ cho các tệp lớn và chỉ clone bản làm việc của mỗi tệp lớn. Để biết thêm về clone trong Git, hãy xem hướng dẫn sau về Git Clone Branch.
Pull các tệp lớn (git lfs pull)
Nếu bạn muốn fetch và checkout các tệp LFS lớn từ kho của mình, bạn có thể dùng chức năng git lfs pull. Lệnh này tách biệt với git pull đơn thuần, vốn chỉ kéo các tệp git.
Ví dụ quy trình làm việc:
git checkout main # check out your main branch
git pull # pull latest git files from the remote, for this branch
git lfs pull # pull latest git lfs files from the remote, for this branchĐược hỗ trợ bởi
Thực hành tốt khi dùng Git LFS
Mặc dù Git LFS là một giải pháp tuyệt vời, nó vẫn có những vấn đề riêng và không được thiết kế để là giải pháp phổ quát. Hãy đảm bảo các thực hành tốt sau khi sử dụng Git LFS để đạt hiệu quả tối đa:
Chỉ dùng Git LFS cho các tệp nhị phân lớn, không dùng cho mã nguồn hoặc tệp văn bản nhỏ.
Thường xuyên loại bỏ tệp không cần thiết bằng: git lfs prune
Tránh theo dõi toàn bộ thư mục, vì có thể gây vấn đề hiệu năng và phình to kho
Đảm bảo tất cả cộng tác viên đã cài đặt Git LFS để tránh thiếu tệp.
Nếu bạn làm theo các hướng dẫn chung này, Git LFS sẽ là công cụ tuyệt vời dành cho bạn!
Các vấn đề thường gặp và cách khắc phục
Vì Git LFS là phần mở rộng của Git, nó cũng có những vấn đề riêng. Điều này đặc biệt đúng vì nó phụ thuộc vào các kho từ xa, vốn có những trục trặc riêng. Dưới đây là một số vấn đề phổ biến bạn có thể gặp khi dùng Git LFS và cách khắc phục.
Vấn đề xác thực với Git LFS
Có nhiều cách dẫn đến lỗi xác thực với Git LFS. Để đảm bảo bạn có thông tin xác thực đúng, hãy kiểm tra những điều sau:
Dùng cấu hình SSH đúng với git config lfs.url ssh://<git-url>
Kiểm tra bạn có quyền đọc/ghi vào nhánh cha vì Git LFS thường theo dõi tới nhánh cha
Thử fetch/clone sạch hoàn toàn từ kho từ xa
Nếu bạn vẫn gặp vấn đề và bạn không phải quản trị viên, hãy liên hệ với người sở hữu dự án để được hỗ trợ quyền truy cập.
Giới hạn và hạn ngạch lưu trữ tệp lớn
Các dịch vụ có thể áp dụng hạn ngạch cho lưu trữ Git LFS. Ví dụ, GitHub có giới hạn 2GB cho người dùng Free và Pro, với giới hạn 5GB mỗi tệp cho người dùng Enterprise Cloud. Đảm bảo bạn không tải lên tệp vượt quá giới hạn của dịch vụ để tránh lỗi.
Di chuyển các kho hiện có để dùng Git LFS
Nếu một kho đã chứa các tệp lớn, hãy di chuyển chúng bằng:
git lfs migrate import --include="*.filetype"Được hỗ trợ bởi
Lệnh này thay thế hồi cứu các tệp lớn bằng các con trỏ LFS.
Kết luận
Git LFS là công cụ thiết yếu để quản lý các tệp lớn một cách hiệu quả đồng thời giữ cho kho nhẹ và hoạt động tốt. Bằng cách tận dụng Git LFS, các nhà phát triển có thể quản lý đúng cách các tệp lớn trong kho của mình. Miễn là bạn tuân thủ các thực hành tốt để tối thiểu hóa phình to, LFS sẽ hỗ trợ đắc lực cho việc theo dõi tệp. Nếu bạn muốn học thêm về Git, hãy tham khảo các tài nguyên sau:
Điều gì xảy ra nếu tôi clone một kho có các tệp Git LFS?⌄
Chạy git clone trên các phiên bản Git mới sẽ tự động fetch kho và các con trỏ LFS. Nếu bạn dùng phiên bản Git cũ hơn, bạn cần chạy git lfs pull để tải về các tệp lớn thực sự. Ngoài ra, dùng git lfs clone sẽ thực hiện tự động việc này.
Làm sao tôi kiểm tra những tệp nào đang được Git LFS theo dõi?⌄
Chạy git lfs track để xem các mẫu tệp đang được theo dõi, và git lfs ls-files để liệt kê các tệp thực tế được lưu bằng LFS.
Nếu tôi hết dung lượng Git LFS trên GitHub hoặc dịch vụ lưu trữ khác thì sao?⌄
Các dịch vụ như GitHub áp dụng giới hạn lưu trữ. Bạn có thể quản lý dung lượng bằng git lfs prune, mua thêm dung lượng, hoặc dùng giải pháp lưu trữ ngoài khác.
Tôi có thể ngừng sử dụng Git LFS sau khi đã bật nó không?⌄
Có, nhưng bạn cần di chuyển các tệp của mình trở lại Git tiêu chuẩn bằng git lfs migrate export --include="*.filetype" để gỡ bỏ theo dõi LFS.
Git là một công cụ được sử dụng rộng rãi cho quản lý phiên bản, hỗ trợ quản lý dự án phát triển phần mềm, quy trình khoa học dữ liệu và thậm chí cả kho tài liệu. Tuy nhiên, Git truyền thống có những hạn chế khi xử lý tệp lớn. Các tệp lớn sẽ bị nhân bản ở mỗi lần commit, khiến kho phình to và quy trình làm việc chậm lại do phải sao chép nhiều bản của tệp lớn khi kéo thay đổi. Vì lý do đó, quản lý tệp lớn với Git có thể trở nên kém hiệu quả vì các nguyên nhân sau:
Trong hướng dẫn này, chúng ta sẽ xem xét chuyên sâu Git Large File Storage (Git LFS), một phần mở rộng của Git hỗ trợ làm việc với các tệp lớn trong kho của bạn. Nó cho phép chúng ta lưu trữ thay đổi của các tệp lớn hiệu quả hơn mà không bị trùng lặp hay tốn thêm lưu trữ. Bạn nên dùng nó bất cứ khi nào dự kiến có các tệp nhị phân lớn trong kho. Tôi sẽ bắt đầu bằng cách giải thích chi tiết hơn Git LFS là gì, hoạt động ra sao, khi nào nên dùng và cách thiết lập hiệu quả.
Nếu bạn mới làm quen với Git, hãy xem hướng dẫn Cách học Git và Khóa học Nhập môn Git.
Git LFS là gì?
Git Large File Storage (Git LFS) là một phần mở rộng cho Git giúp cải thiện việc xử lý các tệp lớn.
Nó thay đổi cách Git xử lý việc fetch và clone bằng cách bổ sung chức năng tải dữ liệu từ kho từ xa theo kiểu lazy và thêm một số tính năng quản lý tệp thông minh vào Git.
Ở mọi khía cạnh khác, trải nghiệm người dùng liền mạch và giống hệt Git thông thường.
Git LFS khác gì so với theo dõi tiêu chuẩn của Git
Trong Git truyền thống, chúng ta lưu toàn bộ lịch sử của kho trong thư mục
.git. Điều này bao gồm các tệp văn bản thực tế đã được thay đổi theo thời gian. Ngoài ra, toàn bộ kho được tải xuống khi chúng ta gọigit fetchhoặcgit cloneđể có sẵn tất cả tệp. Khi sử dụng Git LFS, một vài điều sẽ thay đổi.Thứ nhất, Git LFS thay thế các tệp lớn bằng các con trỏ nhẹ đến bộ nhớ từ xa, giảm nhu cầu lưu trữ mọi tệp. Thứ hai, các tệp lớn chỉ được tải xuống khi checkout sang nhánh, nghĩa là chúng ta chỉ tải các tệp lớn khi sẵn sàng làm việc với chúng.
Cuối cùng, nó quản lý bộ nhớ kho cục bộ của bạn để dọn dẹp các phiên bản cũ của tệp, giúp môi trường làm việc gọn gàng.
Git LFS hoạt động như thế nào?
Git LFS sử dụng cơ chế lưu trữ dựa trên con trỏ. Như đã đề cập, khi bạn chỉ định một tệp để LFS theo dõi, Git LFS sẽ thay thế tệp đó bằng một tệp con trỏ trong kho và cũng đặt một bản sao cục bộ trong bộ nhớ đệm.
Khi bạn push các commit, bộ nhớ đệm cục bộ được cập nhật lên kho lưu trữ từ xa (ví dụ: máy chủ LFS của GitHub, GitLab, Bitbucket). Nếu có thay đổi và bạn checkout, thì các thay đổi này cập nhật bộ nhớ đệm cục bộ để cung cấp cho bạn bản làm việc mới nhất.
Nếu bạn muốn tìm hiểu về một trong những kho từ xa phổ biến nhất, GitHub, hãy xem khóa học Nhập môn GitHub.
Có nhiều lợi ích khi sử dụng Git LFS. Nó giữ cho kích thước kho nhỏ và dễ quản lý. Nó cũng cải thiện hiệu năng cho các nhóm làm việc với tệp lớn. Đồng thời, bằng cách tránh trùng lặp không cần thiết của các tệp lớn, nó giúp kích thước kho cục bộ của bạn ở mức hợp lý.
Thiết lập Git LFS
Trước khi sử dụng Git LFS, cần một vài bước để thiết lập. Đây là một quy trình tương đối đơn giản, bao gồm cài đặt phần mở rộng. Nếu bạn có các kho hiện có, bạn sẽ cần di chuyển chúng. Nếu tạo kho mới, bạn có thể khởi tạo Git LFS ngay.
Cài đặt Git LFS
Để sử dụng Git LFS, bạn phải cài đặt nó trên hệ thống. Cách đơn giản nhất là truy cập trang web của git-lfs và cài đặt. Sau khi làm xong, bạn chạy
git lfs installmột lần trong cửa sổ dòng lệnh để khởi tạo và cài đặt Git LFS hoàn chỉnh.Sử dụng Git LFS
Sau khi cài đặt, bạn cần đảm bảo Git LFS được cấu hình cho từng kho. Các dịch vụ Git từ xa khác nhau (ví dụ GitHub so với Bitbucket) sẽ có các bước hơi khác nhau. Tốt nhất là làm theo các bước khuyến nghị cho dịch vụ Git từ xa cụ thể của bạn. Ở mức tổng quát, nếu bạn khởi tạo một kho mới, bạn có thể chạy
git lfs installtrong kho đó để khởi tạo các hook rồi thêm các tệp để theo dõi. Nếu bạn có một kho hiện có, bạn có thể dùnggit lfs migratevà sau đó thực hiện các bước dọn dẹp thư mục .git:Sử dụng Git LFS trong một dự án
Hãy cùng xem một số cách sử dụng Git LFS trong dự án. Chúng ta sẽ đề cập các bước theo dõi, commit, clone và pull các tệp lớn từ một kho Git LFS.
Theo dõi tệp lớn (git lfs track)
Để bắt đầu theo dõi các loại tệp cụ thể, chúng ta có thể dùng lệnh
git lfs track <file type>. Chẳng hạn, nếu tôi muốn theo dõi các tệp CSV, tôi sẽ viết lệnh:git lfs track "*.csv". Lệnh này cũng thêm thông tin vào tệp.gitattributesđể đảm bảo chúng ta dùng Git LFS cho tệp này. Bây giờ chúng ta phải push tệp.gitattributestrước để đảm bảo theo dõi LFS đúng cách.Thêm và commit các tệp lớn
Sau khi thêm theo dõi, bạn có thể thêm và commit như bình thường:
Ở phía sau, Git LFS lưu trữ tệp riêng và thay thế nó bằng một con trỏ trong kho. Trải nghiệm nhìn chung sẽ khá liền mạch.
Clone kho có Git LFS (git lfs clone)
Nếu bạn dùng phiên bản Git mới hơn (>= 2.3.0) thì lệnh git clone sẽ tự động hoạt động cho cả tệp LFS và không LFS. Nếu bạn đang dùng phiên bản Git cũ hơn, bạn sẽ cần dùng lệnh chuyên biệt git lfs clone. Lệnh này hoạt động khác so với clone thông thường vì nó sẽ tham chiếu thông tin con trỏ cho các tệp lớn và chỉ clone bản làm việc của mỗi tệp lớn. Để biết thêm về clone trong Git, hãy xem hướng dẫn sau về Git Clone Branch.
Pull các tệp lớn (git lfs pull)
Nếu bạn muốn fetch và checkout các tệp LFS lớn từ kho của mình, bạn có thể dùng chức năng
git lfs pull. Lệnh này tách biệt vớigit pullđơn thuần, vốn chỉ kéo các tệp git.Ví dụ quy trình làm việc:
Thực hành tốt khi dùng Git LFS
Mặc dù Git LFS là một giải pháp tuyệt vời, nó vẫn có những vấn đề riêng và không được thiết kế để là giải pháp phổ quát. Hãy đảm bảo các thực hành tốt sau khi sử dụng Git LFS để đạt hiệu quả tối đa:
git lfs pruneNếu bạn làm theo các hướng dẫn chung này, Git LFS sẽ là công cụ tuyệt vời dành cho bạn!
Các vấn đề thường gặp và cách khắc phục
Vì Git LFS là phần mở rộng của Git, nó cũng có những vấn đề riêng. Điều này đặc biệt đúng vì nó phụ thuộc vào các kho từ xa, vốn có những trục trặc riêng. Dưới đây là một số vấn đề phổ biến bạn có thể gặp khi dùng Git LFS và cách khắc phục.
Vấn đề xác thực với Git LFS
Có nhiều cách dẫn đến lỗi xác thực với Git LFS. Để đảm bảo bạn có thông tin xác thực đúng, hãy kiểm tra những điều sau:
git config lfs.url ssh://<git-url>Nếu bạn vẫn gặp vấn đề và bạn không phải quản trị viên, hãy liên hệ với người sở hữu dự án để được hỗ trợ quyền truy cập.
Giới hạn và hạn ngạch lưu trữ tệp lớn
Các dịch vụ có thể áp dụng hạn ngạch cho lưu trữ Git LFS. Ví dụ, GitHub có giới hạn 2GB cho người dùng Free và Pro, với giới hạn 5GB mỗi tệp cho người dùng Enterprise Cloud. Đảm bảo bạn không tải lên tệp vượt quá giới hạn của dịch vụ để tránh lỗi.
Di chuyển các kho hiện có để dùng Git LFS
Nếu một kho đã chứa các tệp lớn, hãy di chuyển chúng bằng:
Lệnh này thay thế hồi cứu các tệp lớn bằng các con trỏ LFS.
Kết luận
Git LFS là công cụ thiết yếu để quản lý các tệp lớn một cách hiệu quả đồng thời giữ cho kho nhẹ và hoạt động tốt. Bằng cách tận dụng Git LFS, các nhà phát triển có thể quản lý đúng cách các tệp lớn trong kho của mình. Miễn là bạn tuân thủ các thực hành tốt để tối thiểu hóa phình to, LFS sẽ hỗ trợ đắc lực cho việc theo dõi tệp. Nếu bạn muốn học thêm về Git, hãy tham khảo các tài nguyên sau: