Banyak direktori kerja dengan Git?

242

Saya tidak yakin apakah ini sesuatu yang didukung oleh Git, tetapi secara teori sepertinya itu harus bekerja untuk saya.

Alur kerja saya sering melibatkan pengeditan file di banyak cabang secara bersamaan. Dengan kata lain, saya sering ingin membuka beberapa file di satu cabang ini sementara saya mengedit isi file lain di cabang lain.

Solusi khas saya untuk ini adalah dengan membuat dua checkout, tetapi sayang sekali saya tidak bisa berbagi cabang dan referensi di antara mereka. Yang saya inginkan adalah hanya memiliki dua direktori kerja yang dikelola oleh folder .git yang sama.

Saya mengetahui solusi git clone lokal (defaultnya, yaitu untuk hardlink objek yang dibagikan, dan opsi - shared, yang mengatur penyimpanan objek alternatif dengan repo asli), tetapi solusi ini hanya mengurangi penggunaan ruang disk , dan terutama dalam kasus - shared, tampaknya penuh dengan bahaya.

Apakah ada cara untuk menggunakan satu folder .git, dan memiliki dua direktori kerja yang didukung olehnya? Atau apakah Git hardcoded hanya memiliki satu direktori kerja diperiksa kapan saja?

Jtolds
sumber
1
git-new-workdirakan diganti oleh git checkout --to=<path>di Git 2.5. Lihat jawaban saya di bawah ini
VonC
3
Sebenarnya, perintahnya adalah git worktree add <path> [<branch>](Git 2.5 rc2). Lihat jawaban saya yang diedit di bawah
VonC
Anda harus mengubah jawaban yang diterima. Jawaban VonC, karena banyak hal telah berubah sejak Anda semula mengajukan pertanyaan.
xaxxon
terima kasih atas jawaban yang diperbarui!
jtolds

Jawaban:

293

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().

VONC
sumber
1
Ini adalah hal paling keren yang mereka buat, hanya apa yang saya cari. Terima kasih untuk itu!
Cara menghapus pohon yang bekerja saja dan masih mempertahankan cabang
Randeep Singh
@DotnetRocks Anda dapat menghapus pohon yang berfungsi (folder lokal di komputer Anda): yang tidak akan memiliki pengaruh pada cabang: repo .git utama masih akan menyertakan riwayat komitmen penuh, dengan semua cabangnya, terlepas dari apakah pohon kerja telah dihapus.
VonC
Ya, tetapi jika cukup hapus pohon kerja dengan pergi ke folder itu di sistem saya dan hapus maka git tidak membiarkan saya checkout ke cabang itu dan mengatakan bahwa sudah checkout di <path> (<path> worktree path). Tetapi sepertinya jika saya melakukan hal berikut: rm -rf <path> git worktree prune maka ia berfungsi. Apakah itu benar ?
Randeep Singh
1
@ Jay Terima kasih. Saya telah membuatnya lebih jelas bahwa 2.5 dan 2.7 sekarang keluar.
VonC
113

The gitdistribusi dilengkapi dengan script kontribusi disebut git-new-workdir. Anda akan menggunakannya sebagai berikut:

git-new-workdir project-dir new-workdir branch

di mana project-dir adalah nama direktori yang berisi .gitrepositori Anda . Script ini membuat yang lain.git direktori dengan banyak symlink ke yang asli kecuali untuk file yang tidak dapat dibagi (seperti cabang saat ini), memungkinkan Anda untuk bekerja di dua cabang yang berbeda.

Kedengarannya agak rapuh, tapi itu pilihan.

adl
sumber
3
+1 Saya berdiri dikoreksi, ini cukup mengagumkan. Tampaknya untuk langsung berbagi riwayat dan cabang antara dua repositori yang berbeda diperiksa tanpa mendorong / menarik, hanya symlinking. Saya benar-benar tidak menyadari bahwa git dapat menangani ini. Sayangnya, itu tidak termasuk dalam distribusi saya.
meagar
2
Bagi mereka yang menggunakan msysgit (windows), Anda dapat menggunakan versi script yang porting ini: github.com/joero74/git-new-workdir
amos
9
Biasanya berfungsi dengan baik, tetapi jika Anda secara tidak sengaja mengedit cabang yang sama di lokasi yang berbeda, itu tidak penting untuk memperbaikinya kembali.
grep
Bagi mereka yang terjebak di Git <2.5 dan yang memiliki submodula, cobalah git-new-workdir-recursiveyang merupakan pembungkus git-new-workdir.
Walf
13

Saya menemukan pertanyaan ini berharap untuk solusi yang tidak saya temukan di sini. Jadi sekarang bahwa saya tidak menemukan apa yang saya butuhkan, saya memutuskan untuk posting di sini untuk orang lain.

Peringatan: Ini mungkin bukan solusi yang baik jika Anda perlu mengedit beberapa cabang secara bersamaan, seperti status OP. Hal ini karena memiliki beberapa cabang diperiksa secara bersamaan bahwa Anda tidak ingin mengedit. (Beberapa direktori kerja didukung oleh satu folder .git.)

Ada beberapa hal yang saya pelajari sejak saya datang ke pertanyaan ini pertama kali:

  1. Apa itu " repositori kosong ". Ini pada dasarnya adalah isi .gitdirektori, tanpa terletak di pohon yang berfungsi.

  2. Fakta bahwa Anda dapat menentukan lokasi repo yang Anda gunakan (lokasi .gitdir Anda ) pada baris perintah dengan gitopsi--git-dir=

  3. Fakta bahwa Anda dapat menentukan lokasi copy pekerjaan Anda --work-tree=

  4. Apa "mirror repo" itu.

Yang terakhir ini adalah perbedaan yang cukup penting. Saya sebenarnya tidak ingin mengerjakan repo, saya hanya perlu memiliki salinan cabang dan / atau tag yang berbeda diperiksa secara bersamaan. Pada kenyataannya, saya perlu menjamin bahwa cabang-cabang tidak berakhir berbeda dari cabang-cabang remote saya. Jadi cermin sangat cocok untuk saya.

Jadi untuk kasus penggunaan saya , saya mendapatkan apa yang saya butuhkan dengan melakukan:

git clone --mirror <remoteurl> <localgitdir> # Where localgitdir doesn't exist yet
mkdir firstcopy
mkdir secondcopy
git --git-dir=<localgitdir> --work-tree=firstcopy checkout -f branch1
git --git-dir=<localgitdir> --work-tree=secondcopy checkout -f branch2

Peringatan besar tentang ini adalah bahwa tidak ada KEPALA terpisah untuk dua salinan. Jadi setelah hal di atas, menjalankan git --git-dir=<localgitdir> --work-tree=firstcopy statusakan menunjukkan semua perbedaan dari branch2 ke branch1 sebagai perubahan yang tidak dikomit - karena HEAD menunjuk ke branch2. (Itu sebabnya saya menggunakan -fopsi untuk checkout, karena saya tidak benar-benar berencana untuk melakukan perubahan secara lokal sama sekali. Saya dapat mengecek semua tag atau cabang untuk pohon-kerja apa saja, selama saya menggunakan-f opsi itu.)

Untuk kasus penggunaan saya memiliki beberapa checkout bersama di komputer yang sama tanpa perlu mengeditnya , ini berfungsi dengan sempurna. Saya tidak tahu apakah ada cara untuk memiliki beberapa KEPALA untuk beberapa pohon kerja tanpa script seperti yang tercakup dalam jawaban lain, tapi saya harap ini membantu orang lain.

Wildcard
sumber
Ini persis apa yang saya cari, tetapi saya tidak bisa membuatnya berfungsi ... Saya menjadi "fatal: Bukan repositori git: '<localgitdir>'". Ada ide?
Dan R
Nevermind, ternyata saya menggunakan "~" pada nama direktori saya, dan git tidak menyukainya. Ketika saya menggunakan path lengkap, itu bekerja dengan baik.
Dan R
@DanR, senang itu membantu. :) Anda mungkin juga menggunakan $HOME. Ada satu peringatan lain tentang metode di atas yang saya temukan nanti, yang berkaitan dengan file yang tidak ada di satu atau cabang lain. Jika Anda checkout A ke dir1, lalu checkout B ke dir2, lalu memaksa checkout C ke dir1, jika ada file yang ada di A tetapi tidak di B atau C, file tidak akan dihapus dari dir1 bahkan oleh force checkout . Jadi Anda mungkin perlu bereksperimen dengan git cleankasus seperti itu — atau melakukan apa yang saya lakukan, dan cukup gunakan metode ini untuk mengisi direktori yang baru dibuat.
Wildcard
Terima kasih atas tipnya. Saya akan membungkus ini sebagai bagian dari alat CLI di ruby, jadi saya akan memastikan itu selalu dimulai dari awal.
Dan R
@DanR, Anda mungkin tertarik melihat kode yang saya tulis saat itu . Sebagian besar umumnya berlaku untuk skrip pementasan git apa pun, dengan pengecualian dari sintaks CFEngine. (Mungkin Anda bisa menggantinya dengan pemeriksaan sintaks Ruby.) :)
Wildcard
3

Satu-satunya solusi yang dapat saya pikirkan adalah mengkloning dua direktori dan menambahkannya sebagai repositori jarak jauh satu sama lain. Anda kemudian dapat terus menarik barang-barang dari yang diubah ke yang lain tanpa benar-benar mendorong apa pun ke repositori jarak jauh.

Saya berasumsi Anda ingin memiliki dua direktori yang berfungsi dan bukan dua klon remote karena Anda tidak ingin mendorong beberapa cabang ke remote. Jika tidak, dua klon remote Anda akan berfungsi dengan baik - Anda hanya perlu melakukan beberapa dorongan dan tarikan untuk menjaga ketiganya tetap sinkron.

vhallac
sumber
Hai. Pria di atas membagikan solusi keren, perintah git worktree . Ini berfungsi lebih baik daripada mengkloning beberapa kali repositori yang sama. Cobalah, Anda akan menyukai fitur baru ini.