Մաքրել Git-ի պատմությունը մաս 2

Զգայուն տվյալներ կամ հիշողության չափազանց մեծ սպառում. Git պատմությունը փոխելու լավ պատճառներ կան: Այս բլոգային գրառման մեջ ես բացատրեցի, թե ինչպես կարելի է մաքրել ֆայլերը Git պատմությունից՝ օգտագործելով BFG : BFG-ի թույլ կետը ուղիղ ուղիների աջակցության բացակայությունն է, այնպես որ դուք չեք կարող պատմությունից հատուկ հեռացնել ֆայլերը կամ ենթաթղթապանակների թղթապանակները: Դրանով իսկ ժամանակն է այլընտրանքային լուծումներ փնտրելու։


Բացի պաշտոնապես չառաջարկվող git ֆիլտրի ճյուղից , git-filter-repo- ն պատմությունը մաքրելու գործիքներից մեկն է : Կարճ տեղադրումից հետո մենք նախ վերլուծում ենք պահեստը և գտնում, օրինակ, պատմության մեջ ամենամեծ թղթապանակները:

git filter-repo --analyze

Դե եղեք թղթապանակում .git/filter-repo/analysis ստեղծել է բոլոր տեսակի TXT ֆայլեր:

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

Արժե ֆայլը directories-all-sizes.txt ավելի ուշադիր նայեք:

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

Հաճախ է պատահում, որ դուք երկար ժամանակ անտեսել և հեռացնել եք պատմության HEAD տվյալները (օրինակ՝ WordPress մեդիա պանակը wp-content/uploads/ կամ պատահաբար հրված մեկը node_modules- կամ vendor- Ամրակ):

Ընդհանուր առմամբ խորհուրդ է տալիս git-filter-repo մաքրումից հետո՝ մղելով նոր, դատարկ պահեստ: Այստեղ թվարկված են բազմաթիվ պատճառներ, ինչու դա իմաստ ունի և խուսափում է բազմաթիվ խնդիրներից: Այնուամենայնիվ, կարող է պատահել, որ դուք ցանկանում եք մղել նույն պահոցը, և դա հնարավոր է նաև մի քանի հուշումներով:

Կարևոր է, կոդի հոստինգի հիմնական հարթակները GitHub և GitLab առաջարկել տարբեր մոտեցումներ, որոնցից մի քանիսը տարբերվում են միմյանցից: Օրինակ, GitHub-ում մենք հեռացնում ենք wp-content/uploads/ օգտագործելով հետևյալ քայլերը git-filter-repo պատմությունից:

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

Այժմ մենք կարող ենք նաև չափը ստուգել հեռակա կարգով (API-ի և UI-ի միջոցով չափը փոխելը կարող է տևել մինչև 24 ժամ): Դա անելու համար բացեք պահեստի կարգավորումները (եթե պահեստը պատկանում է կազմակերպությանը, նախ պետք է ձեր սեփական հաշիվը ավելացնեք կազմակերպությանը): Այժմ մենք տեսնում ենք չափը:

GitHub՝ սկավառակի տարածություն մաքրումից առաջ
GitHub՝ մաքրումից հետո սկավառակի տարածություն

Գործընթացը փոքր-ինչ տարբերվում է 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

Հերթական ~5 րոպե սպասելուց հետո մենք կարող ենք անցնել տակը Settings > Usage Quotas դիտել պահեստային տարածքը:

GitLab՝ սկավառակի տարածություն մաքրումից առաջ
GitLab՝ սկավառակի տարածություն մաքրումից հետո

Հեռացումից հետո կարևոր է, որ ներգրավված բոլոր ծրագրավորողները ներգրավված լինեն վերջին քայլերում. Եթե օգտատերն այժմ նորմալ մղում է կատարում իր սեփական տեղական պատճենով, դա կհանգեցնի նրան, որ մեծ ֆայլերը կվերադարձնեն կենտրոնական պահեստ: Ուստի առաջարկվում են հետևյալ 3 տարբերակները:

  • "խեղճ մարդու թարմ կլոնը"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Փոփոխված ֆայլերի համար (կախված հավելվածից): git checkout -- . կամ. git add -A . && git commit -m "Push obscure file changes." && git push
  • "սկսել զրոյից"
    • rm -rf repo && git clone xxx .
  • «տգեղ ձգում ռեբեյզով»
    • git pull -r
    • Այստեղ դուք դեռևս ունեք չմաքրված պատմություն, բայց շատ դեպքերում դուք այլևս պատահաբար չեք վերագրում հեռավոր պահեստը մեծ տեղական տարբերակով

Ընթացիկ քվոտաների ընթացքում (հատկապես GitLab-ի նոր սահմանափակումների պատճառով ) միշտ արժե ստուգել ձեր պահեստների պատմության չափը և անհրաժեշտության դեպքում մաքրել դրանք։:

GitHub անվճարGitLab անվճար
Ֆայլի առավելագույն չափի սահմանափակում100 ՄԲ
Առավելագույն ռեպո չափի սահմանափակում5000 ՄԲ
Առավելագույն ռեպո քանակի սահմանաչափ
Ընդհանուր չափի առավելագույն սահմանաչափ5000 ՄԲ

Վերջապես, արժե նաև դիտել ինքնուրույն, անվճար տարբերակ, ինչպիսին է Գիտեա նետել. Փոքր ջանքերով դուք կարող եք մի շատ բարակ սերվեր ինքնակառավարվող Git օրինակ (GUI ըստ SSL ապահովված, Կրկնօրինակում ներառված, վերահսկողություն հզոր API) հյուրընկալող, որոնք նույնպես գերազանց են կարգավորել և գերազանցում է նաև տվյալների պաշտպանության առումով: Այստեղ, ի դեպ, կարող եք նաև օգտագործել git-filter-repo Պարզապես շտկեք պահեստները:

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

Ահա, մասնավորապես, հրամանը sudo -u git git gc --aggressive --prune=now կարևոր (քրոնիկ վազում git gc հակառակ դեպքում ունի մեկը չափազանց երկար էտելու ժամանակը 2 շաբաթ):

Վերադառնալ