Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Транзакции в git'е

#git #bat


Есть батник, который выполняет некоторый набор действий. В том числе есть коммиты
в разные ветки и создание тега. Скрипт НЕ делает push.

Хотелось бы, чтобы в случае ошибки на одном из шагов все коммиты и теги созданные
скриптом автоматически откатывались. Как такое можно сделать?
    


Ответы

Ответ 1



если изменения ограничиваются коммитами в существующие ветки и созданием меток, то можно сохранить резервную копию каталога refs, находящегося внутри хранилища (обычно — каталога .git). что-нибудь вроде: $ tar -cf /путь/к/архиву .git/refs в нём и сохраняются все указатели (и коммиты, на которые они указывают) — и ветки (branches) и метки (tags). если же вносимые изменения затрагивают что-то более глобальное (переименование/создание/удаление веток или удалённых хранилищ, изменения в конфигурации хранилища и т.п.), то стоит сохранять и файл config: $ tar -cf /путь/к/архиву .git/refs .git/config для «отката» достаточно удалить этот каталог и восстановить из резервной копии. что-нибудь вроде: $ rm -r .git/refs; tar -xf /путь/к/архиву а рабочую копию можно привести к нужному состоянию, как и обычно, командой checkout: $ git checkout коммит-или-ветка-или-метка при желании от накопившегося «мусора» локальное хранилище можно «почистить» командой gc: $ git gc

Ответ 2



Правильный, качественный способ - сделать локальный clone. Лишнего копирования при этом не должно быть When the repository to clone from is on a local machine, this flag bypasses the normal "Git aware" transport mechanism and clones the repository by making a copy of HEAD and everything under objects and refs directories. The files under .git/objects/ directory are hardlinked to save space when possible. то есть, если git сможет - он сделает hardlink на .git/objects/ - что обеспечит быстрое копирование. Если после всех изменений нужно сделать откат - просто удаляем папку с склонированной репой. Если все ок, просто делаем git push и снова удаляем склонированную репу. Да, push нужно будет делать аккуратно и как минимум добавить --tags. Но можно применить трюк с переименованием. То есть, папку с репой удаляем, а свежосклонированную переименновываем.

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

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