git-rebase удаляет файлы, но следы остаются в git-rev-list - PullRequest
3 голосов
/ 09 марта 2019

Я пытаюсь удалить (огромные) файлы из истории хранилища.

Я использовал git-rebase, чтобы удалить коммиты с файлами, которые я хочу удалить, и он не жаловался,но запуск git push origin master завершается неудачно (см. ниже) с ошибками именно в файлах, которые я пытаюсь удалить.Это самые большие файлы в репо (используя этот скрипт ):

bash-3.2$ ./gitlistobjectbysize.sh | head -n 5
100644 blob 4f77d4c09bc74ade25fbc9e02c499776db50c923 8268002855 appointments-six-weeks.csv
100644 blob de9e2ab4a1e38bb229a82537cf7d5bc1dd1c740c 4047367885 appointments-three-weeks.csv
100644 blob c68619098142ce84c9140ccaef70a68b7636c935 1043590349 appointments-one-week.csv
100644 blob 0cd9c4d3e574583bd3ccc3948d221a16b97030a7 291783067  appointments-24-hours.csv
100644 blob 1703ddcee60fb5f14c15bfe8113ef0ecc5750424 187968216  appointments-one-week-two-centers.csv

Чтобы найти, какие коммиты изменяют первый файл (например), я приготовил следующее (любительское)скрипт:

for commitSHA1 in $(git rev-list --all); do
    echo "commit: $commitSHA1"
    git ls-tree -r --long "$commitSHA1" | grep 4f77d4c09bc74ade25fbc9e02c499776db50c923
done

Вот соответствующая часть:

bash-3.2$ ./dirtyblobfollower.sh 
commit: 3a5c9334615da329700d43f9db7f0eb13f7e2594
commit: f65363e5eea21f9a9c3f877edc66c1a350e2d0dd
commit: b5107588f32469f9fd4be8da52ea4c71370f4341
commit: 657527d79daada62b853ce6bf894da3a1ae3de2f
commit: 2100bbe9cb5a981936b4b5edeba9bffe97eb30be
commit: 11282459cf7e8d778d41b7b8324f571d266323e0
commit: 1c6be79eb630fb4c676621d8f6afc03f63a4e8cd
commit: e716da1a40bc72affd069d74efffa18904750ccf
commit: fd08313462478e56a60ebf475ed8230d9f898f8f
commit: 6a9e4f68c7b23a5513b912d5452c02c57c0a683d
commit: edbd096c5329c63a32c902f2553e3cffe3ad3f29
commit: a02f52dad35b63e5c0ab9b6a0eee6025b745b9c8
commit: d03842d37701a559e842effdade2f80367440b75
commit: 5c3ba451a0fa46bceb62036bbe0e5b43bfb26648
commit: 525f31365acdeacf2f8cacf75144df605e7763ae
100644 blob 4f77d4c09bc74ade25fbc9e02c499776db50c923 8268002855 appointments-six-weeks.csv
commit: 07117aae31062097941f32e7e8f4ef609a9c9108
100644 blob 4f77d4c09bc74ade25fbc9e02c499776db50c923 8268002855 appointments-six-weeks.csv
commit: da184af64d103277621193bf1c09a6f10708ce16
...

Но в настоящее время последние два коммита репо:

bash-3.2$ git log --oneline -2
3a5c933 (HEAD) [Commit message]
da184af (origin/master) [Commit message]

, которые являются первымии последний коммит в предыдущем списке.

Другими словами, огромные файлы все еще там (где-то), потому что удаленные коммиты все еще там (где-то), и они вызывают проблемы при передаче на удаленный компьютер.

Почему удаленные коммиты все еще отображаются в git-rev-list?Я попытался этот совет :

git reflog expire --expire=now --all
git gc --aggressive --prune=now

, чтобы заставить немного мусора, но ничего не изменилось.

Что бы произошло, если бы я вручную удалил git-объекты (т.е. файлы в .git/objects)?Это не похоже на решение, но мне любопытно.

Вот неудача толчка:

bash-3.2$ git push origin master
Enumerating objects: 49, done.
Counting objects: 100% (49/49), done.
Delta compression using up to 12 threads
Compressing objects: 100% (23/23), done.
Writing objects: 100% (47/47), 700.38 MiB | 691.00 KiB/s, done.
Total 47 (delta 21), reused 46 (delta 20)
remote: Resolving deltas: 100% (21/21), completed with 1 local object.        
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.        
remote: error: Trace: e5232721406ab3670bfc771048b4dcd6        
remote: error: See http://git.io/iEPt8g for more information.        
remote: error: File appointments-24-hours.csv is 278.27 MB; this exceeds GitHub's file size limit of 100.00 MB        
remote: error: File appointments-one-week.csv is 995.25 MB; this exceeds GitHub's file size limit of 100.00 MB        
remote: error: File appointments-six-weeks.csv is 7884.98 MB; this exceeds GitHub's file size limit of 100.00 MB        
remote: error: File appointments-three-weeks.csv is 3859.87 MB; this exceeds GitHub's file size limit of 100.00 MB        
remote: error: File appointments-one-week-two-centers.csv is 179.26 MB; this exceeds GitHub's file size limit of 100.00 MB        
To github.com:myaccountname/mygitrepo.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'git@github.com:myaccountname/mygitrepo.git'
...