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 GitHub và GitLab đề 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:


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


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 đa | 100 MB | ∞ |
Giới hạn kích thước repo tối đa | 5.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 đa | ∞ | 5.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).