---
name: github-repo-admin
description: "Как работать с репозиториями на GitHub: три расходящихся источника списка участников (contributors), сброс кеша главной страницы, проверка результата живой страницей, авторство коммитов и привязка почты"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: f929ef0c-f337-404b-9496-0e60d40b4c3c
  modified: 2026-08-08T04:25:54.520Z
---

Правила выведены на [[cehoproxy_two_repos]] 08.08.2026, когда после чистки истории Claude продолжал висеть в участниках репозитория. Дополняет [[no_ai_coauthor_in_commits]] (там сама подпись и её вычистка) — здесь про сторону GitHub.

**Why:** git-история и то, что GitHub рисует на странице, — разные вещи. Чистый `git log` НЕ доказывает, что владелец видит чистую страницу; отчитываться «готово» по локальному репозиторию — значит отчитаться о непроверенном.

**How to apply.**

**Данные об участниках лежат минимум в трёх местах, и они расходятся.** Проверять надо все:
- боковая панель About на главной странице репозитория — самый живучий кеш, обновляется отдельной фоновой задачей;
- Insights → Contributors — считается по истории, чистится первым;
- `gh api repos/O/R/contributors?anon=1` и `gh api "repos/O/R/commits?author=X"` — API, чистится первым.

Если API и Insights чистые, а панель нет — это устаревший индекс на стороне GitHub, из git к нему не дотянуться. **Не помогает:** ожидание, обычный пуш, пустой коммит (проверено живьём — только мусор в истории). **Помогает** переименование ветки по умолчанию туда и обратно, эффект через ~5 минут:

```
gh api repos/O/R/branches/main/rename -X POST -f new_name=main-tmp
gh api repos/O/R/branches/main-tmp/rename -X POST -f new_name=main
```

Безопасно при нуле открытых PR: теги, релизы и ссылки на скачивание не затрагиваются, локальный клон не требует действий, GitHub оставляет редирект. Сразу после второго переименования `gh api repos/O/R --jq .default_branch` может отдать старое имя — это тоже кеш, перепроверить через полминуты.

**Проверять только живой страницей в браузере.** `curl` главной страницы бесполезен: список участников догружается скриптом, а слово «Claude» в HTML встречается в служебных флагах GitHub и даёт ложное совпадение. Правильно — открыть страницу браузерным инструментом и спросить DOM: `!!document.querySelector('a[href="/claude"]')` плюс текст блока Contributors.

**После любого переписывания истории проверять теги отдельно.** `git tag -l --format='%(refname:short) %(objectname:short)'` — тег остаётся на старом коммите и вернёт грязь при первом же `push --tags`. Перевешивать после сверки деревьев: `git rev-parse <old>^{tree}` и `<new>^{tree}` должны совпасть — тогда содержимое релиза не меняется. Затем `git reflog expire --expire=now --all && git gc --prune=now`, иначе старые коммиты остаются достижимыми локально.

**Force-push — только с явным SHA:** `git push --force-with-lease=refs/heads/main:<ожидаемый sha> origin main`. Голый `--force-with-lease` после `filter-branch` отказывает со «stale info», а голый `--force` не заметит чужого коммита.

**Коммиты с локальной почтой машины** (`cebers@MacBook-Air-CeBers.local`) GitHub не привязывает ни к какому аккаунту — они висят как отдельный безымянный участник и не попадают в статистику. Лечится без переписывания истории: добавить этот адрес в Settings → Emails, привязка происходит задним числом. У CehoProxy так висят 7 коммитов из 19 — владельцу сказано, решение за ним.

**Аккаунт:** `gh` авторизован владельцем как `cebers227-cmd`, организация `CodoCeh`; в репозиториях личность коммитов `CodoCeh <cebers227@gmail.com>`. Токен у владельца, я его не запрашиваю.
