Git 2.5 mengusulkan sejak Juli 2015 pengganti untuk contrib/workdir/git-new-workdir: git worktree
Lihat commit 68a2e6a oleh Junio C Hamano ( gitster) .
Catatan rilis menyebutkan :
Pengganti untuk contrib/workdir/git-new-workdiryang tidak bergantung pada tautan simbolis dan membuat berbagi objek dan referensi lebih aman dengan membuat peminjam dan peminjam saling menyadari.
Lihat komit 799767cc9 (Git 2.5rc2)
Itu berarti Anda sekarang dapat melakukangit worktree add <path> [<branch>]
Buat <path>dan checkout <branch>ke dalamnya. Direktori kerja baru ditautkan ke repositori saat ini, berbagi segalanya kecuali file spesifik direktori kerja seperti HEAD, indeks, dll. git worktreeBagian ini menambahkan:
Repositori git dapat mendukung banyak pohon yang berfungsi , memungkinkan Anda untuk memeriksa lebih dari satu cabang sekaligus.
Dengan git worktree add, pohon kerja baru dikaitkan dengan repositori.
Pohon kerja baru ini disebut "pohon kerja tertaut" sebagai lawan dari "pohon kerja utama" yang disiapkan oleh "git init " atau " git clone" .
Repositori memiliki satu pohon kerja utama (jika itu bukan repositori kosong) dan nol atau lebih pohon kerja yang ditautkan.
detail:
Setiap pohon yang terhubung memiliki sub-direktori pribadi di direktori repositori
$GIT_DIR/worktrees.
Nama sub-direktori pribadi biasanya nama dasar dari jalur pohon kerja yang ditautkan, mungkin ditambahkan dengan nomor untuk membuatnya unik.
Misalnya saat $GIT_DIR=/path/main/.gitperintahgit worktree add /path/other/test-next next menciptakan:
- pohon kerja tertaut di
/path/other/test-next dan
- juga membuat
$GIT_DIR/worktrees/test-nextdirektori (atau$GIT_DIR/worktrees/test-next1 jika test-nextsudah diambil).
Di dalam pohon kerja yang ditautkan:
$GIT_DIR diatur untuk mengarahkan ke direktori pribadi ini (mis /path/main/.git/worktrees/test-next dalam contoh) dan
$GIT_COMMON_DIRdiatur untuk menunjuk kembali ke pohon kerja utama $GIT_DIR(mis/path/main/.git ).
Pengaturan ini dibuat dalam a .git file yang terletak di direktori teratas pohon kerja tertaut.
Ketika Anda selesai dengan pohon kerja tertaut Anda hanya dapat menghapusnya.
File administrasi pohon kerja dalam repositori pada akhirnya akan dihapus secara otomatis (lihat gc.pruneworktreesexpiredi git config), atau Anda dapat menjalankan git worktree prunedi pohon kerja utama atau yang terkait untuk membersihkan file administrasi yang sudah basi.
Peringatan: masih ada bagian git worktree"BUGS" yang harus diperhatikan.
Dukungan untuk submodul tidak lengkap .
TIDAK dianjurkan untuk membuat banyak checkout dari suatu proyek super.
Catatan: dengan git 2.7rc1 (Nov 2015) Anda dapat membuat daftar worktrees Anda.
Lihat komit bb9c03b , komit 92718b7 , komit 5193490 , komit 1ceb7f9 , komit 1ceb7f9 , komit 5193490 , komit 1ceb7f9 , komit 1ceb7f9 , komit 1ceb7f9 (8 Oktober 2015), melakukan 92718b7 , komit 5.193.490 , komit 1ceb7f9 , komit 1ceb7f9 (8 Oktober 2015), melakukan 5.193.490 , komit 1ceb7f9 (08 Okt 2015), komit 1ceb7f9 (08 Okt 2015), dan komit ac6c561(02 Okt 2015) oleh Michael Rappazzo ( rappazzo) .
(Digabung oleh Junio C Hamano - gitster- di commit a46dcfb , 26 Okt 2015)
worktree: tambahkan listperintah ' '
' git worktree list' Berulang melalui daftar meja kerja, dan menampilkan detail dari meja kerja termasuk jalur ke meja kerja, revisi dan cabang saat ini memeriksa, dan jika pohon kerja telanjang.
$ git worktree list
/path/to/bare-source (bare)
/path/to/linked-worktree abcd1234 [master]
/path/to/other-linked-worktree 1234abc (detached HEAD)
Ada juga opsi format porselen yang tersedia.
Format porselen memiliki garis per atribut.
- Atribut dicantumkan dengan label dan nilai dipisahkan oleh satu spasi.
- Atribut Boolean (seperti 'telanjang' dan 'terlepas') didaftar sebagai label saja, dan hanya ada jika dan hanya jika nilainya benar.
- Baris kosong menunjukkan akhir dari sebuah meja kerja
Misalnya:
$ git worktree list --porcelain
worktree /path/to/bare-source
bare
worktree /path/to/linked-worktree
HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
branch refs/heads/master
worktree /path/to/other-linked-worktree
HEAD 1234abc1234abc1234abc1234abc1234abc1234a
detached
Catatan: jika Anda Pindah folder folder kerja, Anda perlu memperbarui secara manualgitdir file .
Lihat komit 618244e (22 Jan 2016), dan komit d4cddd6 (18 Jan 2016) oleh Nguyễn Thái Ngọc Duy ( pclouds) .
Dibantu-oleh: Eric Sunshine ( sunshineco) .
(Digabung oleh Junio C Hamano - gitster- in commit d0a1cbc , 10 Feb 2016)
Doc baru di git 2.8 (Maret 2016) akan mencakup:
Jika Anda memindahkan pohon kerja yang tertaut, Anda perlu memperbarui file ' gitdir' di direktori entri.
Misalnya, jika pohon kerja tertaut dipindahkan ke /newpath/test-nextdan .gitfile -nya menunjuk ke /path/main/.git/worktrees/test-next, maka perbarui
/path/main/.git/worktrees/test-next/gitdirke referensi /newpath/test-nextsebagai gantinya.
Hati-hati saat menghapus cabang: sebelum git 2.9 (Juni 2016), Anda bisa menghapus satu yang digunakan di pohon kerja lain .
Ketika " git worktree" fitur sedang digunakan, " git branch -d" penghapusan cabang yang diizinkan diperiksa di meja kerja lain.
Lihat komit f292244 (29 Mar 2016) oleh Kazuki Yamaguchi ( rhenium) .
Dibantu-oleh: Eric Sunshine ( sunshineco) .
(Digabung oleh Junio C Hamano - gitster- dalam komit 4fca4e3 , 13 Apr 2016)
branch -d: menolak menghapus cabang yang saat ini sedang diperiksa
Ketika cabang diperiksa oleh pohon yang sedang bekerja, menghapus cabang itu dilarang.
Namun ketika cabang diperiksa hanya oleh pohon yang bekerja, penghapusan salah berhasil.
Gunakan find_shared_symref()untuk memeriksa apakah cabang sedang digunakan, tidak hanya membandingkan dengan KEPALA pohon kerja saat ini.
Demikian pula, sebelum git 2.9 (Juni 2016), mengganti nama cabang yang diperiksa di worktree lain tidak menyesuaikan HEAD simbolis dalam kata worktree lainnya.
Lihat komit 18eb3a9 (08 Apr 2016), dan komit 70999e9 , komit 2233066 (27 Mar 2016) oleh Kazuki Yamaguchi ( rhenium) .
(Digabung oleh Junio C Hamano - gitster- dalam komit 741a694 , 18 Apr 2016)
branch -m: perbarui semua HEADs per-worktree
Saat mengganti nama cabang, saat ini hanya KEPALA pohon yang sedang bekerja dimutakhirkan, tetapi harus memperbarui KEPALA semua pohon yang bekerja yang menunjuk ke cabang yang lama.
Ini adalah perilaku saat ini, / path / ke / KEPALA HEAD tidak diperbarui:
% git worktree list
/path/to 2c3c5f2 [master]
/path/to/wt 2c3c5f2 [oldname]
% git branch -m master master2
% git worktree list
/path/to 2c3c5f2 [master2]
/path/to/wt 2c3c5f2 [oldname]
% git branch -m oldname newname
% git worktree list
/path/to 2c3c5f2 [master2]
/path/to/wt 0000000 [oldname]
Tambalan ini memperbaiki masalah ini dengan memperbarui semua KEPALA kantor yang relevan saat mengganti nama cabang.
Mekanisme penguncian secara resmi didukung oleh git 2.10 (Q3 2016)
Lihat komit 080739b , komit 6d30862 , komit 58142c0 , komit 346ef53 , komit 346ef53 , komit 58142c0 , komit 346ef53 , komit 346ef53 (13 Jun 2016), dan komit 984ad9e , komit 6.835.314 (3 Juni 2016) oleh Nguyễn Thái Ngọc Duy ( pclouds) .
Disarankan oleh: Eric Sunshine ( sunshineco) .
(Digabung oleh Junio C Hamano - gitster- dalam komit 2c608e0 , 28 Jul 2016)
git worktree lock [--reason <string>] <worktree>
git worktree unlock <worktree>
Jika pohon kerja tertaut disimpan pada perangkat portabel atau jaringan berbagi yang tidak selalu di-mount, Anda dapat mencegah pemangkasan file administratif dengan mengeluarkan git worktree lockperintah, secara opsional menentukan--reason untuk menjelaskan mengapa pohon kerja terkunci.
<worktree>: Jika komponen jalur terakhir di jalur pohon yang bekerja unik di antara pohon yang bekerja, itu dapat digunakan untuk mengidentifikasi tabel kerja.
Misalnya jika Anda hanya perlu mengerjakan pohon pada " /abc/def/ghi" dan " /abc/def/ggg", maka " ghi" atau " def/ghi" cukup untuk menunjuk ke pohon yang sebelumnya bekerja.
Git 2.13 (Q2 2017) menambahkan lockopsi di commit 507e6e9 (12 Apr 2017) oleh Nguyễn Thái Ngọc Duy ( pclouds) .
Disarankan oleh: David Taylor ( dt) .
Dibantu-oleh: Jeff King ( peff) .
(Digabung oleh Junio C Hamano - gitster- dalam komit e311597 , 26 Apr 2017)
Izinkan untuk mengunci worktree segera setelah itu dibuat.
Ini membantu mencegah balapan antara " git worktree add; git worktree lock" dan " git worktree prune".
Begitu git worktree add' --lock juga dengan git worktree lockafter git worktree add, tetapi tanpa kondisi balapan.
Git 2.17+ (Q2 2018) menambahkan git worktree move/ git worktree remove: lihat jawaban ini .
Git 2.19 (Q3 2018) tambahkan --quietopsi " " untuk membuat "git worktree add " kurang bertele - tele.
Lihat komit 371979c (15 Agustus 2018) oleh Elia Pinto ( devzero2000) .
Dibantu-oleh: Martin Ågren, Duy Nguyen ( pclouds) , dan Eric Sunshine ( sunshineco) .
(Digabung oleh Junio C Hamano - gitster- di commit a988ce9 , 27 Agu 2018)
worktree: Menambahkan --quiet opsi
Tambahkan opsi ' --quiet' ke git worktree, seperti untuk gitperintah lainnya .
' add' adalah satu-satunya perintah yang terpengaruh karena semua perintah lain, kecuali ' list', saat ini diam secara default.
Perhatikan bahwa " git worktree add" dulu melakukan "menemukan nama yang tersedia dengan stat dan kemudian mkdir", yang rawan ras.
Ini telah diperbaiki dengan Git 2.22 (Q2 2019) dengan menggunakan mkdirdan bereaksi terhadapEEXIST dalam satu lingkaran.
Lihat komit 7af01f2 (20 Feb 2019) oleh Michal Suchanek ( hramrach) .
(Digabung oleh Junio C Hamano - gitster- dalam komit 20fe798 , 09 Apr 2019)
worktree: perbaiki worktree add ras
Git menjalankan loop stat untuk menemukan nama worktree yang tersedia dan kemudian melakukan mkdirpada nama yang ditemukan.
Putar untuk mkdirmengulang untuk menghindari pemanggilan worktree lainnya, tambahkan menemukan nama gratis yang sama dan membuat direktori terlebih dahulu.
Git 2.22 (Q2 2019) memperbaiki logika untuk memberi tahu apakah repositori Git memiliki pohon yang berfungsi melindungi " git branch -D" dari menghilangkan cabang yang saat ini diperiksa secara tidak sengaja.
Implementasi dari logika ini telah rusak untuk repositori dengan nama yang tidak biasa, yang sayangnya merupakan norma untuk submodul saat ini.
Lihat komit f3534c9 (19 Apr 2019) oleh Jonathan Tan ( jhowtan) .
(Digabung oleh Junio C Hamano - gitster- di commit ec2642a , 08 Mei 2019)
Permintaan Kode Tarik 178 Wawasan
worktree: perbarui is_bareheuristik
Ketika " git branch -D <name>" dijalankan, Git biasanya pertama memeriksa apakah cabang itu saat ini sedang diperiksa.
Tetapi pemeriksaan ini tidak dilakukan jika direktori Git dari repositori itu tidak di " <repo>/.git", yang merupakan kasus jika repositori itu adalah sebuah submodule yang memiliki direktori Git yang disimpan sebagai " super/.git/modules/<repo>", misalnya.
Ini menghasilkan cabang yang dihapus meskipun sudah diperiksa.
Ini karena get_main_worktree()di worktree.cset is_barepada sebuah meja kerja hanya menggunakan heuristik bahwa repo itu telanjang jika jalur worktree tidak berakhir pada " /.git", dan tidak telanjang sebaliknya.
Ini is_barekode diperkenalkan pada 92718b7 ( " worktree: rincian add ke worktree struct", 2015/10/08, Git v2.7.0-RC0), menyusul pre-core.bareheuristik.
Patch ini melakukan 2 hal:
- Mengajar
get_main_worktree() untuk menggunakan is_bare_repository()sebagai gantinya, diperkenalkan pada 7d1864c ("Perkenalkan is_bare_repository () dan variabel konfigurasi core.bare", 2007-01-07, Git v1.5.0-rc1) dan diperbarui di e90fdc3 ("Bersihkan penanganan pohon kerja", 2007 -08-01, Git v1.5.3-rc4).
Ini menyelesaikan masalah " git branch -D <name>" yang dijelaskan di atas.
Namun ... Jika repositori memiliki core.bare=1tetapi " git" perintah dijalankan dari salah satu worktrees sekundernya, is_bare_repository()mengembalikan false (yang tidak masalah, karena ada worktree yang tersedia).
Dan, memperlakukan meja kerja utama sebagai non-telanjang saat telanjang menyebabkan masalah:
Misalnya, kegagalan untuk menghapus cabang dari worktree sekunder yang disebut oleh HEAD worktree utama, bahkan jika itu worktree utama kosong.
Untuk menghindarinya, periksa juga core.barekapan pengaturan is_bare.
Jika core.bare=1, percayalah, dan jika tidak, gunakan is_bare_repository().
git-new-workdirakan diganti olehgit checkout --to=<path>di Git 2.5. Lihat jawaban saya di bawah ini