Xóa lịch sử Git phần 2

Dữ liệu nhạy cảm hoặc sử dụng quá nhiều bộ nhớ: Có nhiều lý do chính đáng để bạn muốn thay đổi lịch sử Git. Trong bài đăng trên blog này , tôi đã giải thích cách xóa các tệp khỏi lịch sử Git bằng cách sử dụng BFG . Một điểm yếu của BFG là thiếu hỗ trợ cho các đường dẫn trực tiếp , vì vậy bạn không thể xóa cụ thể các tệp hoặc thư mục trong thư mục con khỏi lịch sử. Cùng với đó, đã đến lúc xem xét các giải pháp thay thế.


Ngoài nhánh bộ lọc git chính thức không được khuyến nghị , git-filter-repo là một trong những công cụ để dọn dẹp lịch sử. Sau khi cài đặt ngắn, trước tiên chúng tôi phân tích kho lưu trữ và tìm, ví dụ: các thư mục lớn nhất trong lịch sử:

git filter-repo --analyze

Cũng được trong thư mục .git/filter-repo/analysis đã tạo tất cả các loại tệp TXT:

  • directories-all-sizes.txt
  • extensions-all-sizes.txt
  • path-all-sizes.txt
  • ...

Nó đáng giá directories-all-sizes.txt nhìn kỹ hơn:

=== All directories by reverse size ===

Format: unpacked size, packed size, date deleted, directory name

  4624417043 3796607988 <present> <toplevel>
  4475940396 3778033787 <present> wp-content
  4060236681 3694449320 <present> wp-content/uploads
   305163809   70576241 <present> wp-content/plugins
   123818107   15442735 <present> wp-includes
...

Thường xảy ra rằng bạn đã bỏ qua và xóa dữ liệu HEAD trong lịch sử từ lâu (ví dụ: thư mục phương tiện WordPress wp-content/uploads/ hoặc một cái vô tình bị đẩy node_modules- hoặc vendor-Chất kết dính).

Quan trọng là, các nền tảng lưu trữ mã chính GitHubGitLab đề xuất các cách tiếp cận khác nhau, một số cách tiếp cận khác nhau. Ví dụ: trên GitHub, chúng tôi xóa wp-content/uploads/ sử dụng các bước sau git-filter-repo từ lịch sử:

mkdir tmp-repo
cd tmp-repo
git clone git@github.com:foo/bar.git .
cp .git/config /tmp/config-backup
git filter-repo --invert-paths --path wp-content/uploads
mv /tmp/config-backup .git/config
git push origin --force --all
git push origin --force --tags
# check size locally
git gc && git count-objects -vH
cd ..
rm -rf tmp-repo

Giờ đây, chúng tôi cũng có thể kiểm tra kích thước từ xa (việc thay đổi kích thước qua API và trong giao diện người dùng có thể mất đến 24 giờ). Để thực hiện việc này, hãy mở cài đặt kho lưu trữ (nếu kho lưu trữ thuộc về một tổ chức, trước tiên bạn phải thêm tài khoản của mình vào tổ chức). Bây giờ chúng ta thấy kích thước:

GitHub: dung lượng ổ đĩa trước khi dọn dẹp
GitHub: dung lượng ổ đĩa sau khi dọn dẹp

Quy trình hơi khác trên GitLab:

mkdir tmp-repo
cd tmp-repo
# Settings > General > Advanced > Export project > download tar.gz file into tmp-repo
tar xzf 20*.tar.gz
git clone --bare --mirror project.bundle
cd project.git
git filter-repo --invert-paths --path wp-content/uploads/
cp ./filter-repo/commit-map /tmp/commit-map-1
# copying the commit-map has to be done after every single command from git filter-repo
# you need the commit-map files later
git remote remove origin
git remote add origin git@gitlab.com:foo/bar.git
# Settings > Repository > Protected branches/Protected branches >
# enable "Allowed to force push to main/master"
git push origin --force 'refs/heads/*'
git push origin --force 'refs/tags/*'
git push origin --force 'refs/replace/*'
# Settings > Repository > Protected branches/Protected branches >
# disable "Allowed to force push on main/master"
cd ./../../
rm -rf tmp-repo
date
# wait 30 minutes (😱)
date
# Settings > Repository > upload /tmp/commit-map-X

Sau khoảng thời gian chờ ~ 5 phút nữa, chúng tôi có thể bắt đầu Settings > Usage Quotas xem không gian lưu trữ:

GitLab: dung lượng ổ đĩa trước khi dọn dẹp
GitLab: dung lượng ổ đĩa sau khi dọn dẹp

Sau khi xóa, điều quan trọng là tất cả các nhà phát triển có liên quan phải tham gia vào các bước cuối cùng: Nếu người dùng hiện thực hiện đẩy bình thường với bản sao cục bộ của chính họ, điều này sẽ dẫn đến việc các tệp lớn di chuyển trở lại kho lưu trữ trung tâm. Do đó, 3 lựa chọn sau đây được khuyến nghị:

  • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp && git add -A .
    ("bản sao mới của người nghèo", sao chép lại vào kho lưu trữ hiện có)
  • rm -rf repo && git clone xxx .
    ("bắt đầu lại từ đầu", biến thể sạch sẽ nhất)
  • git pull -r
    ("pull with rebase", bạn vẫn có lịch sử bị xóa nhưng không còn vô tình ghi đè)

Trong quá trình hạn ngạch hiện tại (đặc biệt là do các hạn chế mới của GitLab ), bạn nên kiểm tra kích thước lịch sử các kho lưu trữ của mình và xóa chúng nếu cần:

GitHub miễn phíGitLab miễn phí
Giới hạn kích thước tệp tối đa100 MB
Giới hạn kích thước repo tối đa5.000 MB
Giới hạn số lần repo tối đa
Giới hạn kích thước tổng thể tối đa5.000 MB

Cuối cùng, cũng đáng để xem xét một biến thể miễn phí, tự lưu trữ như Gitea . Với một chút nỗ lực, bạn có thể lưu trữ phiên bản Git tự lưu trữ (GUI được bảo mật bằng SSL , bao gồm sao lưu , kiểm soát thông qua API mạnh mẽ ) trên một máy chủ rất gọn nhẹ , cũng có thể được cấu hình xuất sắc và cũng vượt trội hơn về mặt bảo vệ dữ liệu.

Trở lại