Git: Git LFS


Đăng ký nhận thông báo về những video mới nhất
Git LFS

Git LFS là gì?

Git là một hệ thống kiểm soát phiên bản phân tán, có nghĩa là toàn bộ lịch sử của kho lưu trữ được chuyển đến máy khách trong quá trình nhân bản. Đối với các dự án chứa các tệp lớn, đặc biệt là các tệp lớn được sửa đổi thường xuyên, bản sao ban đầu này có thể mất một lượng lớn thời gian, vì mọi phiên bản của mọi tệp phải được khách hàng tải xuống. Git LFS (Lưu trữ tệp lớn - Large File Store) là một tiện ích mở rộng Git được phát triển bởi Atlassian, GitHub và một vài người đóng góp mã nguồn mở khác, giúp giảm tác động của các tệp lớn trong kho lưu trữ của bạn bằng cách tải xuống các phiên bản có liên quan của chúng một cách lười biếng . Cụ thể, các tệp lớn được tải xuống trong quá trình thanh toán thay vì trong quá trình nhân bản hoặc tìm nạp.

Git LFS thực hiện điều này bằng cách thay thế các tệp lớn trong kho lưu trữ của bạn bằng các tệp con trỏ nhỏ . Trong quá trình sử dụng thông thường, bạn sẽ không bao giờ thấy các tệp con trỏ này khi chúng được xử lý tự động bởi Git LFS:

  1. Khi bạn thêm tệp vào kho lưu trữ của mình, Git LFS sẽ thay thế nội dung của nó bằng một con trỏ và lưu trữ nội dung tệp trong bộ đệm Git LFS cục bộ. 

    git lfs - git thêm
  2. Khi bạn đẩy các xác nhận mới đến máy chủ, mọi tệp Git LFS được tham chiếu bởi các xác nhận mới được đẩy sẽ được chuyển từ bộ đệm Git LFS cục bộ của bạn sang kho lưu trữ Git LFS từ xa được gắn vào kho lưu trữ Git của bạn. 

    git lfs - git đẩy
  3. Khi bạn kiểm tra một cam kết có chứa con trỏ Git LFS, chúng sẽ được thay thế bằng các tệp từ bộ đệm Git LFS cục bộ của bạn hoặc được tải xuống từ cửa hàng Git LFS từ xa. git lfs - kiểm tra git

Git LFS là liền mạch: trong bản sao làm việc của bạn, bạn sẽ chỉ thấy nội dung tệp thực tế của mình. Điều này có nghĩa là bạn có thể sử dụng Git LFS mà không thay đổi quy trình làm việc Git hiện tại của bạn; bạn chỉ cần git checkoutchỉnh sửa git add, và git commitnhư bình thường. git clonevà các git pullhoạt động sẽ nhanh hơn đáng kể khi bạn chỉ tải xuống các phiên bản của các tệp lớn được tham chiếu bởi các cam kết mà bạn thực sựkiểm tra, thay vì mọi phiên bản của tệp đã từng tồn tại.

Để sử dụng Git LFS, bạn sẽ cần một máy chủ nhận biết Git LFS như Bitbucket Cloud hoặc Bitbucket Server . Người dùng kho lưu trữ sẽ cần phải cài đặt máy khách dòng lệnh Git LFS hoặc máy khách GUI nhận biết Git LFS như Sourcetree . Sự thật thú vị: Steve Streeting, nhà phát triển Atlassian, người đã phát minh ra Sourcetree, cũng là người đóng góp chính cho dự án Git LFS, vì vậy Sourcetree và Git LFS phối hợp khá tốt.

Git LFS là gì?

Cài đặt Git LFS

  1. Có ba cách dễ dàng để cài đặt Git LFS:

    a. Cài đặt nó bằng trình quản lý gói yêu thích của bạn. git-lfscác gói có sẵn cho Homebrew, MacPorts, dnf và packagecloud ; hoặc là

    b. Tải xuống và cài đặt Git LFS từ trang web của dự án; hoặc là

    c. Cài đặt Sourcetree , ứng dụng khách Git GUI miễn phí đi kèm với Git LFS.

  2. Khi git-lfs có trên đường dẫn của bạn, hãy chạy cài đặt git lfs để khởi tạo Git LFS (bạn có thể bỏ qua bước này nếu bạn đã cài đặt Sourcetree):

    $ git lfs install
    Git LFS initialized.
    

    Bạn sẽ chỉ cần chạy git lfs installmột lần. Sau khi được khởi tạo cho hệ thống của bạn, Git LFS sẽ tự động tự khởi động khi bạn sao chép một kho chứa nội dung Git LFS.

Tạo kho lưu trữ Git LFS mới

Để tạo kho lưu trữ nhận biết Git LFS mới, bạn sẽ cần chạy cài đặt git lfs sau khi bạn tạo kho lưu trữ:

# initialize Git
$ mkdir Atlasteroids
$ cd Atlasteroids
$ git init
Initialized empty Git repository in /Users/tpettersen/Atlasteroids/.git/
# initialize Git LFS
$ git lfs install
Updated pre-push hook.
Git LFS initialized.

Điều này sẽ cài đặt một pre-push hook Git đặc biệt trong kho lưu trữ của bạn, nó sẽ chuyển các tệp Git LFS đến máy chủ khi bạn git push.

Git LFS được kích hoạt tự động cho tất cả các  kho lưu trữ của Bitbucket Cloud . Đối với  Máy chủ Bitbucket , bạn sẽ cần bật Git LFS trong cài đặt kho lưu trữ của mình:

Máy chủ Bitbucket Git LFS

Khi Git LFS được khởi tạo cho kho lưu trữ của bạn, bạn có thể chỉ định tệp nào sẽ theo dõi bằng cách sử dụng git lfs track.

Nhân bản kho lưu trữ Git LFS hiện có

Khi Git LFS được cài đặt, bạn có thể sao chép kho lưu trữ Git LFS như bình thường bằng cách sử dụng git clone. Khi kết thúc quá trình nhân bản, Git sẽ kiểm tra nhánh mặc định (thông thường master) và mọi tệp Git LFS cần thiết để hoàn tất quá trình thanh toán sẽ được tự động tải xuống cho bạn. Ví dụ:

$ git clone git@bitbucket.org:tpettersen/Atlasteroids.git
Cloning into 'Atlasteroids'...
remote: Counting objects: 156, done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 156 (delta 87), reused 0 (delta 0)
Receiving objects: 100% (156/156), 54.04 KiB | 31.00 KiB/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Downloading Assets/Sprites/projectiles-spritesheet.png (21.14 KB)
Downloading Assets/Sprites/productlogos_cmyk-spritesheet.png (301.96 KB)
Downloading Assets/Sprites/shuttle2.png (1.62 KB)
Downloading Assets/Sprites/space1.png (1.11 MB)
Checking out files: 100% (81/81), done.

Có bốn PNGstrong kho lưu trữ này đang được theo dõi bởi Git LFS. Khi chạy git clone, các tệp Git LFS được tải xuống cùng một lúc khi các tệp con trỏ được kiểm tra khỏi kho lưu trữ của bạn.

Tăng tốc độ nhân bản

Nếu bạn đang sao chép một kho lưu trữ với số lượng lớn tệp LFS, git lfs clonelệnh rõ ràng cung cấp hiệu suất tốt hơn nhiều:

$ git lfs clone git@bitbucket.org:tpettersen/Atlasteroids.git
Cloning into 'Atlasteroids'...
remote: Counting objects: 156, done.
remote: Compressing objects: 100% (154/154), done.
remote: Total 156 (delta 87), reused 0 (delta 0)
Receiving objects: 100% (156/156), 54.04 KiB | 0 bytes/s, done.
Resolving deltas: 100% (87/87), done.
Checking connectivity... done.
Git LFS: (4 of 4 files) 1.14 MB / 1.15 MB

Rather than downloading Git LFS files one at a time, the git lfs clone command waits until the checkout is complete, and then downloads any required Git LFS files as a batch. This takes advantage of parallelized downloads, and dramatically reduces the number of HTTP requests and processes spawned (which is especially important for improving performance on Windows).

Pulling and checking out

Just like cloning, you can pull from a Git LFS repository using a normal git pull. Any needed Git LFS files will be downloaded as part of the automatic checkout process once the pull completes:

$ git pull
Updating 4784e9d..7039f0a
Downloading Assets/Sprites/powerup.png (21.14 KB)
Fast-forward
Assets/Sprites/powerup.png | 3 +
Assets/Sprites/powerup.png.meta | 4133 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 4136 insertions(+)
create mode 100644 Assets/Sprites/projectiles-spritesheet.png
create mode 100644 Assets/Sprites/projectiles-spritesheet.png.meta

No explicit commands are needed to retrieve Git LFS content. However, if the checkout fails for an unexpected reason, you can download any missing Git LFS content for the current commit with git lfs pull:

$ git lfs pull
Git LFS: (4 of 4 files) 1.14 MB / 1.15 MB

Speeding up pulls

Giống như git lfs clone, git lfs pulltải xuống các tệp Git LFS của bạn dưới dạng một lô. Nếu bạn biết một số lượng lớn tệp đã thay đổi kể từ lần cuối bạn kéo, bạn có thể muốn vô hiệu hóa tải xuống Git LFS tự động trong khi thanh toán, sau đó tải xuống hàng loạt nội dung Git LFS của bạn một cách rõ ràng git lfs pull. Điều này có thể được thực hiện bằng cách ghi đè cấu hình Git của bạn với -ctùy chọn khi bạn gọi git pull:

$ git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull

Vì đó là cách gõ khá nhiều, bạn có thể muốn tạo một bí danh Gitđơn giản để thực hiện thao tác kéo Git và Git LFS theo đợt cho bạn:

$ git config --global alias.plfs "\!git -c filter.lfs.smudge= -c filter.lfs.required=false pull && git lfs pull"
$ git plfs

Điều này sẽ cải thiện đáng kể hiệu năng khi một số lượng lớn tệp Git LFS cần được tải xuống (một lần nữa, đặc biệt là trên Windows).

Theo dõi tệp với Git LFS

Khi bạn thêm một loại tệp lớn mới vào kho lưu trữ của mình, bạn sẽ cần nói với Git LFS để theo dõi nó bằng cách chỉ định một mẫu bằng cách sử dụng git lfs tracklệnh:

$ git lfs track "*.ogg"
Tracking *.ogg

Lưu ý rằng các trích dẫn xung quanh "*.ogg"là quan trọng. Việc bỏ qua chúng sẽ khiến ký tự đại diện được mở rộng bởi trình bao của bạn và các mục nhập riêng lẻ sẽ được tạo cho mỗi .oggtệp trong thư mục hiện tại của bạn:

# probably not what you want
$ git lfs track *.ogg
Tracking explode.ogg
Tracking music.ogg
Tracking phaser.ogg

Các mẫu được Git LFS hỗ trợ giống như các mẫu được hỗ trợ bởi .gitignore, ví dụ:

# track all .ogg files in any directory
$ git lfs track "*.ogg"
# track files named music.ogg in any directory
$ git lfs track "music.ogg"
# track all files in the Assets directory and all subdirectories
$ git lfs track "Assets/"
# track all files in the Assets directory but *not* subdirectories
$ git lfs track "Assets/*"
# track all ogg files in Assets/Audio
$ git lfs track "Assets/Audio/*.ogg"
# track all ogg files in any directory named Music
$ git lfs track "**/Music/*.ogg"
# track png files containing "xxhdpi" in their name, in any directory
$ git lfs track "*xxhdpi*.png

Các mẫu này có liên quan đến thư mục mà bạn đã chạy git lfs tracklệnh. Để giữ cho mọi thứ đơn giản, tốt nhất là chạy git lfs tracktừ thư mục gốc của kho lưu trữ của bạn. Lưu ý rằng Git LFS không hỗ trợ các mẫu phủ định như .gitignorekhông.

Sau khi chạy git lfs track, bạn sẽ nhận thấy một tệp mới có tên .gitattributestrong thư mục bạn đã chạy lệnh từ đó. .gitattributeslà một cơ chế Git để liên kết các hành vi đặc biệt với các mẫu tệp nhất định. Git LFS tự động tạo hoặc cập nhật .gitattributescác tệp để liên kết các mẫu tệp được theo dõi vào bộ lọc Git LFS. Tuy nhiên, bạn sẽ cần phải thực hiện bất kỳ thay đổi nào đối với .gitattributestệp vào kho lưu trữ của mình:

$ git lfs track "*.ogg"
Tracking *.ogg
$ git add .gitattributes
$ git diff --cached
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..b6dd0bb
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+*.ogg filter=lfs diff=lfs merge=lfs -text
$ git commit -m "Track ogg files with Git LFS"

Để dễ bảo trì, đơn giản nhất là giữ tất cả các mẫu Git LFS trong một .gitattributestệp bằng cách luôn chạy git lfs tracktừ thư mục gốc của kho lưu trữ của bạn. Tuy nhiên, bạn có thể hiển thị danh sách tất cả các mẫu hiện đang được Git LFS theo dõi (và các .gitattributestệp chúng được xác định) bằng cách gọi git lfs trackmà không có đối số:

$ git lfs track
Listing tracked paths
*.stl (.gitattributes)
*.png (Assets/Sprites/.gitattributes)
*.ogg (Assets/Audio/.gitattributes)

Bạn có thể dừng theo dõi một mẫu cụ thể bằng Git LFS bằng cách xóa dòng thích hợp khỏi .gitattributestệp của bạn hoặc bằng cách chạy git lfs untracklệnh:

$ git lfs untrack "*.ogg"
Untracking *.ogg
$ git diff
diff --git a/.gitattributes b/.gitattributes
index b6dd0bb..e69de29 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +0,0 @@
-*.ogg filter=lfs diff=lfs merge=lfs -text

Sau khi chạy, git lfs untrackbạn sẽ lại phải thực hiện các thay đổi cho .gitattributeschính mình.

Cam kết và thúc đẩy

Bạn có thể cam kết và đẩy như bình thường vào một kho chứa nội dung Git LFS. Nếu bạn đã cam kết thay đổi các tệp được theo dõi bởi Git LFS, bạn sẽ thấy một số đầu ra bổ sung từ git pushkhi nội dung Git LFS được chuyển đến máy chủ:

$ git push
Git LFS: (3 of 3 files) 4.68 MB / 4.68 MB
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done.
Total 8 (delta 1), reused 0 (delta 0)
To git@bitbucket.org:tpettersen/atlasteroids.git
7039f0a..b3684d3 master -> master

Nếu việc chuyển các tệp LFS không thành công vì một số lý do, việc đẩy sẽ bị hủy bỏ và bạn có thể thử lại một cách an toàn. Giống như Git, bộ lưu trữ Git LFS có thể truy cập nội dung : nội dung được lưu trữ dựa trên khóa là hàm băm SHA-256 của chính nội dung đó. Điều này có nghĩa là luôn an toàn khi thử lại việc chuyển các tệp Git LFS sang máy chủ; bạn không thể vô tình ghi đè lên nội dung của tệp Git LFS với phiên bản sai.

Di chuyển kho lưu trữ Git LFS giữa các máy chủ

Để di chuyển kho lưu trữ Git LFS từ nhà cung cấp dịch vụ lưu trữ này sang nhà cung cấp dịch vụ lưu trữ khác, bạn có thể sử dụng kết hợp git lfs fetchvà git lfs pushvới --all optionchỉ định.

Ví dụ: để di chuyển tất cả kho lưu trữ Git và Git LFS từ một điều khiển từ xa có tên githubsang một điều khiển từ xa có tên bitbucket?:

# create a bare clone of the GitHub repository
$ git clone --bare git@github.com:kannonboy/atlasteroids.git
$ cd atlasteroids
# set up named remotes for Bitbucket and GitHub
$ git remote add bitbucket git@bitbucket.org:tpettersen/atlasteroids.git
$ git remote add github git@github.com:kannonboy/atlasteroids.git
# fetch all Git LFS content from GitHub
$ git lfs fetch --all github
# push all Git and Git LFS content to Bitbucket
$ git push --mirror bitbucket
$ git lfs push --all bitbucket

Tìm nạp thêm lịch sử Git LFS

Git LFS thường chỉ tải xuống các tệp cần thiết cho các cam kết mà bạn thực sự kiểm tra cục bộ. Tuy nhiên, bạn có thể buộc Git LFS tải xuống nội dung bổ sung cho các chi nhánh được sửa đổi gần đây bằng cách sử dụng git lfs fetch --recent:

$ git lfs fetch --recent
Fetching master
Git LFS: (0 of 0 files, 14 skipped) 0 B / 0 B, 2.83 MB skipped Fetching recent branches within 7 days
Fetching origin/power-ups
Git LFS: (8 of 8 files, 4 skipped) 408.42 KB / 408.42 KB, 2.81 MB skipped
Fetching origin/more-music
Git LFS: (1 of 1 files, 14 skipped) 1.68 MB / 1.68 MB, 2.83 MB skipped

Điều này hữu ích cho việc tải xuống hàng loạt nội dung Git LFS mới trong khi bạn ra ngoài ăn trưa hoặc nếu bạn dự định xem xét công việc từ đồng đội của mình và sẽ không thể tải xuống nội dung sau này do kết nối internet bị hạn chế. Ví dụ, bạn có thể muốn chạy git lfs fetch --recenttrước khi nhảy lên máy bay!

Git LFS xem xét bất kỳ chi nhánh hoặc thẻ có chứa một cam kết mới hơn bảy ngày như gần đây. Bạn có thể định cấu hình số ngày được coi là gần đây bằng cách đặt thuộc lfs.fetchrecentrefsdaystính:

# download Git LFS content for branches or tags updated in the last 10 days
$ git config lfs.fetchrecentrefsdays 10

Theo mặc định, git lfs fetch --recentsẽ chỉ tải xuống nội dung Git LFS cho cam kết ở đầu chi nhánh hoặc thẻ gần đây.

git lfs - git lfs tìm nạp --recent

Tuy nhiên, bạn có thể định cấu hình Git LFS để tải xuống nội dung cho các cam kết trước đó trên các nhánh và thẻ gần đây bằng cách định cấu hình thuộc lfs.fetchrecentcommitsdaystính:

# download the latest 3 days of Git LFS content for each recent branch or tag
$ git config lfs.fetchrecentcommitsdays 3

Sử dụng cài đặt này một cách cẩn thận: nếu bạn có các nhánh di chuyển nhanh, điều này có thể dẫn đến một lượng lớn dữ liệu được tải xuống. Tuy nhiên, nó có thể hữu ích nếu bạn cần xem lại các thay đổi xen kẽ trên một nhánh, cam kết hái anh đào trên các nhánh hoặc viết lại lịch sử.

git lfs - git lfs tìm nạp - cam kết đáng giá

Như đã thảo luận trong Di chuyển kho lưu trữ Git LFS giữa các máy chủ , bạn cũng có thể chọn tìm nạp tất cả nội dung Git LFS cho kho lưu trữ của mình bằng git lfs fetch --all:

$ git lfs fetch --all
Scanning for all objects ever referenced...
✔ 23 objects found
Fetching objects...
Git LFS: (9 of 9 files, 14 skipped) 2.06 MB / 2.08 MB, 2.83 MB skipped

Xóa các tệp Git LFS cục bộ

Bạn có thể xóa các tệp khỏi bộ đệm Git LFS cục bộ của mình bằng git lfs prunelệnh:

$ git lfs prune
✔ 4 local objects, 33 retained
Pruning 4 files, (2.1 MB)
✔ Deleted 4 files

Điều này sẽ xóa bất kỳ tệp Git LFS cục bộ nào được coi là cũ . Một tập tin cũ là bất kỳ tập tin nào không được tham chiếu bởi:

  • cam kết hiện đang kiểm tra
  • một cam kết chưa được đẩy (về nguồn gốc hoặc bất cứ điều gì lfs.pruneremotetocheckđược đặt thành)
  • một cam kết gần đây

Theo mặc định, một cam kết gần đây là bất kỳ cam kết nào được tạo trong mười ngày qua. Điều này được tính bằng cách thêm:

  • giá trị của lfs.fetchrecentrefsdaystài sản được thảo luận trong Tìm nạp thêm lịch sử Git LFS (mặc định là bảy ); đến
  • giá trị của lfs.pruneoffsetdaystài sản (mặc định là ba )
git lfs cắt tỉa

Bạn có thể định cấu hình bù trừ để giữ lại nội dung Git LFS trong thời gian dài hơn:

# don't prune commits younger than four weeks (7 + 21)
$ git config lfs.pruneoffsetdays 21

Không giống như bộ sưu tập rác tích hợp của Git, nội dung Git LFS không được cắt tỉa tự động, do đó, chạy git lfs prunethường xuyên là một ý tưởng tốt để giảm kích thước kho lưu trữ cục bộ của bạn.

Bạn có thể kiểm tra xem tác động của việc cắt tỉa sẽ có tác dụng gì với git lfs prune --dry-run:

$ git lfs prune --dry-run
✔ 4 local objects, 33 retained
4 files would be pruned (2.1 MB)

Và chính xác những đối tượng Git LFS sẽ được cắt tỉa với git lfs prune --verbose --dry-run:

$ git lfs prune --dry-run --verbose
✔ 4 local objects, 33 retained
4 files would be pruned (2.1 MB)
* 4a3a36141cdcbe2a17f7bcf1a161d3394cf435ac386d1bff70bd4dad6cd96c48 (2.0 MB)
* 67ad640e562b99219111ed8941cb56a275ef8d43e67a3dac0027b4acd5de4a3e (6.3 KB)
* 6f506528dbf04a97e84d90cc45840f4a8100389f570b67ac206ba802c5cb798f (1.7 MB)
* a1d7f7cdd6dba7307b2bac2bcfa0973244688361a48d2cebe3f3bc30babcf1ab (615.7 KB)

Đầu ra chuỗi thập lục phân dài theo --verbosechế độ là băm SHA-256 (còn được gọi là ID đối tượng hoặc OID) của các đối tượng Git LFS sẽ được cắt tỉa. Bạn có thể sử dụng các kỹ thuật được mô tả trong Tìm đường dẫn hoặc cam kết tham chiếu đối tượng Git LFS để tìm hiểu thêm về các đối tượng sẽ được cắt tỉa.

Là một kiểm tra an toàn bổ sung, bạn có thể sử dụng --verify-remotetùy chọn để kiểm tra xem cửa hàng Git LFS từ xa có bản sao của các đối tượng Git LFS của bạn hay không trước khi chúng được cắt tỉa:

$ git lfs prune --verify-remote
✔ 16 local objects, 2 retained, 12 verified with remote
Pruning 14 files, (1.7 MB)
✔ Deleted 14 files

Điều này làm cho quá trình cắt tỉa chậm hơn đáng kể, nhưng giúp bạn yên tâm khi biết rằng bất kỳ đối tượng được cắt tỉa nào đều có thể phục hồi từ máy chủ. Bạn có thể bật --verify-remotetùy chọn vĩnh viễn cho hệ thống của mình bằng cách định cấu hình thuộc lfs.pruneverifyremotealwaystính trên toàn cầu:

$ git config --global lfs.pruneverifyremotealways true

Hoặc bạn có thể kích hoạt xác minh từ xa cho kho lưu trữ ngữ cảnh bằng cách bỏ qua --globaltùy chọn từ lệnh trên.

Xóa các tệp Git LFS từ xa khỏi máy chủ

Máy khách dòng lệnh Git LFS không hỗ trợ cắt xén các tệp từ máy chủ, vì vậy cách bạn xóa chúng tùy thuộc vào nhà cung cấp dịch vụ lưu trữ của bạn.

Trong Bitbucket Cloud, bạn có thể xem và xóa các tệp Git LFS thông qua Cài đặt kho lưu trữ> Git LFS :

Bitbucket Cloud - xóa lfs khỏi máy chủ

Lưu ý rằng mỗi tệp Git LFS được lập chỉ mục bởi OID SHA-256 của nó; các đường dẫn tham chiếu mỗi tệp không hiển thị qua UI. Điều này là do có thể có nhiều đường dẫn khác nhau ở nhiều cam kết khác nhau có thể đề cập đến một đối tượng nhất định, vì vậy việc tìm kiếm chúng sẽ là một quá trình rất chậm.

Để xác định tệp Git LFS đã cho thực sự chứa gì, bạn có ba tùy chọn:

  • nhìn vào hình ảnh xem trước tệp và loại tệp trong cột bên trái của Bitbucket Git LFS UI
  • tải xuống tệp bằng cách sử dụng liên kết ở cột bên phải của Bitbucket Git LFS UI -search để xác nhận tham chiếu SHA-256 OID của đối tượng Git LFS, như được thảo luận trong phần tiếp theo

Tìm đường dẫn hoặc xác nhận tham chiếu đối tượng Git LFS

Nếu bạn có GID LFS SHA-256 OID, bạn có thể xác định cam kết nào tham chiếu với git log --all -p -S <OID>:

$ git log --all -p -S 3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc
commit 22a98faa153d08804a63a74a729d8846e6525cb0
Author: Tim Pettersen <tpettersen@atlassian.com>
Date: Wed Jul 27 11:03:27 2016 +1000
Projectiles and exploding asteroids
diff --git a/Assets/Sprites/projectiles-spritesheet.png
new file mode 100755
index 0000000..49d7baf
--- /dev/null
+++ b/Assets/Sprites/projectiles-spritesheet.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc
+size 21647

Câu git logthần chú này tạo ra một bản vá ( -p) từ các xác nhận trên bất kỳ nhánh nào ( --all) thêm hoặc xóa một dòng ( -S) có chứa chuỗi được chỉ định (một Git LFS SHA-256 OID).

Bản vá cho bạn thấy cam kết và đường dẫn đến đối tượng LFS, cũng như ai đã thêm nó và khi nào nó được cam kết. Bạn chỉ có thể kiểm tra cam kết và Git LFS sẽ tải xuống tệp nếu cần và đặt nó vào bản sao làm việc của bạn.

Nếu bạn nghi ngờ rằng một đối tượng Git LFS cụ thể nằm trong CHÍNH hiện tại của bạn hoặc trên một nhánh cụ thể, bạn có thể sử dụng git grepđể tìm đường dẫn tệp tham chiếu đến nó:

# find a particular object by OID in HEAD
$ git grep 3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc HEAD
HEAD:Assets/Sprites/projectiles-spritesheet.png:oid sha256:3b6124b8b01d601fa20b47f5be14e1be3ea7759838c1aac8f36df4859164e4cc
# find a particular object by OID on the "power-ups" branch
$ git grep e88868213a5dc8533fc9031f558f2c0dc34d6936f380ff4ed12c2685040098d4 power-ups
power-ups:Assets/Sprites/shield2.png:oid sha256:e88868213a5dc8533fc9031f558f2c0dc34d6936f380ff4ed12c2685040098d4

Bạn có thể thay thế HEADhoặc power-upsbằng bất kỳ ref, commit hoặc cây nào chứa đối tượng Git LFS.

Bao gồm / không bao gồm các tệp Git LFS

Trong một số trường hợp, bạn có thể chỉ muốn tải xuống một tập hợp con của nội dung Git LFS có sẵn cho một cam kết cụ thể. Ví dụ: khi định cấu hình bản dựng CI để chạy thử nghiệm đơn vị, bạn có thể chỉ cần mã nguồn của mình, vì vậy có thể muốn loại trừ các tệp nặng không cần thiết để xây dựng mã của bạn.

Bạn có thể loại trừ một mẫu hoặc thư mục con bằng cách sử dụng git lfs fetch -X(hoặc --exclude):

$ git lfs fetch -X "Assets/**"

Ngoài ra, bạn có thể chỉ muốn bao gồm một mẫu hoặc thư mục con cụ thể. Ví dụ: một kỹ sư âm thanh có thể tìm nạp chỉ oggvà wavcác tệp có git lfs fetch -I(hoặc --include):

$ git lfs fetch -I "*.ogg,*.wav"

Nếu bạn kết hợp bao gồm và loại trừ, chỉ các tệp khớp với mẫu bao gồm và không khớp với mẫu loại trừ sẽ được tìm nạp. Ví dụ: bạn có thể tìm nạp mọi thứ trong thư mục Tài sản của mình ngoại trừ gifs với:

$ git lfs fetch -I "Assets/**" -X "*.gif"

Không bao gồm và bao gồm hỗ trợ các mẫu tương tự như git lfs trackvà .gitignore. Bạn có thể đặt các mẫu này vĩnh viễn cho một kho lưu trữ cụ thể bằng cách đặt thuộc tính lfs.fetchincludevà lfs.fetchexcludecấu hình:

$ git config lfs.fetchinclude "Assets/**"
$ git config lfs.fetchexclude "*.gif"

Các cài đặt này cũng có thể được áp dụng cho mọi kho lưu trữ trên hệ thống của bạn bằng cách nối thêm --globaltùy chọn.

Khóa các tệp Git LFS

Thật không may, thường không có cách nào giải quyết xung đột hợp nhất nhị phân. Cách truyền thống để tránh xung đột hợp nhất trong các hệ thống kiểm soát phiên bản là khóa các tệp. Git LFS chưa hỗ trợ khóa tập tin. Tuy nhiên, có một đề xuất chi tiết để thực hiện khóa tệp và một số công việc triển khai đã bắt đầu, vì vậy chúng tôi hy vọng sẽ sớm thấy nó trong bản phát hành Git LFS.

Cho đến lúc đó, cách tốt nhất để tránh xung đột hợp nhất là liên lạc với các thành viên trong nhóm trước khi thực hiện thay đổi đối với tệp nhị phân mà họ có khả năng sẽ sửa đổi cùng lúc với bạn.

Cách thức hoạt động của Git LFS

Nếu bạn muốn tìm hiểu thêm về các bộ lọc sạch và nhòe, móc đẩy trước và khoa học máy tính thú vị khác đằng sau Git LFS, hãy xem bài trình bày này từ Atlassian trên Git LFS tại LinuxCon 2016:

Đăng ký nhận thông báo về những video mới nhất
« Prev: Git: Refs và Reflog
» Next: Git: Git gc
Copied !!!