Nadiifi taariikhda Git qaybta 2

Xog xasaasi ah ama isticmaalka xusuusta oo aad u badan: Waxaa jira sababo wanaagsan oo lagu doonayo in la beddelo taariikhda Git. Boostada blog-ga , waxaan ku sharaxay sida loo nadiifiyo faylasha taariikhda Git iyadoo la adeegsanayo BFG . Meesha daciifka ah ee BFG waa taageero la'aanta waddooyinka tooska ah , markaa si gaar ah kama saari kartid faylasha ama faylalka ku jira fayl-hoosaadyada taariikhda. Taas, waa waqtigii la eegi lahaa xalal kale.


Marka lagu daro laanta miiraha git ee aan si rasmi ah loogu talin , git-filter-repo waa mid ka mid ah qalabka lagu nadiifiyo taariikhda. Ka dib markii la rakibo gaaban, waxaan marka hore falanqeyneynaa kaydka oo aan helnaa, tusaale ahaan, galka ugu weyn taariikhda:

git filter-repo --analyze

Waa hagaag gal gal .git/filter-repo/analysis soo saaray dhammaan noocyada faylalka TXT:

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

Way mudan tahay faylka directories-all-sizes.txt si dhow u fiirso:

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

Badanaa waxay dhacdaa in aad muddo dheer iska indho-tirtay oo aad ka saartay xogta HEAD ee taariikhda (tusaale, galka warbaahinta WordPress wp-content/uploads/ ama mid si lama filaan ah loo riixay node_modules- ama vendor-Binder).

Guud ahaan waxay ku talinaysaa git-filter-repo nadiifinta ka dib, riixaya meel cusub oo madhan. Waxaa jira sababo badan oo halkan ku qoran, sababta ay tani macno samaynayso ugana ilaalinayso dhibaatooyin badan. Si kastaba ha ahaatee, way dhici kartaa inaad rabto inaad ku riixdo bakhaar isku mid ah taasina waxay sidoo kale suurtogal u tahay dhowr tilmaamood.

Muhiimad ahaan, meelaha ugu weyn ee martigelinta koodka GitHub iyo GitLab ku talin habab kala duwan, kuwaas oo qaarkood ka duwan midba midka kale. Tusaale ahaan, GitHub waxaan ka saareynaa wp-content/uploads/ iyadoo la adeegsanayo tillaabooyinka soo socda git-filter-repo laga bilaabo taariikhda:

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

Waxaan hadda sidoo kale ka hubin karnaa cabbirka meel fog (beddelka cabbirka API iyo gudaha UI waxay qaadan kartaa ilaa 24 saacadood). Si tan loo sameeyo, fur goobaha kaydka (haddii kaydka uu leeyahay urur, waa inaad marka hore ku dartaa akoonkaaga ururka). Hadda waxaan aragnaa cabbirka:

GitHub: meel bannaan oo disk ah ka hor nadiifinta
GitHub: meel bannaan oo disk ah ka dib nadiifinta

Nidaamku wax yar ayuu kaga duwan yahay 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

Sugitaan kale oo ~ 5 daqiiqo ah ka dib waan hoos geli karnaa Settings > Usage Quotas fiiri booska kaydinta:

GitLab: meel bannaan oo disk ah ka hor nadiifinta
GitLab: meel bannaan oo disk ah ka dib nadiifinta

Ka saarista ka dib, waxaa muhiim ah in dhammaan horumariyayaasha ku lugta leh ay ku lug yeeshaan tallaabooyinka ugu dambeeya: Haddii isticmaaluhu hadda sameeyo riixitaan caadi ah oo wata nuqulkooda maxalliga ah, tani waxay keeni doontaa in faylasha waaweyni ay dib ugu noqdaan kaydka dhexe. Sidaa darteed, 3 doorasho ee soo socda ayaa lagu talinayaa:

  • "nin miskiin ah oo cusub"
    • rm -rf .git && git clone xxx temp && mv temp/.git ./.git && rm -rf temp
    • Wixii faylasha la beddelay (waxay kuxirantahay codsiga): git checkout -- . ama. git add -A . && git commit -m "Push obscure file changes." && git push
  • "meel eber ka soo bilow"
    • rm -rf repo && git clone xxx .
  • "jiid fool xun oo dib u dhis ah"
    • git pull -r
    • Halkan waxa aad weli ku haysaa taariikhda aan nadiifka ahayn, laakiin inta badan kiisaska si lama filaan ah uguma qori kartid kaydka fog ee kala duwanaanshiyaha maxalliga ah

Inta lagu jiro kootada hadda jirta (gaar ahaan iyadoo ay ugu wacan tahay xannibaadaha cusub ee GitLab ), had iyo jeer waxaa habboon in la hubiyo cabbirka taariikhda bakhaarkaaga oo aad nadiifiso haddii loo baahdo:

GitHub BilaashGitLab bilaash ah
Xadka cabbirka ugu badan ee faylka100MB
Xadka cabbirka ugu badan ee repo5,000MB
Xadka ugu badan ee tirinta repo
Xadka cabbirka guud ee ugu badan5,000MB

Ugu dambayntii, waxa kale oo mudan in la eego is-martigeliyay, kala duwanaanshiyaha xorta ah sida Gitea tuurid. Dadaal yar oo aad samayn karto a server aad caato ah tusaale Git iskiis u martigeliyay (GUI per SSL la hubsaday, Gurmad ka mid ah, xakamaynta API awood leh) martigeliyaha, kuwaas oo sidoo kale aad u fiican habayn sidoo kale wuu ka sarreeyaa xagga ilaalinta xogta. Halkan, habka, waxaad sidoo kale isticmaali kartaa git-filter-repo Si fudud u hagaaji meelaha kaydka ah:

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

Halkan si gaar ah waa amarka sudo -u git git gc --aggressive --prune=now muhiim ah (kor u kaca git gc haddii kale mid aad u dheer buu leeyahay waqti goyn 2 toddobaad).

Dib u laabo