Worktree
Gunakan Git worktrees di Codex dalam aplikasi desktop ChatGPT untuk menjalankan chat secara paralel
Dalam aplikasi desktop ChatGPT, worktree memungkinkan Codex menjalankan beberapa chat independen dalam proyek yang sama tanpa saling mengganggu. Untuk repositori Git, tugas terjadwal dapat berjalan di worktree latar belakang khusus agar tidak berkonflik dengan pekerjaan Anda yang sedang berlangsung. Dalam proyek tanpa kontrol versi, tugas terjadwal berjalan langsung di direktori proyek. Anda juga dapat memulai chat dalam worktree secara manual dan menggunakan Handoff untuk memindahkan chat antara Local dan Worktree.
Apa itu worktree
Worktree hanya berfungsi dalam proyek yang merupakan bagian dari repositori Git karena menggunakan Git worktrees sebagai mekanisme dasarnya. Worktree memungkinkan Anda membuat salinan kedua ("checkout") repositori. Setiap worktree memiliki salinan tersendiri dari setiap file dalam repo, tetapi semuanya menggunakan metadata yang sama (folder .git) mengenai commit, branch, dan sebagainya. Dengan demikian, Anda dapat melakukan checkout dan mengerjakan beberapa branch secara paralel.
Terminologi
- Checkout lokal: Repositori yang Anda buat. Terkadang hanya disebut Local dalam aplikasi desktop ChatGPT.
- Worktree: Git worktree yang dibuat dari checkout lokal Anda dalam aplikasi desktop ChatGPT.
- Handoff: Alur yang memindahkan chat antara Local dan Worktree. Codex menangani operasi Git yang diperlukan untuk memindahkan pekerjaan Anda dengan aman di antara keduanya.
Alasan menggunakan worktree
- Bekerja secara paralel dengan Codex tanpa mengganggu penyiapan Local Anda saat ini.
- Mengantrekan pekerjaan latar belakang sementara Anda tetap berfokus pada pekerjaan latar depan.
- Memindahkan chat ke Local nanti saat Anda siap memeriksa, menguji, atau berkolaborasi dengan lebih langsung.
Memulai
Worktree memerlukan repositori Git. Pastikan proyek yang Anda pilih berada di dalam repositori Git.
Pilih "Worktree"
Dalam tampilan chat baru, pilih Worktree di bawah kotak penulisan. Jika diinginkan, pilih lingkungan lokal untuk menjalankan skrip penyiapan bagi worktree.
Pilih branch awal
Di bawah kotak penulisan, pilih branch Git yang akan menjadi dasar worktree. Branch ini dapat berupa branch
main/master, branch fitur, atau branch Anda saat ini yang memiliki perubahan lokal yang belum di-stage.Kirimkan prompt Anda
Kirimkan prompt Anda, lalu Codex membuat Git worktree berdasarkan branch yang Anda pilih. Secara default, Codex bekerja dalam "detached HEAD".
Pilih tempat untuk melanjutkan pekerjaan
Saat siap, Anda dapat terus bekerja langsung di worktree atau melakukan handoff chat ke checkout lokal. Handoff ke atau dari Local memindahkan chat dan kode agar Anda dapat melanjutkan di checkout lainnya.
Bekerja antara Local dan Worktree
Worktree memiliki tampilan dan cara kerja yang sangat mirip dengan checkout lokal. Perbedaannya adalah posisi worktree dalam alur kerja Anda. Anda dapat menganggap Local sebagai latar depan dan Worktree sebagai latar belakang. Handoff memungkinkan Anda memindahkan chat di antara keduanya.
Sebagai mekanisme dasarnya, Handoff menangani operasi Git yang diperlukan untuk memindahkan pekerjaan secara aman antara dua checkout. Hal ini penting karena Git hanya mengizinkan suatu branch di-checkout di satu tempat pada satu waktu. Jika Anda melakukan checkout suatu branch pada worktree, Anda tidak dapat melakukan checkout branch tersebut pada checkout lokal secara bersamaan, begitu pula sebaliknya.
Dalam praktiknya, ada dua jalur umum:
- Bekerja sepenuhnya di worktree. Jalur ini paling sesuai jika Anda dapat memverifikasi perubahan langsung di worktree, misalnya karena Anda telah menginstal dependensi dan alat menggunakan skrip penyiapan lingkungan lokal.
- Melakukan handoff chat ke Local. Gunakan opsi ini saat Anda ingin membawa chat ke latar depan, misalnya karena Anda ingin memeriksa perubahan dalam IDE yang biasa digunakan atau hanya dapat menjalankan satu instance aplikasi.
Opsi 1: Bekerja di worktree
Jika Anda ingin tetap bekerja sepenuhnya di worktree dengan perubahan Anda, ubah worktree menjadi branch menggunakan tombol Buat branch di sini pada header chat.
Dari sini, Anda dapat melakukan commit atas perubahan, melakukan push branch ke repositori jarak jauh, dan membuka pull request di GitHub.
Anda dapat membuka IDE pada worktree menggunakan tombol "Buka" di header, menggunakan terminal terintegrasi, atau menggunakan alat lain yang diperlukan dari direktori worktree.
Ingat, jika Anda membuat branch pada worktree, Anda tidak dapat melakukan checkout branch tersebut di worktree lain, termasuk checkout lokal Anda.
Opsi 2: Melakukan handoff chat ke Local
Jika Anda ingin membawa chat ke latar depan, pilih Hand off di header chat dan pindahkan ke Local.
Jalur ini cocok saat Anda ingin membaca perubahan dalam jendela IDE yang biasa digunakan, menjalankan server pengembangan yang sudah ada, atau memvalidasi pekerjaan dalam lingkungan yang Anda gunakan sehari-hari.
Codex menangani langkah Git yang diperlukan untuk memindahkan chat dengan aman antara worktree dan checkout lokal Anda.
Setiap chat tetap terhubung dengan worktree yang sama dari waktu ke waktu. Jika nanti Anda melakukan handoff chat kembali ke worktree, Codex mengembalikannya ke lingkungan latar belakang yang sama sehingga Anda dapat melanjutkan dari posisi terakhir.
Anda juga dapat berpindah ke arah sebaliknya. Jika Anda sudah bekerja di Local dan ingin mengosongkan latar depan, gunakan Hand off untuk memindahkan chat ke worktree. Ini berguna saat Anda ingin Codex terus bekerja di latar belakang sementara Anda mengalihkan perhatian kembali ke pekerjaan lokal lainnya.
Karena Handoff menggunakan operasi Git, file apa pun yang menjadi bagian dari file .gitignore tidak akan ikut berpindah bersama chat kecuali Codex menyalinnya ke worktree lokal terkelola dengan .worktreeinclude.
Detail lanjutan
Worktree terkelola Codex dan permanen
Secara default, chat menggunakan worktree terkelola Codex. Worktree ini dirancang agar ringan dan dapat dibuang. Worktree terkelola Codex biasanya dikhususkan untuk satu chat, dan Codex mengembalikan chat tersebut ke worktree yang sama jika nanti Anda melakukan handoff kembali ke sana.
Jika Anda menginginkan lingkungan berumur panjang, buat worktree permanen dari menu tiga titik pada proyek di bilah samping. Tindakan ini membuat worktree permanen baru sebagai proyek tersendiri. Worktree permanen tidak dihapus secara otomatis, dan Anda dapat memulai beberapa chat dari worktree yang sama.
Cara Codex mengelola worktree untuk Anda
Codex membuat worktree di $CODEX_HOME/worktrees. Commit awal adalah commit HEAD dari branch yang dipilih saat Anda memulai tugas. Jika Anda memilih branch yang memiliki perubahan lokal, Codex juga menerapkan perubahan yang belum di-commit ke worktree. Worktree tidak di-checkout sebagai branch. Worktree berada dalam status detached HEAD. Dengan demikian, Codex dapat membuat beberapa worktree tanpa memenuhi daftar branch Anda.
Menyalin file lokal yang diabaikan ke worktree terkelola
Worktree lokal terkelola Codex dimulai dari checkout Git, sehingga file yang dilacak sudah tersedia. Jika repositori Anda mengabaikan file penyiapan lokal yang diperlukan worktree baru, tambahkan file .worktreeinclude ke direktori akar repositori dan cantumkan path yang diabaikan atau pola bergaya .gitignore yang akan disalin saat Codex membuat worktree terkelola.
Gunakan ini untuk file yang sengaja diabaikan Git, seperti .env, .env.local, atau config/secrets.json. Codex hanya menyalin file yang diabaikan dan cocok dengan .worktreeinclude; Codex tidak menyalin file lokal lain yang tidak dilacak Git. Jangan cantumkan file yang dilacak.
Codex secara otomatis menyalin AGENTS.override.md yang diabaikan ke worktree lokal terkelola, sehingga Anda tidak perlu mencantumkannya dalam .worktreeinclude.
# .worktreeinclude
.env
.env.local
config/secrets.jsonCodex melewati symlink sumber dan tidak akan menimpa file yang sudah ada dalam checkout baru. Perilaku ini berlaku untuk worktree terkelola aplikasi desktop ChatGPT lokal, bukan worktree jarak jauh atau Git worktree yang Anda buat sendiri dari baris perintah.
Batasan branch
Misalkan Codex menyelesaikan pekerjaan pada worktree dan Anda memilih untuk membuat branch feature/a di sana menggunakan Buat branch di sini. Sekarang, Anda ingin mencobanya pada checkout lokal. Jika Anda mencoba melakukan checkout branch tersebut, Anda akan mendapatkan kesalahan berikut:
fatal: 'feature/a' is already used by worktree at '<WORKTREE_PATH>'Untuk mengatasinya, Anda perlu melakukan checkout branch lain selain feature/a pada worktree.
Jika Anda berencana melakukan checkout branch secara lokal, gunakan Handoff untuk memindahkan chat ke Local alih-alih mencoba mempertahankan branch yang sama agar tetap di-checkout di dua tempat secara bersamaan.
Mengapa batasan ini ada
Git mencegah branch yang sama di-checkout pada lebih dari satu worktree secara bersamaan karena branch merepresentasikan satu referensi yang dapat diubah (refs/heads/<name>), yang bermakna “status checkout saat ini” dari suatu pohon kerja.
Saat suatu branch di-checkout, Git memperlakukan HEAD-nya sebagai milik worktree tersebut dan mengharapkan operasi seperti commit, reset, rebase, dan merge untuk memajukan referensi tersebut secara terdefinisi dengan baik dan berurutan. Mengizinkan beberapa worktree melakukan checkout branch yang sama secara bersamaan akan menimbulkan ambiguitas dan kondisi balapan terkait operasi worktree mana yang memperbarui referensi branch, yang berpotensi menyebabkan commit hilang, indeks tidak konsisten, atau penyelesaian konflik yang tidak jelas.
Dengan memberlakukan aturan satu branch per worktree, Git menjamin bahwa setiap branch memiliki satu salinan kerja otoritatif, sekaligus tetap memungkinkan worktree lain mereferensikan commit yang sama secara aman melalui detached HEAD atau branch terpisah.
Pembersihan worktree
Worktree dapat menghabiskan banyak ruang disk. Setiap worktree memiliki kumpulan file repositori, dependensi, cache build, dan sebagainya sendiri. Oleh karena itu, aplikasi desktop ChatGPT berupaya mempertahankan jumlah worktree pada batas yang wajar.
Secara default, Codex mempertahankan 15 worktree terkelola Codex terbaru. Anda dapat mengubah batas ini atau menonaktifkan penghapusan otomatis dalam pengaturan jika lebih memilih untuk mengelola penggunaan disk sendiri.
Codex berupaya menghindari penghapusan worktree yang masih penting. Worktree terkelola Codex tidak akan dihapus secara otomatis jika:
- Chat yang disematkan terhubung dengannya
- Chat masih berlangsung
- Worktree merupakan worktree permanen
Worktree terkelola Codex dihapus secara otomatis saat:
- Anda mengarsipkan chat terkait
- Codex perlu menghapus worktree lama agar tetap berada dalam batas yang Anda konfigurasi
Sebelum menghapus worktree terkelola Codex, Codex menyimpan snapshot pekerjaan di dalamnya. Jika Anda membuka chat setelah worktree-nya dihapus, Anda akan melihat opsi untuk memulihkannya.
Pertanyaan umum
Dapatkah saya mengontrol lokasi pembuatan worktree?
Ya. Secara default, Codex membuat worktree terkelola di bawah $CODEX_HOME/worktrees.
Untuk memilih lokasi lain, buka Pengaturan > Worktree dan ubah
Direktori akar worktree.
Dapatkah saya memindahkan chat antara Local dan Worktree?
Ya. Gunakan Hand off di header chat untuk memindahkan chat antara checkout lokal dan worktree. Codex menangani operasi Git yang diperlukan untuk memindahkan chat secara aman antarlingkungan. Jika nanti Anda melakukan handoff chat kembali ke worktree, Codex mengembalikannya ke worktree terkait yang sama.
Apa yang terjadi pada chat jika worktree dihapus?
Chat dapat tetap berada dalam riwayat Anda meskipun direktori worktree yang mendasarinya telah dihapus. Untuk worktree terkelola Codex, Codex menyimpan snapshot sebelum menghapus worktree dan menawarkan pemulihan jika Anda membuka kembali chat terkait. Worktree permanen tidak dihapus secara otomatis saat Anda mengarsipkan chat-nya.