вы можете сделать резервную копию рефлога git? Рекомендации по наилучшей практике защиты от потери кода


git reflog показывает всю активность, даже раздавленные коммиты и т. д. (поправьте меня, если я ошибаюсь).

Есть команда CLI Git для резервного копирования в Git reflog?

Очевидно, что если я удаляю локальную версию РЕПО, я потерял свой рефлог (поправьте меня, если я ошибаюсь).

Я задался вопросом, Могу ли я git push это для безопасности или что-то в этом роде?

Если нет, то какой подход я должен принять, чтобы предотвратить потерю рефлога?

Update: в ответ на Иржи Кремсера, если я сделаю резервную копию .git/logs, Могу ли я git reset --hard зафиксировать в рефлоге после того, как я восстановил его?

4 2

4 ответа:

git reflog показывает всю активность (даже раздавленные коммиты и т. д.). (поправьте меня, если я ошибаюсь)

Как вы выяснили, git reflog хранит почти все действия в git.
Почти все означает, что он на самом деле не хранит все действия его магазин все действия, которые изменили ваш HEAD локально.

Главное это то, что хранятся только локальные данные, так что резервировать и восстанавливать их будет бесполезно оно.

Why cant i backup reflog?

Поскольку reflog-это только хранилище релевантной информации вашего локального репозитория, он не будет работать, если вы восстановите его в другом РЕПО.

Для примера рассмотрим такой (очень простой) локальный поток:

# checkout master branch
git checkout master

# do some changes and commit 
- At this point there will be a new entry in the reflog

# now you decide to discard your changes
git reset HEAD~1 --hard
- At this point a new entry is added to your reflog
- The commit which you made is a dangling commit which can be 
  recovered on your local machine but does not exist on any other
  repository beside yours.

Это очень простой поток, но, как вы можете понять из этого потока, даже если вы можете создать резервную копию рефлога (а вы можете просто создать резервную копию .git/logs), это будет бесполезно.

Есть много других случаев, подобных этому, которые сделают ваш reflog бесполезно.

Это причина, почему его локально для вашей машины, а не для любой другой машины.

Предположим, что теперь у вас есть моя резервная копия рефлога, она бесполезна для вас, если я выполнил rebase, filter-branch и т.д.

Введите описание изображения здесь

Да и нет. Для него нет команды, но вы можете сделать резервную копию .git/logs, где хранится рефлог.

Однако там хранятся только ссылки на коммиты, так что это похоже на создание резервной копии символьных ссылок (или ярлыков в Windows). Это может сработать, в зависимости от того, что вы хотите сделать.

В общем, это не очень хорошая идея, чтобы сделать рефлог публичным, потому что он предназначался только для локального РЕПО.

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

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

Поскольку reflog - это только указатели на коммиты, а не фактические данные коммитов, как только ваши коммиты достаточно стары и git запускает git gc (работает молча под прикрытием большинства вещей), фактические коммиты все равно исчезают. Вместо резервного копирования рефлога вы можете просто засорить свой код метками ветвей. Они не только сохранят историю, но и сохранят фактические коммиты. Как только вы будете удовлетворены своим сквошем / ребазом / другими разрушительными вещами, удалите эти старые ветви, и Git gc будет счастливо собирать старые данные снова.