понедельник, 24 марта 2014 г.

Purging history

Иногда бывает, что бред попадает в историю, было бы не плохо удалять его не последующими комитами, а просто убрать неподобство из интории.
Но тут нужно быть очень аккуратным, с большой властью приходит большая отвественность.

Вот приведены примеры когда нам не стоит переписывать историю:
1) Не нужно нудить иногда, ничего страшного нет в том, что бред попал - его удалили, и это помеченно в истории, иногда лучше сэкономить время и реализовать дополнительную фичу чем колупать историю.
2) Каждый должен следить за своей историей и делать там правки на основании код ревью и прочего и это показывает реальный обьем проделанных работ, потом может быть не понятно почему так долго что-то делалось, если почистить историю.

А вот примеры когда нужно подчистить историю:
1) Залитые файлы нарушают чьи-то копирайты - храня это в истории, мы храним и частный код в виде конкретного комита.
2) Были случайно залиты тяжелые файлы - это забивает наш репозиторий.



И так первое что мы должны сделать, когда начинаем работать с историей репозитория - это сделать бекап репозитория!

$ git clone petshop petshop-filter
Cloning into 'petshop-filter'...
done.

$ cd petshop-filter


$ git filter-branch --tree-filter <command> ...
command - any shell command
Git проверит каждый коммит в рабочей директории, выполнит эту комманду и перекомитит.

Вот примеры.
Удалить все файлы с паролями которые случайно попали в какие-то комиты
$ git filter-branch --tree-filter 'rm -f passwords.txt'

Найти все большие видео файлы и удалить их
$ git filter-branch --tree-filter 'find . -name "*.mp4" -exec rm {} \;'


Поехали детарилизировать
$ git filter-branch --tree-filter 'rm -f passwords.txt' -- --all
Эта команда проходит по всем бранчам и удаляет все passwords.txt из каждого коммита.
Первые минусы означают все бранчи.
Вторые+all означает все коммиты.
-f ключ означает, что даже если нет такого файла, то не кидать фейл, что не завалит нашу итерацию по бранчам и коммитам.

Нужно понимать, что история может быть очень "широка и глубока", поэтому поторебуется очень много времени, чтобы ее всю обойти. Для этого нужно рассмотреть более быстрый инструмент:
$ git filter-branch --index-filter <command> ...

Этот вид фильтра работает со стейджинг пространством, как я понимаю это проходит только по тем комитам, в которые добавились новые файлы -- наверно..., а вообще стейджинг пространство называется не зря индексным. Специфика состоит в том, что сдесь мы работаем какбуд-то со стейджинг пространством, поэтому наши команды должны быть соответвующими.

Это мы пишем так:
$ git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt'
--ignore-unmatch - для того чтобы не валился проход когда нет файла, это как -f в предыдущем варианте.

Повторно применить фильтр GIT нам не дает, потому что при первой фильтрации гит создал бекап, а тепеперь чтобы его перетереть мы должны явно это указать
$ git filter-branch -f --tree-filter 'rm -f passwords.txt'

Мы можем почистить нашу историю от пустых комитов:
$ git filter-branch -f --prune-empty -- --all

Когда мы что-то от чего-то чистим, то в результате этого мы получим на выходе пустые коммиты, именно поэтому прун можно сразу включить, чтобы он подчищал за нашим фильтрированием:
$ git filter-branch --tree-filter 'rm -f passwords.txt' --prune-empty -- --all

Комментариев нет:

Отправить комментарий