Intereting Posts

Как удалить все вхождения файла в индекс, из всех git-коммитов

Первый раз, используя git здесь. Я случайно использовал «git init» без файла .gitignore, поэтому у меня есть куча gradle / и build / files в моих коммитах. Я использую «git ls-tree -r master», чтобы показать все файлы в индексе. Вместо того, чтобы проверять каждый предыдущий фиксатор и использовать «git rm –cached» для удаления всех ненужных файлов сборки и градиента, как удалить все его вхождения во все предыдущие коммиты?

Изменить: есть ли способ удалить каждый каталог и файлы во всех коммитах и ​​сохранить только каталог src?

Вероятно, вам действительно нужна команда filter-branch а не rebase . В любом случае вам нужно знать несколько элементов:

  • Вы не можете изменить какие-либо существующие коммиты, когда-либо .
  • Поэтому, как rebase, так и filter-branch нет. Вместо этого они копируют фиксации. Теперь у вас в два раза больше коммитов! Чего ждать?!
  • Но Git может и будет – в конечном итоге – удалить то, что он называет незарегистрированными объектами (коммит и их соответствующие файлы), и при необходимости вы можете ускорить это при необходимости.

Таким образом, это то, что делают как rebase, так и filter-branch: они копируют коммиты, и перед фиксацией копии разрешают некоторые изменения. Затем, совершив (немного отличающиеся) копии, они перемещают ссылки – имена ветвей и тегов – в копии.

Имея это в виду, есть еще несколько пунктов:

  • Только фильтр-ветвь копирует и перемещает теги, и только это делает, если вы предоставляете --tag-filter . (Если у вас нет тегов, это, разумеется, не имеет значения.) И, когда копии фильтров-ответвителей подписывают аннотированные теги, они выгружают свои подписи: они становятся беззнаковыми. В противном случае вам придется приказать вам вручную переписать их все, а фильтр-ветвь будет полностью автоматизирована.
  • Поскольку ветвь фильтрации предназначена для автоматизации и потому, что она предназначена для работы при каждом фиксации в репозитории, она (а) имеет тенденцию быть медленной и (б) имеет множество сложных вариантов, предназначенных для ускорения ее выполнения , Если у вас не так много коммитов, это не такая уж большая сделка. Если вы это сделаете, то окупится, чтобы изучить, как использовать множество вариантов, чтобы ускорить его.
  • Поскольку обе команды копируют коммиты, если у кого-то еще есть копия репозитория, вы делаете для них кучу работы: им нужно переключиться на копии. Если они этого не сделают, они могут повторно ввести все первоначальные коммиты, а затем вы вернетесь к тому, чтобы иметь в два раза больше.

Теперь вы готовы к связанному вопросу и ответу на его фильтр-ветку. См. Другой ответ на связанный с ним вопрос, хотя, для инструкций по использованию --tag-name-filter и некоторых параметров ускорения.

Обратите внимание, что git rm -f --cached --ignore-unmatch работает с git rm -f --cached --ignore-unmatch каталогов (или «folder»), а также с именами простых файлов. --tree-filter (упомянутый в других ответах на странице с второй --index-filter ) можно использовать вместо --index-filter , и он более удобен для сложных операций, но он намного медленнее (точное замедление зависит от ОС , размер репо, SSD и хранилище прядильных носителей и т. д., но «примерно на 100x медленнее» – хорошая стартовая оценка), чем использование --index-filter .