Как удалить локальную историю мерзавцев после коммита?
Я хотел бы перейти с Dropbox на Sparkleshare с открытым исходным кодом. Он использует Git для синхронизации и управления версиями. Если, скажем, у меня в папке был файл размером 1 ГБ, он остается в истории локальной папки.git. Но я хотел бы иметь такие тяжелые данные на сервере, а не на клиенте. Как я могу зафиксировать свой репозиторий и удалить локальный с помощью git? Большое спасибо!
3 ответа
Решение удаления истории
git fetch --depth=1
обрезать старые коммиты. Это делает старые коммиты и их объекты недоступными.git reflog expire --expire-unreachable=now --all
, Срок действия всех старых коммитов и их объектовgit gc --aggressive --prune=all
убрать старые предметы
Конкретное решение просто удалить большой файл в локальной истории
- GitHub предлагает Git Large File Storage, который хранит большие файлы всегда на сервере и извлекает их только при оформлении заказа. Очень прост в настройке и использовании - в случае, если ваш репозиторий находится на GitHub, bitbucket или gitlab.
- git-annex - позволяет хранить большие файлы где угодно
Обсуждение: Чем отличаются Git LFS и git-annex?
Основываясь на ответе koppor, я создал эту однострочную команду bash, чтобы очистить локальную историю git из всех репозиториев, находящихся в одной базовой папке:
for d in */; do echo $d && cd "$d" && git fetch --depth=1 && git reflog expire --expire-unreachable=now --all && git gc --aggressive --prune=all; cd ..; done
Примечание: вы можете заменить
*/
по любым конкретным критериям папки, если хотите, например
*mobile*/
.
Версия cmd для Windows (непроверенная):
FOR /D %d IN (*) DO (echo $d && cd "$d" && git fetch --depth=1 && git reflog expire --expire-unreachable=now --all && git gc --aggressive --prune=all & cd ..)
Это сэкономило мне несколько гигабайт!
Добавьте приведенные ниже команды в файл cmd или sh, и они помогут очистить историю. git fetch --length=1, чтобы удалить старые коммиты. Это делает старые коммиты и их объекты недоступными.git reflog expire --expire-unreachable=now --all. Чтобы истечь сроком действия всех старых коммитов и их объектов, git gc --aggressive --prune=all, чтобы удалить старые объекты