Рабочие деревья
Используйте рабочие деревья Git в Codex в настольном приложении ChatGPT, чтобы параллельно вести несколько чатов
В настольном приложении ChatGPT рабочие деревья позволяют Codex вести несколько независимых чатов в одном проекте, не мешая друг другу. В репозиториях Git запланированные задачи могут выполняться в выделенных фоновых рабочих деревьях, чтобы не конфликтовать с вашей текущей работой. В проектах без системы контроля версий запланированные задачи выполняются непосредственно в каталоге проекта. Вы также можете вручную начать чат в рабочем дереве и использовать Handoff для переноса чата между Local и Worktree.
Что такое рабочее дерево
Рабочие деревья можно использовать только в проектах, входящих в репозиторий Git, поскольку в их основе лежат рабочие деревья Git. Рабочее дерево позволяет создать вторую копию («рабочую копию») вашего репозитория. В каждом рабочем дереве есть собственная копия каждого файла репозитория, но все они используют общие метаданные (папку .git) о коммитах, ветках и т. д. Благодаря этому вы можете параллельно извлекать несколько веток и работать с ними.
Терминология
- Локальная рабочая копия: созданный вами репозиторий. В настольном приложении ChatGPT иногда обозначается просто как Local.
- Рабочее дерево: рабочее дерево Git, созданное из вашей локальной рабочей копии в настольном приложении ChatGPT.
- Handoff: процесс переноса чата между Local и Worktree. Codex выполняет операции Git, необходимые для безопасного переноса вашей работы между ними.
Зачем использовать рабочее дерево
- Работайте параллельно с Codex, не затрагивая текущую конфигурацию Local.
- Ставьте фоновую работу в очередь, не отвлекаясь от основной задачи.
- Перенесите чат в Local позже, когда будете готовы проверить изменения, протестировать их или поработать с ними более непосредственно.
Начало работы
Для рабочих деревьев требуется репозиторий Git. Убедитесь, что выбранный проект находится в таком репозитории.
Выберите «Worktree»
В представлении нового чата выберите Worktree под полем ввода. При необходимости выберите локальное окружение, чтобы выполнить сценарии настройки рабочего дерева.
Выберите исходную ветку
Под полем ввода выберите ветку Git, на основе которой нужно создать рабочее дерево. Это может быть ваша ветка
main/master, функциональная ветка или текущая ветка с неподготовленными локальными изменениями.Отправьте запрос
Отправьте запрос, и Codex создаст рабочее дерево Git на основе выбранной ветки. По умолчанию Codex работает в состоянии «отсоединённого HEAD».
Выберите, где продолжить работу
Когда будете готовы, вы можете либо продолжить работу непосредственно в рабочем дереве, либо перенести чат в локальную рабочую копию. При переносе в Local или из него перемещаются и чат, и код, поэтому работу можно продолжить в другой рабочей копии.
Работа между Local и Worktree
Рабочие деревья выглядят и работают почти так же, как локальная рабочая копия. Различие заключается в их роли в вашем рабочем процессе. Local можно считать передним планом, а Worktree — фоновым. Handoff позволяет переносить чат между ними.
Внутри Handoff выполняет операции Git, необходимые для безопасного переноса работы между двумя рабочими копиями. Это важно, поскольку Git позволяет извлечь ветку только в одном месте одновременно. Если ветка извлечена в рабочем дереве, её нельзя одновременно извлечь в локальной рабочей копии, и наоборот.
На практике обычно используют один из двух вариантов:
- Работать исключительно в рабочем дереве. Этот вариант лучше всего подходит, если изменения можно проверить непосредственно в рабочем дереве, например если зависимости и инструменты установлены с помощью сценария настройки локального окружения.
- Перенести чат в Local. Используйте этот вариант, чтобы вывести чат на передний план, например если вы хотите проверить изменения в привычной IDE или можете запустить только один экземпляр приложения.
Вариант 1. Работа в рабочем дереве
Если вы хотите работать с изменениями исключительно в рабочем дереве, превратите его в ветку с помощью кнопки Create branch here в заголовке чата.
После этого вы можете зафиксировать изменения, отправить ветку в удалённый репозиторий и открыть запрос на включение изменений на GitHub.
Вы можете открыть рабочее дерево в IDE с помощью кнопки «Open» в заголовке, использовать встроенный терминал или любые другие необходимые инструменты из каталога рабочего дерева.
Помните: если вы создадите ветку в рабочем дереве, её нельзя будет извлечь ни в одном другом рабочем дереве, включая локальную рабочую копию.
Вариант 2. Перенос чата в Local
Чтобы вывести чат на передний план, выберите Hand off в заголовке чата и перенесите его в Local.
Этот вариант удобен, если вы хотите просмотреть изменения в привычном окне IDE, запустить существующий сервер разработки или проверить работу в том же окружении, которым пользуетесь ежедневно.
Codex выполняет операции Git, необходимые для безопасного переноса чата между рабочим деревом и локальной рабочей копией.
За каждым чатом постоянно закреплено одно и то же рабочее дерево. Если позднее вы перенесёте чат обратно в рабочее дерево, Codex вернёт его в то же фоновое окружение, и вы сможете продолжить с того места, где остановились.
Можно выполнить перенос и в обратном направлении. Если вы уже работаете в Local и хотите освободить передний план, используйте Hand off, чтобы перенести чат в рабочее дерево. Это полезно, когда вы хотите, чтобы Codex продолжал работать в фоновом режиме, пока вы снова переключаете внимание на другую локальную задачу.
Поскольку Handoff использует операции Git, файлы, входящие в ваш файл .gitignore, не будут перенесены вместе с чатом, если Codex не скопирует их в локальное управляемое рабочее дерево с помощью .worktreeinclude.
Дополнительные сведения
Управляемые Codex и постоянные рабочие деревья
По умолчанию в чатах используется рабочее дерево, управляемое Codex. Такие рабочие деревья задуманы как легковесные и одноразовые. Обычно управляемое Codex рабочее дерево выделяется одному чату, и Codex возвращает этот чат в то же рабочее дерево, если позднее вы переносите его обратно.
Если вам нужно долговременное окружение, создайте постоянное рабочее дерево через меню с тремя точками у проекта на боковой панели. При этом новое постоянное рабочее дерево создаётся как отдельный проект. Постоянные рабочие деревья не удаляются автоматически, и в одном таком рабочем дереве можно начать несколько чатов.
Как Codex управляет рабочими деревьями
Codex создаёт рабочие деревья в $CODEX_HOME/worktrees. Начальным коммитом служит коммит HEAD ветки, выбранной при запуске задачи. Если вы выбрали ветку с локальными изменениями, Codex также применит незафиксированные изменения к рабочему дереву. В рабочем дереве не извлекается ветка. Оно находится в состоянии отсоединённого HEAD. Благодаря этому Codex может создавать несколько рабочих деревьев, не засоряя список веток.
Копирование игнорируемых локальных файлов в управляемые рабочие деревья
Локальные рабочие деревья, управляемые Codex, создаются из рабочей копии Git, поэтому отслеживаемые файлы уже присутствуют. Если репозиторий игнорирует локальные файлы настройки, необходимые новому рабочему дереву, добавьте файл .worktreeinclude в корень репозитория и перечислите игнорируемые пути или шаблоны в стиле .gitignore, которые следует копировать при создании управляемого рабочего дерева в Codex.
Используйте это для файлов, которые Git намеренно игнорирует, например .env, .env.local или config/secrets.json. Codex копирует только игнорируемые файлы, соответствующие .worktreeinclude; другие локальные файлы, которые Git не отслеживает, не копируются. Не указывайте отслеживаемые файлы.
Codex автоматически копирует игнорируемый файл AGENTS.override.md в локальные управляемые рабочие деревья, поэтому добавлять его в .worktreeinclude не требуется.
# .worktreeinclude
.env
.env.local
config/secrets.jsonCodex пропускает символические ссылки в исходных данных и не перезаписывает файлы, уже существующие в новой рабочей копии. Это поведение относится к локальным управляемым рабочим деревьям настольного приложения ChatGPT, но не к удалённым рабочим деревьям или рабочим деревьям Git, которые вы создаёте самостоятельно из командной строки.
Ограничения веток
Предположим, Codex завершил работу в рабочем дереве, и вы решили создать в нём ветку feature/a с помощью кнопки Create branch here. Теперь вы хотите опробовать её в локальной рабочей копии. При попытке извлечь эту ветку появится следующая ошибка:
fatal: 'feature/a' is already used by worktree at '<WORKTREE_PATH>'Чтобы устранить её, в рабочем дереве потребуется извлечь другую ветку вместо feature/a.
Если вы планируете извлечь ветку локально, используйте Handoff для переноса чата в Local, а не пытайтесь одновременно держать одну и ту же ветку извлечённой в обоих местах.
Почему существует это ограничение
Git запрещает одновременно извлекать одну и ту же ветку более чем в одном рабочем дереве, поскольку ветка представляет собой единственную изменяемую ссылку (refs/heads/<name>), которая обозначает «текущее извлечённое состояние» рабочего дерева.
Когда ветка извлечена, Git считает, что её HEAD принадлежит этому рабочему дереву, и ожидает, что такие операции, как создание коммитов, сброс, перебазирование и слияние, будут изменять эту ссылку однозначно и последовательно. Если разрешить нескольким рабочим деревьям одновременно извлекать одну и ту же ветку, возникнут неоднозначность и состояния гонки: будет непонятно, операции какого рабочего дерева должны обновлять ссылку ветки. Это может привести к потере коммитов, несогласованным индексам или неясному порядку разрешения конфликтов.
Применяя правило «одна ветка на рабочее дерево», Git гарантирует, что у каждой ветки есть единственная авторитетная рабочая копия, при этом другие рабочие деревья могут безопасно ссылаться на те же коммиты через отсоединённые HEAD или отдельные ветки.
Очистка рабочих деревьев
Рабочие деревья могут занимать много места на диске. В каждом из них есть собственный набор файлов репозитория, зависимостей, кэшей сборки и т. д. Поэтому настольное приложение ChatGPT старается поддерживать количество рабочих деревьев в разумных пределах.
По умолчанию Codex сохраняет 15 последних рабочих деревьев, управляемых Codex. Вы можете изменить этот лимит или отключить автоматическое удаление в настройках, если предпочитаете управлять использованием диска самостоятельно.
Codex старается не удалять рабочие деревья, которые всё ещё важны. Управляемые Codex рабочие деревья не удаляются автоматически, если:
- С ними связан закреплённый чат
- Работа в чате ещё продолжается
- Рабочее дерево является постоянным
Управляемые Codex рабочие деревья удаляются автоматически, если:
- Вы архивируете связанный чат
- Codex необходимо удалить старые рабочие деревья, чтобы не превысить заданный лимит
Перед удалением управляемого Codex рабочего дерева Codex сохраняет снимок находящейся в нём работы. Если открыть чат после удаления его рабочего дерева, появится возможность восстановить его.
Часто задаваемые вопросы
Можно ли управлять местом создания рабочих деревьев?
Да. По умолчанию Codex создаёт управляемые рабочие деревья в $CODEX_HOME/worktrees.
Чтобы выбрать другое расположение, откройте Settings > Worktrees и измените
Worktree root.
Можно ли переместить чат между Local и Worktree?
Да. Используйте Hand off в заголовке чата, чтобы переместить чат между локальной рабочей копией и worktree. Codex выполняет необходимые операции Git для безопасного перемещения чата между средами. Если впоследствии вы снова передадите чат в worktree, Codex вернёт его в тот же связанный worktree.
Что происходит с чатами при удалении worktree?
Чаты могут оставаться в истории, даже если базовый каталог worktree удалён. Для worktree под управлением Codex система сохраняет снимок перед удалением worktree и предлагает восстановить его, если вы снова откроете связанный чат. Постоянные worktree не удаляются автоматически при архивации связанных с ними чатов.