Hub documentation
Удаление конфиденциальных данных из репозитория
Удаление конфиденциальных данных из репозитория
Эта страница относится только к репозиториям на базе git (модели, наборы данных и Spaces).
Если вы случайно закоммитили секрет, конфиденциальные данные или любой файл, который не должен находиться на Hub, то удаления файла в новом коммите недостаточно: старые коммиты по-прежнему содержат его, а URL вида /resolve/<old_sha>/<path>, /blob/<old_sha>/<path> или /commit/<old_sha> продолжают отдавать этот файл. Чтобы полностью удалить файл, его нужно убрать из всех ссылок (refs), которые могут на него указывать: веток, тегов и pull request'ов.
Если файл содержит секрет (токен, API-ключ, пароль), сначала отзовите или обновите его и считайте скомпрометированным: копии, закэшированные CDN или скачанные пользователями, могут сохраниться после удаления файла. Для токенов Hugging Face см. Отзыв скомпрометированного токена.
Обзор
| Действие | Удаляет | Листья |
|---|---|---|
| Удалите файл в новом коммите | Файл из последней ревизии | Все предыдущие коммиты, поэтому этого недостаточно |
| Список больших файлов → удалить с помощью «переписывания истории» | Содержимое файла (немедленно), а также его указатель из всех веток, тегов и ссылок на PR | Старые коммиты с путём к файлу, sha256 и размером, до очистки |
git filter-repo + force-push | Файл из каждой ветки и тега, которые вы отправляете | Ссылки, которые вы не отправляете, история, зафиксированная pull request'ами |
super_squash_history | История одной ветки | Другие ветки, теги, история, закреплённые pull request'ами |
| Удалить pull request | Ссылка на PR, история релизов сохранена только в ней | Эта история, до очистки |
Переписывание истории (любой вариант, кроме нового коммита) необратимо и изменяет SHA-хэши коммитов. Коллеги, использующие git, должны пересоздать клон или сбросить свои ветки на переписанные, и не должны отправлять свою старую историю обратно, так как это приведёт к повторному появлению файла.
Рекомендуемый порядок
- Отозвите или замените любой скомпрометированный секрет.
- Удалите файлы LFS и Xet с помощью «rewrite history».
- Удалите обычные файлы git из каждой ветки и тега.
- Для обычных файлов git удалите pull requests, созданные после коммита файла.
- Уберите дублирующиеся репозитории, которыми вы владеете.
- При необходимости свяжитесь с нами.
Файлы LFS и Xet
Если файл отображается в разделе «Список больших файлов» вашего репозитория (включая файлы, поддерживаемые Xet):
- Перейдите на страницу настроек вашего репозитория.
- Нажмите «List Large Files» в разделе «Storage».
- Удалите файл, оставив отмеченным пункт «rewrite history» (по умолчанию).
Удаление большого файла с помощью «переписывания истории» немедленно удаляет его содержимое и убирает указатель на него из всех веток, тегов и ссылок PR. Это изменяет SHA первого коммита, содержащего файл, и всех его потомков, а также удаляет коммиты, ставшие пустыми (например, тот, который только добавлял файл). В старых коммитах по-прежнему отображаются путь, sha256 и размер файла до их очистки. Подробнее см. в разделе Ограничения хранилища.
Если путь или имя файла сами по себе являются конфиденциальными, они остаются в этих старых коммитах до их очистки. «Переписывание истории» удаляет их вместе с ними.
Обычные файлы git
Вариант 1: переписать историю с помощью git filter-repo и выполнить force-push для каждой ветки и тега, содержащих файл. Force-push разрешён пользователям с правами на запись.
git clone https://huggingface.co/<namespace>/<repo> # use /datasets/ or /spaces/ for those repo types
cd <repo>
git filter-repo --invert-paths --path path/to/file
git remote add origin https://huggingface.co/<namespace>/<repo> # filter-repo removes the remote
git push --force --all origin
git push --force --tags originВариант 2: удалить файл и сжать историю с помощью super_squash_history. Каждый вызов сжимает одну ветку в один коммит, поэтому повторите это для каждой затронутой ветки и удалите ненужные ветки и теги.
from huggingface_hub import HfApi
api = HfApi()
api.delete_file("path/to/file", repo_id="<namespace>/<repo>")
api.super_squash_history(repo_id="<namespace>/<repo>", branch="main")
api.delete_tag(repo_id="<namespace>/<repo>", tag="v1.0")Pull requests
Это касается только обычных файлов git: удаление большого файла с переписыванием истории уже переписывает pull request'ы.
Любой pull request, созданный после коммита файла, сохраняет доступность этой истории по SHA, даже если вы переписали или сожмали main, и даже если PR был объединён или закрыт. Удаление pull request освобождает эту историю, после чего она удаляется.
Дублирующиеся репозитории
Дублированные репозитории независимы, поэтому очищайте те, которыми вы владеете, тем же способом. Дубликаты моделей и наборов данных содержат только файлы ветки main на момент дублирования (в виде одного коммита), тогда как дубликаты Spaces сохраняют полную историю ветки main. Другие ветки и теги не копируются.
Когда старые коммиты исчезают
Старые коммиты остаются доступными по их SHA (в веб-интерфейсе, через API и с помощью git fetch <sha>) до момента их очистки, которая обычно происходит примерно в течение часа после force-push, super_squash_history, удаления с «переписыванием истории» или удаления pull request, который их удерживал.
Когда обращаться к нам
- Вам нужны URL старых коммитов, которые гарантированно возвращают 404
- Необходимо сбросить кэшированные загрузки
- Необходимо сбросить производные копии, например, конвертации в Parquet в Data Studio (
refs/convert/*) или сборки Space