Рабочие деревья
Рабочие деревья
Используйте рабочие деревья Git в Codex в приложении ChatGPT для настольных компьютеров, чтобы параллельно вести несколько чатов
Рабочие деревья позволяют Codex вести несколько независимых диалогов в одном проекте, не мешая друг другу. Репозиторий, рабочее дерево и команды остаются на компьютере или в удалённой среде разработки, где находится проект. Вы можете работать непосредственно в настольном приложении ChatGPT или использовать Remote в мобильном приложении ChatGPT, чтобы запускать, направлять, утверждать и проверять диалоги в рабочих деревьях на подключённом компьютере.
Для репозиториев Git запланированные задачи могут выполняться в выделенных фоновых рабочих деревьях, чтобы не конфликтовать с текущей работой. В проектах без системы контроля версий запланированные задачи выполняются непосредственно в каталоге проекта. Вы также можете вручную запускать диалоги в рабочем дереве и использовать Handoff для переноса диалога между Local и Worktree.
Что такое рабочее дерево
Рабочие деревья доступны только в проектах, являющихся частью репозитория Git, поскольку внутри они используют рабочие деревья Git. Рабочее дерево позволяет создать вторую копию («checkout») репозитория. У каждого рабочего дерева есть собственная копия каждого файла репозитория, но все они используют общие метаданные (папку .git) о коммитах, ветках и т. д. Благодаря этому можно извлекать несколько веток и работать с ними параллельно.
Терминология
- Local checkout: созданный вами репозиторий. В приложении ChatGPT для настольных компьютеров иногда называется просто Local.
- Worktree: рабочее дерево Git, созданное из локальной рабочей копии в приложении ChatGPT для настольных компьютеров.
- Handoff: процесс перемещения чата между Local и Worktree. Codex выполняет операции Git, необходимые для безопасного переноса вашей работы между ними.
Зачем использовать рабочее дерево
- Работайте параллельно с Codex, не затрагивая текущую локальную конфигурацию.
- Ставьте фоновую работу в очередь, не отвлекаясь от основной задачи.
- Позже переносите чат в Local, когда будете готовы изучить или протестировать изменения либо поработать с ними более непосредственно.
Начало работы
Для рабочих деревьев необходим репозиторий Git. Убедитесь, что выбранный проект находится в таком репозитории.
Выберите «Worktree»
В представлении нового чата выберите Worktree под полем ввода. При необходимости выберите локальную среду, чтобы выполнить скрипты настройки рабочего дерева.
Выберите исходную ветку
Под полем ввода выберите ветку Git, на основе которой нужно создать рабочее дерево. Это может быть ветка
main/master, ветка функции или текущая ветка с неиндексированными локальными изменениями.Отправьте запрос
Отправьте запрос, и Codex создаст рабочее дерево Git на основе выбранной ветки. По умолчанию Codex работает в состоянии «detached HEAD».
Выберите, где продолжить работу
Когда будете готовы, можно продолжить работу непосредственно в рабочем дереве или передать чат в локальную рабочую копию. При передаче в Local или из него перемещаются и чат, и код, поэтому работу можно продолжить в другой рабочей копии.
Работа между Local и Worktree
Работа с рабочими деревьями выглядит почти так же, как с локальной рабочей копией. Различие состоит в их роли в рабочем процессе. Local можно считать передним планом, а Worktree — фоном. Handoff позволяет перемещать чат между ними.
Внутри Handoff выполняет операции Git, необходимые для безопасного переноса работы между двумя рабочими копиями. Это важно, поскольку Git позволяет извлечь ветку только в одном месте одновременно. Если ветка извлечена в рабочем дереве, ее нельзя одновременно извлечь в локальной рабочей копии, и наоборот.
На практике распространены два сценария:
- Работать исключительно в рабочем дереве. Этот сценарий лучше всего подходит, когда изменения можно проверить непосредственно в рабочем дереве, например если зависимости и инструменты установлены с помощью скрипта настройки локальной среды.
- Передать чат в Local. Используйте этот сценарий, чтобы вывести чат на передний план, например если хотите изучить изменения в привычной IDE или можете запустить только один экземпляр приложения.
Вариант 1. Работа в рабочем дереве
Если вы хотите работать с изменениями исключительно в рабочем дереве, преобразуйте его в ветку с помощью кнопки Create branch here в заголовке чата.
После этого можно зафиксировать изменения в коммите, отправить ветку в удаленный репозиторий и открыть pull request на GitHub.
Вы можете открыть IDE для рабочего дерева с помощью кнопки «Открыть» в заголовке, использовать встроенный терминал или любые другие необходимые средства из каталога рабочего дерева.
Вариант 2. Передача чата в Local
Если вы хотите вывести чат на передний план, выберите Hand off в заголовке чата и переместите его в Local.
Этот сценарий удобен, если вы хотите просмотреть изменения в привычном окне IDE, запустить существующий сервер разработки или проверить работу в той же среде, которой пользуетесь каждый день.
Codex выполняет операции Git, необходимые для безопасного перемещения чата между рабочим деревом и локальной рабочей копией.
За каждым чатом со временем сохраняется одно и то же связанное рабочее дерево. Если позднее вы снова передадите чат в рабочее дерево, 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/Когда ветка извлечена, Git считает, что ее HEAD принадлежит этому рабочему дереву, и ожидает, что такие операции, как коммиты, сбросы, перебазирования и слияния, будут продвигать эту ссылку однозначно и последовательно. Возможность одновременно извлечь одну ветку в нескольких рабочих деревьях создала бы неоднозначность и условия гонки при определении того, операции какого рабочего дерева обновляют ссылку ветки. Это могло бы привести к потере коммитов, несогласованности индексов или неясному разрешению конфликтов.
Обеспечивая правило «одна ветка на одно рабочее дерево», Git гарантирует, что у каждой ветки есть единственная авторитетная рабочая копия, при этом другие рабочие деревья могут безопасно ссылаться на те же коммиты через detached HEAD или отдельные ветки.
Очистка рабочих деревьев
Рабочие деревья могут занимать много места на диске. Каждое из них содержит собственный набор файлов репозитория, зависимостей, кешей сборки и т. д. Поэтому приложение ChatGPT для настольных компьютеров старается поддерживать разумное количество рабочих деревьев.
По умолчанию Codex сохраняет 15 последних управляемых им рабочих деревьев. В настройках можно изменить этот предел или отключить автоматическое удаление, если вы предпочитаете управлять использованием диска самостоятельно.
Codex старается не удалять рабочие деревья, которые все еще важны. Управляемые Codex рабочие деревья не удаляются автоматически, если:
- С ними связан закрепленный чат
- Чат все еще выполняется
- Рабочее дерево является постоянным
Управляемые Codex рабочие деревья удаляются автоматически, когда:
- Вы архивируете связанный чат
- Codex необходимо удалить старые рабочие деревья, чтобы не превысить настроенный предел
Перед удалением управляемого рабочего дерева Codex сохраняет снимок находящейся в нем работы. Если открыть чат после удаления его рабочего дерева, вы увидите возможность восстановить его.