Перейти к содержанию

Claude Code: как убрать Co-Authored-By и ссылку на сессию

С версии 2.1.281 всё скрывает "attribution": false, для старых версий — объектная форма. В облачной сессии работает только закоммиченный .claude/settings.json.

•••10 мин чтения•Claude Code
Тёмная инфографика с заголовком «Ссылка на сеанс Claude Code и атрибуция Git: что именно отключать»: четыре слоя Author, Committer, Co-Authored-By и Claude-Session, пример вывода git show, команды поиска git log, два варианта JSON для attribution, лестница приоритета настроек с /status и блок о том, когда менять старую историю

Строки Co-Authored-By: Claude … и Claude-Session: https://claude.ai/code/session_… в коммитах, а также фраза «Generated with Claude Code» в описании pull request управляются одним ключом — attribution в settings.json Claude Code (справочник настроек). Выбор сводится к трём вариантам:

Что нужноЧто записать в settings.jsonГлавное условие
Убрать всё: трейлер, текст в PR и ссылку"attribution": falseClaude Code 2.1.281 или новее, иначе весь файл настроек будет пропущен
Убрать всё в файле, который могут прочитать и старые версииобъект attribution с "commit": "", "pr": "", "sessionUrl": falseподходит для общего .claude/settings.json в команде и для облачных сессий
Оставить отметку о Claude, убрать только ссылку на сессиюобъект attribution с "sessionUrl": falseссылку добавляют только облачные сессии и Remote Control

Не меньше значит, в какой файл это записано. В локальном терминале и в Remote Control хватает личного ~/.claude/settings.json. Облачная сессия на claude.ai/code этот файл не читает: там работает только .claude/settings.json, закоммиченный в сам репозиторий, и только когда в сессии один репозиторий (настройки в облачных сессиях). Проверять результат нужно тем же типом сессии, который добавлял строки.

Что Claude Code дописывает в коммиты и PR

Отметок три, и каждая управляется отдельно:

  • Трейлер коммита Co-Authored-By: <имя> <noreply@anthropic.com>. Имя — активная модель сессии, например Claude Sonnet 5. Если Claude Code узнаёт модель Claude, но не может определить её версию, пишется просто Claude; если модель вообще не из семейства Claude (скажем, сторонняя модель через собственный ANTHROPIC_BASE_URL) — Claude Code (attribution.commit).
  • Текст в описании PR: 🤖 Generated with [Claude Code](https://claude.com/claude-code ) (attribution.pr).
  • Ссылка на сессию: трейлер Claude-Session в коммите и ссылка в описании PR. Она появляется, только когда коммит или PR создаёт облачная сессия (claude.ai/code) либо сессия Remote Control (attribution.sessionUrl). Для обычного локального терминала документация такой ссылки не описывает. Сама ссылка в коммитах облачных сессий появилась в версии 2.1.9 в январе 2026 года, а отдельный выключатель sessionUrl — только в 2.1.183 от 19 июня 2026 года (changelog).

Точные формулировки по умолчанию менялись от релиза к релизу, поэтому сверяйтесь с тем, что стоит в ваших собственных коммитах.

Трейлер (trailer) — это строка вида Ключ: значение в последнем абзаце сообщения коммита, отделённом пустой строкой; Git и GitHub читают такие строки как структурированные данные (git interpret-trailers). Это не криптографическая подпись GPG или SSH и не поле автора. Автор (author) и коммитер (committer) хранятся в объекте коммита отдельно: attribution их не меняет, и удаление трейлера не трогает ни их, ни подпись. GitHub по трейлеру Co-authored-by показывает у коммита соавторов (документация GitHub).

Посмотреть оба слоя у последнего коммита можно так:

bash
git log -1 --format=%B | git interpret-trailers --parse
git show -s --format='author: %an <%ae>%ncommitter: %cn <%ce>' HEAD

Первая команда выводит только те трейлеры, которые Git действительно распознал; пустой вывод означает, что их нет. Вторая показывает поля автора и коммитера — именно они говорят Git, кто написал коммит.

Три рабочих варианта настройки attribution

Скрыть всё одной строкой (2.1.281 и новее)

json
{
  "attribution": false
}

Значение false появилось в версии 2.1.281 от 23 сентября 2026 года и скрывает всю атрибуцию в коммитах и PR. По состоянию на 25 сентября 2026 года последний релиз — 2.1.282; свою версию покажет claude --version, а что менялось в соседних релизах, собрано в материале Changelog Claude Code: что изменилось и как откатить версию.

Ловушка в том, что более старая версия не просто игнорирует false, а отвергает его и пропускает весь пользовательский, проектный или локальный файл, где оно записано (описание ключа). Вместе с ним перестают действовать разрешения, хуки и всё остальное из этого файла. В интерактивной сессии Claude Code покажет диалог Settings Error, а запуск с -p пропустит файл молча — после такого запуска выполните claude doctor, он перечислит отвергнутые записи (исправление сломанного файла настроек).

Объектная форма для общих файлов

json
{
  "attribution": {
    "commit": "",
    "pr": "",
    "sessionUrl": false
  }
}

Результат тот же, но документация советует именно эту форму для файлов, которые читают и более старые версии, — например, для закоммиченного .claude/settings.json в команде, где у всех разные версии Claude Code. По той же причине объектная форма надёжнее в файле, который будет читать облачная сессия: работоспособность настройки тогда не зависит от того, какая версия откроет файл.

Убрать только ссылку на сессию

json
{
  "attribution": {
    "sessionUrl": false
  }
}

Трейлер Co-Authored-By и текст в PR останутся, исчезнет только Claude-Session. Это разумный выбор, если команда хочет видеть, где участвовал ИИ, но не хочет, чтобы в истории репозитория лежали ссылки на разговоры. Ключ sessionUrl есть только с версии 2.1.183.

Своя отметка вместо стандартной

Пустая строка в commit или pr скрывает соответствующую часть, любая другая строка её заменяет, причём в commit можно передать и свои трейлеры. Пример из документации заменяет трейлер коммита, убирает текст в PR и ссылку:

json
{
  "attribution": {
    "commit": "Generated with AI\n\nCo-Authored-By: AI <ai@example.com>",
    "pr": "",
    "sessionUrl": false
  }
}

Если задать только commit или только pr, для второй части Claude Code оставит текст по умолчанию.

Почему includeCoAuthoredBy: false уже не решает задачу

Самый частый совет — "includeCoAuthoredBy": false — относится к ключу, который устарел с версии 2.0.62 (декабрь 2025 года) (includeCoAuthoredBy). Claude Code всё ещё его читает, и в старых файлах он скрывает трейлер и текст в PR. Но как только задан attribution.commit или attribution.pr, старый ключ игнорируется, а ссылкой на сессию он не управлял никогда. Поэтому с одним includeCoAuthoredBy: false строка Claude-Session в облачных коммитах остаётся.

Куда записать attribution: решает тип сессии

Где работает Claude CodeКакие файлы настроек читаютсяКуда писать attribution
Локальный терминал, расширение IDE, десктопmanaged, --settings, .claude/settings.local.json, .claude/settings.json, ~/.claude/settings.jsonдля себя во всех проектах — ~/.claude/settings.json; для себя в одном проекте — .claude/settings.local.json; для всей команды — .claude/settings.json в репозитории
Remote Control (управление локальной сессией из браузера или телефона)те же локальные файлы: сессия выполняется на вашей машине, а claude.ai/code и приложение — лишь окно в неётак же, как для терминала
Облачная сессия на claude.ai/code с одним репозиториемзакоммиченный .claude/settings.json и управляемые настройки организации с сервера (server-managed)закоммитить attribution в .claude/settings.json этого репозитория
Облачная сессия с несколькими репозиториямииз .claude/settings.json каждого репозитория — только enabledPlugins и extraKnownMarketplaces; server-managedуправляемые настройки организации с сервера; другого способа документация не описывает

Источники: файлы настроек и их область действия, настройки в облачных сессиях, Remote Control.

Отсюда самая частая причина «настройка не работает»: attribution записан в ~/.claude/settings.json на ноутбуке, а коммит делает облачная сессия, которая получает свежий клон репозитория и домашний каталог ноутбука не видит. Файл .claude/settings.local.json в облако тоже не попадает. Команда /config в браузере на claude.ai/code открывает настройки аккаунта, а не меняет значение ключа. Для облачной сессии с несколькими репозиториями без управляемых настроек организации документированного пути нет: остаётся работать с одним репозиторием в сессии либо чистить сообщения до отправки (см. ниже).

Если ключ задан в нескольких файлах, действует значение из самого старшего. Порядок от высшего приоритета к низшему: управляемые настройки организации (managed) → аргумент --settings → .claude/settings.local.json → .claude/settings.json → ~/.claude/settings.json (приоритет настроек). Значит, закоммиченное командой значение перекроет ваш личный файл, а ваш .claude/settings.local.json перекроет командное. Управляемые настройки переопределить нельзя. Файл .claude/settings.local.json Claude Code сам добавляет в глобальные исключения Git, когда впервые его записывает; если вы создали его вручную, добавьте его в .gitignore сами. И помните, что файлы настроек — строгий JSON: комментарий // или лишняя запятая тоже вызывают Settings Error.

А если просто написать правило в CLAUDE.md

Такое правило работает, но с оговорками. Claude Code сообщает модели, что ваши собственные указания об атрибуции — в CLAUDE.md или в памяти (memory) — важнее строк для коммитов и PR из настроек, если только эти строки не заданы в управляемых настройках (attribution). В версии 2.1.269 от 11 сентября 2026 года исправили ошибку, из-за которой встроенное напоминание об атрибуции перебивало такие правила. Но CLAUDE.md — это инструкция модели, а не фильтр: гарантии для каждого коммита он не даёт, и документация говорит только о строках коммита и PR, а не о ссылке на сессию. Детерминированно поведение задаёт настройка attribution.

Как проверить, что настройка применилась

  1. Если используете "attribution": false, убедитесь, что claude --version показывает 2.1.281 или новее.
  2. Выполните /status внутри Claude Code. Строка Setting sources на вкладке Status перечисляет файлы настроек, загруженные в текущую сессию. Какой файл дал конкретный ключ, она не показывает — это вычисляется по порядку приоритета выше (проверка загруженных настроек).
  3. Запустите claude doctor: он покажет записи, которые Claude Code отверг.
  4. В тестовой ветке попросите Claude Code в том же типе сессии сделать безобидный коммит и проверьте трейлеры:
bash
git log -1 --format=%B | git interpret-trailers --parse

Пустой вывод — трейлеров нет. Если Co-Authored-By или Claude-Session на месте, сначала выясните, какой файл вы правили и не перекрывает ли его файл выше по приоритету, а уже потом подозревайте сам ключ. Для облачной сессии убедитесь, что .claude/settings.json закоммичен и отправлен в тот репозиторий, из которого она стартует.

Важно тестировать там, где проблема возникла. По документации ссылку на сессию добавляют только облачные сессии и Remote Control, поэтому «чистый» локальный коммит ничего не говорит о поведении облачной сессии или Remote Control. Текст PR проверяется так же — на тестовом pull request. Перезапуск обычно не нужен: большинство изменений в файлах настроек Claude Code подхватывает на лету.

Светлая схема из шести блоков: четыре слоя атрибуции в таблице Author, Committer, Co-Authored-By и Claude-Session, команды git log для поиска записей, примеры JSON для attribution, приоритет файлов настроек от managed до пользовательского, проверка результата тестовым коммитом и варианты действий со старой историей

Кто может открыть ссылку на сессию

Сама по себе ссылка из коммита — не пароль: что увидит посторонний, зависит от видимости сессии (общий доступ к сессиям).

  • Team и Enterprise: видимость Private или Team, где Team — все участники вашей организации в claude.ai. Проверка доступа получателя к репозиторию включена по умолчанию.
  • Pro и Max: видимость Private или Public, где Public — любой пользователь, вошедший в claude.ai. Проверка доступа к репозиторию по умолчанию выключена; включить её и скрыть своё имя в общих сессиях можно в Settings > Claude Code > Sharing settings.

Документация прямо предупреждает, что в сессии может оказаться код и учётные данные из приватных репозиториев. Для сессий Remote Control отдельные правила общего доступа в этом разделе не описаны.

Значение sessionUrl по умолчанию — true. Запрос включать ссылку только по желанию пользователя (issue #66504) закрыт 17 августа 2026 года, но поведение по умолчанию осталось прежним, поэтому в облачных сессиях ссылка появляется, пока вы её не отключите.

Что делать с уже отправленными коммитами

Сначала найдите, где эти строки уже есть:

bash
git log --all -i --grep='^Claude-Session:' --format='%h %ad %s' --date=short
git log --all -i --grep='^Co-authored-by:' --format='%h %an %s'

Ключ -i нужен потому, что разные инструменты пишут Co-Authored-By и Co-authored-by по-разному. Эти команды видят только ветки, которые есть в вашем клоне; удалённые ветки коллег, форки и чужие клоны они не проверяют. Для поиска на GitHub в обзоре vibecoding.ru приводится команда gh api "/search/commits?q=Claude-Session+user:<account>" — это пример из новостной заметки, в документации GitHub его нет. Учтите, что поиск коммитов GitHub охватывает только ветку по умолчанию (Search commits), а индекс обновляется с задержкой.

Дальше решение зависит от того, ушли ли коммиты на сервер:

СитуацияЧто делатьЦена
Последний коммит ещё не отправленпереписать сообщение без двух строк (команда ниже)новый хеш только у локального коммита
Несколько неотправленных коммитовgit rebase -i origin/main и пометить нужные как rewordновые хеши, но пока всё локально
Уже отправлено, ветка только вашапереписать, затем git push --force-with-lease origin <ветка>новые хеши; старый коммит может остаться доступен по SHA в кешах GitHub и форках
Уже в общей ветке, ссылка ведёт на приватную сессию без секретовобычно оставить историю как есть и отключить атрибуцию на будущееникакой
Сессия была публичной и в ней есть ключи, токены или персональные данныесначала закрыть видимость сессии и отозвать или заменить секреты, потом решать судьбу историизависит от масштаба утечки

Для последнего неотправленного коммита, где нужно убрать и Co-Authored-By: Claude …, и Claude-Session:

bash
git log -1 --format=%B | grep -vi -e '^co-authored-by: claude' -e '^claude-session:' | git commit --amend -F -

-F - берёт новое сообщение из стандартного ввода; пустая строка, оставшаяся после удаления трейлеров, отбрасывается автоматически. Перед отправкой проверьте результат через git log -1 --format=%B.

Почему опубликованную историю ради ссылки обычно не трогают. Изменение сообщения создаёт новый идентификатор коммита, и force push может сломать работу коллег, чьи ветки основаны на старых коммитах (изменение сообщения коммита). При этом старый объект может остаться доступным: в клонах и форках, в кешированных представлениях GitHub по SHA и в ссылающихся на него pull request. Поддержка GitHub удаляет такие следы только для чувствительных данных и прямо пишет, что нечувствительные данные удалять не будет (удаление чувствительных данных). Голая ссылка на приватную сессию под это определение обычно не подпадает, так что переписывание почти ничего не даст, а неудобства создаст. Если же в публичной сессии был секрет, переписывание истории его не обезвреживает — первым делом секрет отзывают или заменяют.

Светлая плакат-схема из семи блоков: три параметра attribution.commit, attribution.pr и attribution.sessionUrl, таблица полей Author, Committer, Co-Authored-By и Claude-Session, команды поиска по истории, лестница приоритета конфигурации, два варианта JSON, решения для неопубликованных, опубликованных и содержащих секреты коммитов и типы сессий для проверки

Правило для всего репозитория: хук и проверка в CI

Настройка attribution действует только на Claude Code конкретного участника. Если правило «без отметок ИИ в истории» нужно всему репозиторию независимо от инструмента, его ставят на уровне Git. Хук commit-msg получает путь к файлу сообщения и может его отредактировать или отклонить коммит. Пример из руководства SSD Nodes удаляет строку Co-Authored-By с Claude:

sh
#!/bin/sh
# .githooks/commit-msg
grep -qi '^co-authored-by: claude' "$1" || exit 0
grep -vi '^co-authored-by: claude' "$1" > "$1.new" && mv "$1.new" "$1"
bash
chmod +x .githooks/commit-msg
git config core.hooksPath .githooks

Этот хук не трогает Claude-Session: чтобы убирать и ссылку, добавьте в обе строки grep второй шаблон -e '^claude-session:', как в команде --amend выше. Хуки из .git/hooks в репозиторий не попадают, а core.hooksPath каждый участник включает у себя сам — Git намеренно не делает этого при клонировании. Pull request из форков хук не видит вовсе, поэтому обязательным правило делает только проверка в CI (githooks). По словам автора issue #66504, в удалённых и облачных окружениях хуки срабатывают не всегда, так что для облачных сессий основной рычаг всё равно закоммиченный attribution.

Короткие ответы

Почему после "attribution": false перестали работать разрешения и хуки?

Скорее всего, версия Claude Code старше 2.1.281. Она отвергает значение false и пропускает весь файл настроек, в котором оно записано. Обновитесь или замените строку объектной формой с "commit": "", "pr": "", "sessionUrl": false, затем проверьте claude doctor.

Почему ~/.claude/settings.json не действует в облачной сессии?

Облачная сессия не читает ни ~/.claude/settings.json, ни .claude/settings.local.json. Нужен attribution в закоммиченном .claude/settings.json репозитория (для сессии с одним репозиторием) или в управляемых настройках организации.

Можно ли отключить ссылку на сессию переменной окружения?

В списке переменных окружения Claude Code, справочнике настроек и changelog такой переменной нет. Документированный способ — ключ attribution.sessionUrl в файле настроек, который читает ваш тип сессии.

Убирает ли настройка attribution Claude из авторов коммита?

Настройка attribution не меняет поля author и committer: их задаёт конфигурация Git в том окружении, где создаётся коммит. Настройка убирает трейлер Co-Authored-By, по которому GitHub показывает соавтора, поэтому в новых коммитах соавтор отображаться не будет. Уже созданные коммиты она не меняет.

Нашли ошибку или столкнулись с проблемой, которой нет в статье? Отправьте адрес статьи и описание на hi@laozhang.ai. Мы проверим и обновим текст.