Как удалить локальную историю мерзавцев после коммита?

Я хотел бы перейти с Dropbox на Sparkleshare с открытым исходным кодом. Он использует Git для синхронизации и управления версиями. Если, скажем, у меня в папке был файл размером 1 ГБ, он остается в истории локальной папки.git. Но я хотел бы иметь такие тяжелые данные на сервере, а не на клиенте. Как я могу зафиксировать свой репозиторий и удалить локальный с помощью git? Большое спасибо!

3 ответа

Решение удаления истории

  1. git fetch --depth=1 обрезать старые коммиты. Это делает старые коммиты и их объекты недоступными.
  2. git reflog expire --expire-unreachable=now --all, Срок действия всех старых коммитов и их объектов
  3. 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, чтобы удалить старые объекты

Другие вопросы по тегам