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

> Co-Authored-By, текст в PR и Claude-Session убирает ключ attribution. Форма false работает с v2.1.281, облачная сессия читает только .claude/settings.json.

- Source: https://www.aifreeapi.com/ru/posts/claude-code-session-url-git-attribution
- Language: ru
- Published: 2026-08-31
- Updated: 2026-09-25
- Publisher: AI Free API (https://www.aifreeapi.com)

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

| Что нужно | Что записать в `settings.json` | Главное условие |
|---|---|---|
| Убрать всё: трейлер, текст в PR и ссылку | `"attribution": false` | Claude 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`, закоммиченный в сам репозиторий, и только когда в сессии один репозиторий ([настройки в облачных сессиях](https://code.claude.com/docs/en/settings#settings-in-cloud-sessions)). Проверять результат нужно тем же типом сессии, который добавлял строки.

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

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

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

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

Трейлер (trailer) — это строка вида `Ключ: значение` в последнем абзаце сообщения коммита, отделённом пустой строкой; Git и GitHub читают такие строки как структурированные данные ([git interpret-trailers](https://git-scm.com/docs/git-interpret-trailers)). Это не криптографическая подпись GPG или SSH и не поле автора. Автор (author) и коммитер (committer) хранятся в объекте коммита отдельно: `attribution` их не меняет, и удаление трейлера не трогает ни их, ни подпись. GitHub по трейлеру `Co-authored-by` показывает у коммита соавторов ([документация GitHub](https://docs.github.com/en/pull-requests/committing-changes-to-your-project/creating-and-editing-commits/creating-a-commit-with-multiple-authors)).

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

```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: что изменилось и как откатить версию](/ru/posts/claude-code-changelog).

Ловушка в том, что более старая версия не просто игнорирует `false`, а отвергает его и пропускает **весь** пользовательский, проектный или локальный файл, где оно записано ([описание ключа](https://code.claude.com/docs/en/settings-reference#attribution)). Вместе с ним перестают действовать разрешения, хуки и всё остальное из этого файла. В интерактивной сессии Claude Code покажет диалог Settings Error, а запуск с `-p` пропустит файл молча — после такого запуска выполните `claude doctor`, он перечислит отвергнутые записи ([исправление сломанного файла настроек](https://code.claude.com/docs/en/settings#fix-a-broken-settings-file)).

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

```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](https://code.claude.com/docs/en/settings-reference#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 | управляемые настройки организации с сервера; другого способа документация не описывает |

Источники: [файлы настроек и их область действия](https://code.claude.com/docs/en/settings), [настройки в облачных сессиях](https://code.claude.com/docs/en/settings#settings-in-cloud-sessions), [Remote Control](https://code.claude.com/docs/en/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` ([приоритет настроек](https://code.claude.com/docs/en/settings)). Значит, закоммиченное командой значение перекроет ваш личный файл, а ваш `.claude/settings.local.json` перекроет командное. Управляемые настройки переопределить нельзя. Файл `.claude/settings.local.json` Claude Code сам добавляет в глобальные исключения Git, когда впервые его записывает; если вы создали его вручную, добавьте его в `.gitignore` сами. И помните, что файлы настроек — строгий JSON: комментарий `//` или лишняя запятая тоже вызывают Settings Error.

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

Такое правило работает, но с оговорками. Claude Code сообщает модели, что ваши собственные указания об атрибуции — в CLAUDE.md или в памяти (memory) — важнее строк для коммитов и PR из настроек, если только эти строки не заданы в управляемых настройках ([attribution](https://code.claude.com/docs/en/settings-reference#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 перечисляет файлы настроек, загруженные в текущую сессию. Какой файл дал конкретный ключ, она не показывает — это вычисляется по порядку приоритета выше ([проверка загруженных настроек](https://code.claude.com/docs/en/settings#check-what-loaded)).
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 до пользовательского, проверка результата тестовым коммитом и варианты действий со старой историей](https://www.aifreeapi.com/posts/ru/claude-code-session-url-git-attribution/img/audit-settings-map.webp)

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

Сама по себе ссылка из коммита — не пароль: что увидит посторонний, зависит от видимости сессии ([общий доступ к сессиям](https://code.claude.com/docs/en/claude-code-on-the-web#share-sessions)).

- **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](https://github.com/anthropics/claude-code/issues/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](https://docs.github.com/en/rest/search/search#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 может сломать работу коллег, чьи ветки основаны на старых коммитах ([изменение сообщения коммита](https://docs.github.com/en/pull-requests/how-tos/commit-changes/changing-a-commit-message)). При этом старый объект может остаться доступным: в клонах и форках, в кешированных представлениях GitHub по SHA и в ссылающихся на него pull request. Поддержка GitHub удаляет такие следы только для чувствительных данных и прямо пишет, что нечувствительные данные удалять не будет ([удаление чувствительных данных](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository)). Голая ссылка на приватную сессию под это определение обычно не подпадает, так что переписывание почти ничего не даст, а неудобства создаст. Если же в публичной сессии был секрет, переписывание истории его не обезвреживает — первым делом секрет отзывают или заменяют.

![Светлая плакат-схема из семи блоков: три параметра attribution.commit, attribution.pr и attribution.sessionUrl, таблица полей Author, Committer, Co-Authored-By и Claude-Session, команды поиска по истории, лестница приоритета конфигурации, два варианта JSON, решения для неопубликованных, опубликованных и содержащих секреты коммитов и типы сессий для проверки](https://www.aifreeapi.com/posts/ru/claude-code-session-url-git-attribution/img/history-risk-decision.webp)

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

Настройка `attribution` действует только на Claude Code конкретного участника. Если правило «без отметок ИИ в истории» нужно всему репозиторию независимо от инструмента, его ставят на уровне Git. Хук `commit-msg` получает путь к файлу сообщения и может его отредактировать или отклонить коммит. Пример из [руководства SSD Nodes](https://www.ssdnodes.com/learn/lang/ru/claude-code-commit-attribution) удаляет строку `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](https://git-scm.com/docs/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 показывает соавтора, поэтому в новых коммитах соавтор отображаться не будет. Уже созданные коммиты она не меняет.
