Как полностью удалить коммит из 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, поэтому я не могу гарантировать, что данные будут уничтожены, если вы сделаете это, поэтому вы должны заменить все пароли, как уже предлагалось.

Другие вопросы по тегам