Я работал над репозиторием в моей учетной записи GitHub, и я столкнулся с этой проблемой.
- Проект Node.js с папкой с несколькими установленными пакетами npm
- Пакеты были в
node_modules
папке - Добавил эту папку в репозиторий git и отправил код в github (в то время не думал о части npm)
- Понял, что вам не нужно, чтобы эта папка была частью кода
- Удалил эту папку, нажал на нее
В тот момент размер общего репозитория git составлял около 6 МБ, тогда как фактический код (все, кроме этой папки) составлял всего около 300 КБ .
Теперь, в конце концов, я ищу способ избавиться от деталей папки этого пакета из истории git, поэтому, если кто-то клонирует его, ему не нужно загружать историю в 6 Мб, где будут получены только реальные файлы. по состоянию на последний коммит будет 300KB.
Я искал возможные решения для этого и попробовал эти 2 метода
- Удалить файл из репозитория git (история)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
Казалось, что Gist сработал, когда после запуска скрипта он показал, что избавился от этой папки, и после этого показал, что было изменено 50 различных коммитов. Но это не позволило мне нажать этот код. Когда я попытался выдвинуть его, он сказал, Branch up to date
но показал, что 50 коммитов были изменены на a git status
. Другие 2 метода тоже не помогли.
Теперь, несмотря на то, что он показал, что он избавился от истории этой папки, когда я проверил размер этого репо на моем локальном хосте, он все еще был около 6 МБ. (Я также удалил refs/original
папку, но не увидел изменения в размере репо).
Я хочу уточнить, есть ли способ избавиться не только от истории коммитов (что, как мне кажется, единственное, что произошло), но и от тех файлов, которые git продолжает предполагать, что кто-то хочет откатиться.
Допустим, решение для этого представлено и применяется на моем локальном хосте, но не может быть воспроизведено для этого репозитория GitHub, возможно ли клонировать это репо, выполнить откат к первому коммиту и выполнить его (или это означает, что git будет еще есть история всех этих коммитов? - ака. 6MB).
Моя конечная цель - найти лучший способ избавиться от содержимого папки с помощью git, чтобы пользователю не приходилось загружать 6 МБ материала и, возможно, иметь другие коммиты, которые никогда не касались папки модулей (это довольно много всего) в истории Git.
Как я могу это сделать?
источник
Ответы:
Если вы здесь, чтобы скопировать и вставить код:
Это пример, который удаляет
node_modules
из историиЧто на самом деле делает Git:
Первая строка перебирает все ссылки в том же дереве (
--tree-filter
), что и HEAD (ваша текущая ветвь), выполняя командуrm -rf node_modules
. Эта команда удаляет node_modules папки (-r
без-r
,rm
не будет удалять папки), без подсказки пользователю предоставляется (-f
). Добавленное--prune-empty
удаляет бесполезные (не меняющие ничего) коммиты рекурсивно.Вторая строка удаляет ссылку на эту старую ветку.
Остальные команды относительно просты.
источник
git count-objects -v
проверял, действительно ли файлы были удалены, но размер хранилища не изменился, пока я снова не клонировал хранилище. Git хранит копию всех оригинальных файлов, я думаю.--force-with-lease
, а не--force
.Я считаю, что
--tree-filter
опция, используемая в других ответах, может быть очень медленной, особенно в больших репозиториях с большим количеством коммитов.Вот метод, который я использую, чтобы полностью удалить каталог из истории git, используя
--index-filter
опцию, которая работает намного быстрее:Вы можете проверить размер хранилища до и после
gc
:источник
--quiet
кgit rm
вышесказанному ускорил мое переписывание, по крайней мере, в 4 раза.В дополнение к популярному ответу выше, я хотел бы добавить несколько заметок для Windows- систем. Команда
работает отлично без каких-либо изменений! Таким образом, вы не должны использовать
Remove-Item
,del
или что-нибудь еще вместоrm -rf
.Если вам нужно указать путь к файлу или каталогу, используйте косую черту, например
./path/to/node_modules
источник
Лучший и самый точный метод, который я нашел, это загрузить файл bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
Затем запустите команды:
Если вы хотите удалить файлы, используйте вместо этого опцию delete-files:
источник
Похоже, что современный ответ на этот вопрос заключается в том, чтобы не использовать
filter-branch
напрямую (по крайней мере, сам git не рекомендует его больше) и перенести эту работу на внешний инструмент. В частности, в настоящее время рекомендуется git-filter-repo . Автор этого инструмента приводит аргументы о том, почему использованиеfilter-branch
напрямую может привести к проблемам.Большинство вышеперечисленных многострочных сценариев для удаления
dir
из истории можно переписать так:Инструмент более мощный, чем просто, по-видимому. Вы можете применять фильтры по автору, электронной почте, имени и т. Д. ( Полная страница руководства здесь ). Кроме того, это быстро . Установка проста - она распространяется в различных форматах .
источник
pip3 install git-filter-repo
потому, что он предназначен только для stdlib и не устанавливает никаких зависимостей. На Ubuntu 18 он несовместим с git-версией дистрибутиваError: need a version of git whose diff-tree command has the --combined-all-paths option
, но достаточно просто запустить его наdocker run -ti ubuntu:20.04
Завершите рецепт копирования и вставки, просто добавив команды в комментарии (для решения копирования и вставки) после их тестирования:
После этого вы можете удалить строку "node_modules /" из .gitignore
источник
node_modules
из.gitignore
? Чтобы они могли быть случайно совершены снова ??node_modules
из.gitignore
.Для пользователя Windows, пожалуйста, обратите внимание на использование
"
вместо «'
Также добавлено»-f
для принудительного выполнения команды, если другая резервная копия уже существует.источник
Я удалил папки bin и obj из старых проектов C #, используя git на windows. Будь осторожен с
Это разрушает целостность установки git, удаляя папку usr / bin в папке git install.
источник