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).

Nói chung khuyến nghị git-filter-repo sau khi dọn dẹp, đẩy sang một kho mới trống. Có rất nhiều lý do được liệt kê ở đây, tại sao điều này có ý nghĩa và tránh được nhiều vấn đề. Tuy nhiên, có thể xảy ra trường hợp bạn muốn đẩy vào cùng một kho lưu trữ và điều đó cũng có thể xảy ra với một vài gợi ý.

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/
# option 1: same repo
  mv /tmp/config-backup .git/config
  git push origin --force --all
# option 2: new repo
  git remote add origin git@github.com:foo/bar-new.git
  git push origin --force --all
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
# option 1: same 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 to main/master"
  date
  # wait 30 minutes (😱)
  date
  # Settings > Repository > upload /tmp/commit-map-X
# option 2: new repo
  git clone git@gitlab.com:foo/bar.git .
  git filter-repo --invert-paths --path wp-content/uploads/
  git remote add origin git@gitlab.com:foo/bar-new.git
  # Settings > Repository > Protected branches/Protected branches >
  # enable "Allowed to force push to main/master"
  git push origin --force --all
  # Settings > Repository > Protected branches/Protected branches >
  # disable "Allowed to force push to main/master"
cd ..
rm -rf tmp-repo

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ị:

  • "bản sao mới của người nghèo"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Đối với các tệp đã thay đổi (tùy thuộc vào ứng dụng): git checkout -- . hoặc. git add -A . && git commit -m "Push obscure file changes." && git push
  • "bắt đầu từ đầu"
    • rm -rf repo && git clone xxx .
  • "kéo xấu xí với rebase"
    • git pull -r
    • Ở đây, bạn vẫn có lịch sử chưa được xóa, nhưng trong hầu hết các trường hợp, bạn không còn vô tình ghi đè kho lưu trữ từ xa bằng biến thể cục bộ lớn

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, bạn cũng nên xem một biến thể tự lưu trữ, miễn phí như Gitea ném. Với một chút nỗ lực, bạn có thể máy chủ rất mỏng một phiên bản Git tự lưu trữ (GUI cho mỗi SSL bảo đảm, Sao lưu bao gồm, kiểm soát API mạnh mẽ) máy chủ, cũng rất xuất sắc cấu hình và cũng vượt trội hơn về khả năng bảo vệ dữ liệu. Ở đây, bạn cũng có thể sử dụng git-filter-repo Đơn giản chỉ cần sắp xếp các kho lưu trữ:

mkdir tmp-repo
cd tmp-repo
git clone git@git.tld.com:foo/bar.git .
cp .git/config /tmp/config-backup
git filter-repo --invert-paths --path wp-content/uploads/
# option 1: same repo
  mv /tmp/config-backup .git/config
  git push origin --mirror
  # login on the remote command line and run in the repo-folder
  sudo -u git git reflog expire --expire=now --all
  sudo -u git git gc --aggressive --prune=now
  # if you face memory limit issues, modify the git configuration
  sudo -u git git config --global pack.windowMemory "100m"
  sudo -u git git config --global pack.packSizeLimit "100m"
  sudo -u git git config --global pack.threads "1"
  # if in web ui the size does not change, make a slight
  # modification to a file and push again normally
# option 2: new repo
  git remote add origin git@git.tld.com:foo/bar-new.git
  git push origin --force --all
cd ..
rm -rf tmp-repo

Đây cụ thể là lệnh sudo -u git git gc --aggressive --prune=now quan trọng (cron đang chạy git gc nếu không thì có một cái quá dài thời gian cắt tỉa trong 2 tuần).

Trở lại