Как полностью удалить коммит из gitlab?
Я сделал коммит в своем git-репо и нажал на него, но случайно он содержал некоторые пароли для наших производственных машин. Поэтому я удалил коммит:
git reset --hard HEAD~1
git push --force
Это действительно удалило коммит из списка коммитов, но URL коммита на gitlab по-прежнему показывает источник коммита.
Я не уверен, что это git, который по-прежнему сохраняет содержимое коммита на серверах gitlab, или базы данных gitlab, которые каким-то образом хранят содержимое коммита, но мне действительно нужно полностью удалить этот коммит с серверов gitlab.
Кто-нибудь знает способ полностью удалить коммит и его содержимое из gitlab?
3 ответа
Как вы, возможно, заметили, даже если вы перепишете свою историю git и принудительно отправите изменения в репозиторий, удаленные коммиты все равно будут присутствовать в нескольких местах в GitLab. Вы заметите, например, что запросы на слияние, которые ссылаются на удаленные коммиты, по-прежнему показывают содержимое ссылок в MR. GitLab удерживает ссылки и их содержимое в нескольких местах, которые нельзя напрямую передать (защищенные ссылки, не рекламируемые сервером git), включая
refs/merge-requests/*
,
refs/pipelines/*
,
refs/environments/*
а также
refs/keep-around/*
.
Чтобы удалить такие ссылки, вам необходимо выполнить процедуру очистки файлов из истории репозитория , чтобы полностью удалить содержимое этих ссылок из GitLab. Этот процесс предназначен для уменьшения размера репозитория, но работает и в вашем случае.
Как упоминалось в комментариях, подходящее действие, которое следует предпринять, когда секрет был случайно зафиксирован, — это ротация секрета. Удаление его из вашей истории не обязательно остановит кого-то, у кого уже есть секрет, от его использования.
Вы можете использовать--no-edit
в этом случае Шаги:
- Изменить пароль в файле/удалить этот файл
- Бегать
git add <changed_file>
- Бегать
git commit --amend --no-edit
[Это может изменить/добавить/удалить содержимое последней фиксации без дополнительной фиксации] - Бегать
git push --force-with-lease <remote> <branch_name>
[более безопасный способ принудительного толчка] ИЛИgit push -f <remote> <branch_name>
- Теперь пароль, который вы изменили, или файл, который вы удалили, не будут отображаться в gitlab.
Надеюсь, это поможет в будущем.
Вероятно, вам следует начать с просмотра веб-интерфейса для вашего репозитория GitLab. Если ветка есть, вы можете удалить ее, запустив
git push <remote> :<branch>
Это заменит <branch>
с тем, что находится перед двоеточием, т. е. ничего, на указанном пульте. Если вы не можете проверить, находится ли филиал на удаленном компьютере с помощью веб-интерфейса, вы сможете получить все ветви или, по крайней мере, перечислить их, используя некоторые git fetch
как команда, не уверен, как.
Если ветка отсутствует в списке на удаленном компьютере, у вас просто есть локальная копия того, что было на удаленном компьютере, и вы сможете удалить эту копию, например, с помощью
git branch -D <remote>/<branch>
Я не могу говорить о внутренностях GitLab, поэтому я не могу гарантировать, что данные будут уничтожены, если вы сделаете это, поэтому вы должны заменить все пароли, как уже предлагалось.