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?
git-new-workdir
akan diganti olehgit checkout --to=<path>
di Git 2.5. Lihat jawaban saya di bawah inigit worktree add <path> [<branch>]
(Git 2.5 rc2). Lihat jawaban saya yang diedit di bawahJawaban:
Git 2.5 mengusulkan sejak Juli 2015 pengganti untuk
contrib/workdir/git-new-workdir
: git worktreeLihat commit 68a2e6a oleh Junio C Hamano (
gitster
) .Catatan rilis menyebutkan :
Lihat komit 799767cc9 (Git 2.5rc2)
Itu berarti Anda sekarang dapat melakukan
git worktree add <path> [<branch>]
Peringatan: masih ada bagian
git worktree
"BUGS" yang harus diperhatikan.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)Misalnya:
Catatan: jika Anda Pindah folder folder kerja, Anda perlu memperbarui secara manual
gitdir
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:
Hati-hati saat menghapus cabang: sebelum git 2.9 (Juni 2016), Anda bisa menghapus satu yang digunakan di pohon 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)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)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 2.13 (Q2 2017) menambahkan
lock
opsi 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)Begitu
git worktree add' --lock
juga dengangit worktree lock
aftergit 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
--quiet
opsi " " 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)Perhatikan bahwa "
git worktree add
" dulu melakukan "menemukan nama yang tersedia dengan stat dan kemudianmkdir
", yang rawan ras.Ini telah diperbaiki dengan Git 2.22 (Q2 2019) dengan menggunakan
mkdir
dan 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)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)sumber
The
git
distribusi dilengkapi dengan script kontribusi disebutgit-new-workdir
. Anda akan menggunakannya sebagai berikut:di mana project-dir adalah nama direktori yang berisi
.git
repositori 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.
sumber
git-new-workdir-recursive
yang merupakan pembungkusgit-new-workdir
.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:
Apa itu " repositori kosong ". Ini pada dasarnya adalah isi
.git
direktori, tanpa terletak di pohon yang berfungsi.Fakta bahwa Anda dapat menentukan lokasi repo yang Anda gunakan (lokasi
.git
dir Anda ) pada baris perintah dengangit
opsi--git-dir=
Fakta bahwa Anda dapat menentukan lokasi copy pekerjaan Anda
--work-tree=
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:
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 status
akan menunjukkan semua perbedaan dari branch2 ke branch1 sebagai perubahan yang tidak dikomit - karena HEAD menunjuk ke branch2. (Itu sebabnya saya menggunakan-f
opsi untukcheckout
, 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.
sumber
$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 dengangit clean
kasus seperti itu — atau melakukan apa yang saya lakukan, dan cukup gunakan metode ini untuk mengisi direktori yang baru dibuat.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.
sumber