Возможно, вам действительно нужна команда filter-branch
, а не rebase
. В любом случае есть несколько пунктов, чтобы быть в курсе:
- Вы не можете изменить любых существующих коммитов, когда-либо.
- Таким образом, как rebase, так и filter-branch нет. Вместо этого они копия коммиты. Теперь у вас в два раза больше коммитов! Чего ждать?!
- Но Git может и в конце концов удалит то, что он называет unreferted объектов (фиксирует и их соответствующие файлы), и вы можете ускорить это различными способами, если это необходимо.
Таким образом, это как rebase, так и filter-branch: они копируют коммиты, а перед выполнением копии допускают некоторые изменения. Затем, совершив (немного отличающиеся) копии, они переместили ссылки - имена ветвей и тегов - на копии.
Имея это в виду, есть еще несколько пунктов, чтобы рассмотреть следующие вопросы:
- только фильтр-ветви копирует и перемещает теги, и это только делает это, если вы предоставляете
--tag-filter
. (Если у вас нет тегов, это, разумеется, не имеет значения.) И, когда копии фильтров подписывают аннотированные теги, они выгружают свои подписи: они становятся беззнаковыми. В противном случае вам придется приказать вам вручную переписать их все, а фильтр-ветвь будет полностью автоматизирована.
- Поскольку ветвь фильтра спроектирована так, чтобы быть автоматизированной, и поскольку она предназначена для работы при каждом фиксации в репозитории, она (a) имеет тенденцию быть медленной и (b) имеет множество сложных вариантов, предназначенных для ускорьте это. Если у вас не так много коммитов, это не такая уж большая сделка. Если вы это сделаете, то окупится, чтобы изучить, как использовать множество вариантов, чтобы ускорить его.
- Поскольку обе команды копируют коммиты, если у кого-то еще есть копия репозитория, вы также создаете для них кучу работы: им нужно переключиться на копии. Если они этого не сделают, они могут повторно ввести все первоначальные коммиты, а затем вы вернетесь к тому, чтобы иметь в два раза больше.
Теперь вы готовы к the linked question и ответу ответчика на фильтр. См. Также this other answer на соответствующий вопрос, однако, за инструкциями по использованию --tag-name-filter
и некоторыми вариантами ускорения.
Обратите внимание, что git rm -f --cached --ignore-unmatch
работает с именами каталогов (или «папками»), а также с именами простых файлов.--tree-filter
(упомянутый в других ответах на странице со ссылками) можно использовать вместо --index-filter
, и это более удобно для сложных операций, но это много медленнее (точное замедление зависит от ОС, размера репо, SSD против хранения прядения и т. д., но «примерно на 100x медленнее» является хорошей стартовой оценкой), чем с использованием --index-filter
.
У вас есть googled в первую очередь? и читайте такие вещи, как http://stackoverflow.com/questions/307828/completely-remove-file-from-all-git-repository-commit-history – DavidN
Да, и эта ссылка по-прежнему вынуждает меня вручную удалять все файлы, потому что когда я запускаю git rebase, он просматривает все коммиты и говорит мне: Ошибка: Следующие файлы без следа дерева дерева будут перезаписаны слиянием: Пожалуйста, переместите или удалите их, прежде чем сможете слить. Aborting Ошибка: не удалось слить изменения. Патч не выполнен в 0001 Начальный результат Копия патча, который не найден, найден в: .git/rebase-apply/patch –
@TommySaechao: Да, добавьте все каталог и файлы в '.gitignore'. После этого очистите его «cache». – Shravan40