Ini sesuatu yang saya kerjakan selama beberapa minggu terakhir. Ini masih berkembang, tetapi mungkin bermanfaat. Harap dicatat saya seorang karyawan Perforce.
Pengantar Perforce untuk pengguna Git
Mengatakan bahwa pindah dari Git ke Perforce atau dari Perforce ke Git adalah hal yang tidak sepele adalah pernyataan yang meremehkan. Karena menjadi dua alat yang seolah-olah melakukan hal yang sama, pendekatan mereka tidak bisa lebih berbeda. Artikel singkat ini akan mencoba membantu pengguna Perforce baru yang datang dari Git memahami dunia baru mereka.
Satu jalan memutar singkat sebelum kita menyelam; jika Anda lebih suka Git, Anda bisa menggunakan Git dengan Perforce dengan cukup baik. Kami menyediakan alat yang disebut Git Fusion yang menghasilkan repositori Git yang disinkronkan dengan server Perforce. Orang-orang Git dan Perforce dapat hidup dalam harmoni bekerja dengan kode yang sama, sebagian besar tidak terpengaruh oleh pilihan kontrol versi rekan kerja mereka. Git Fusions 13.3 tersedia dari situs web Perforce . Memang perlu diinstal oleh administrator Perforce, tetapi jika Anda menginstalnya Anda akan menemukan bahwa fitur slicing repository-nya bisa sangat berguna sebagai pengguna Git.
Jika Anda tidak dapat meyakinkan admin Anda untuk menginstal Git Fusion, Git sendiri dilengkapi dengan Perforce binding yang disebut Git-P4 yang memungkinkan Anda menggunakan Git untuk mengubah dan mengirimkan file di ruang kerja Perforce. Informasi lebih lanjut tentang itu dapat ditemukan di: https://git.wiki.kernel.org/index.php/GitP4
Masih di sini? Bagus, mari kita lihat Perforce.
Beberapa Perbedaan Terminologi untuk Diurutkan
Sebelum kita masuk ke perincian, kita perlu membahas secara singkat perbedaan terminologi pasangan antara Git dan Perforce.
Yang pertama adalah checkout . Di Git, inilah cara Anda mendapatkan salinan kode dari cabang tertentu ke area kerja Anda. Di Perforce kami menyebutnya sinkronisasi dari baris perintah atau dari GUI P4V kami "Dapatkan Revisi Terbaru". Perforce menggunakan kata checkout dari P4V atau p4 edit
dari baris perintah yang berarti bahwa Anda berencana untuk mengubah file dari sistem kontrol versi. Di sisa dokumen ini, saya akan menggunakan checkout dalam arti kata Perforce.
Yang kedua adalah Git commit versus Perforce submit . Di mana Anda akan melakukan di Git, Anda akan mengirimkan di Perforce. Menjadi bahwa semua operasi terjadi terhadap layanan versi Perforce bersama, Perforce tidak memiliki yang setara untuk git push
. Demikian juga kita tidak punya pull
; perintah sinkronisasi dari atas menangani mendapatkan file untuk kami. Tidak ada konsep pengiriman lokal murni di Perforce kecuali Anda memilih untuk menggunakan alat P4Sandbox kami yang dijelaskan secara singkat di bawah ini.
Konsep Kunci dalam Perforce
Jika saya harus menyederhanakan Perforce menjadi dua konsep utama saya akan fokus pada depot dan ruang kerja. Depot Perforce adalah repositori file yang hidup di server Perforce. Server Perforce dapat memiliki sejumlah depot dan setiap depot dapat berisi sejumlah file. Seringkali Anda akan mendengar pengguna Perforce menggunakan depot dan server secara bergantian, tetapi mereka berbeda. Situs Perforce dapat memilih untuk memiliki beberapa server, tetapi umumnya semua file berada dalam satu server.
Ruang kerja atau klien Perforce adalah objek dalam sistem yang memetakan set file di server Perforce ke lokasi di sistem file pengguna. Setiap pengguna memiliki ruang kerja untuk setiap mesin yang mereka gunakan, dan seringkali pengguna akan memiliki lebih dari satu ruang kerja untuk mesin yang sama. Bagian terpenting dari ruang kerja adalah pemetaan atau tampilan ruang kerja.
Tampilan ruang kerja menentukan set file di depot yang harus dipetakan ke mesin lokal. Ini penting karena ada peluang bagus bahwa Anda tidak ingin semua file yang tersedia di server. Tampilan ruang kerja memungkinkan Anda memilih hanya set yang Anda pedulikan. Penting untuk dicatat bahwa ruang kerja dapat memetakan konten dari beberapa depo, tetapi hanya dapat memetakan konten dari satu server.
Untuk membandingkan Perforce dengan Git dalam hal ini, dengan Git Anda memilih dan memilih serangkaian repositori Git yang Anda minati. Setiap repo umumnya tertutup rapat berisi hanya file-file terkait. Keuntungan dari ini adalah tidak ada konfigurasi untuk dilakukan di pihak Anda; Anda melakukan klon git dari hal-hal yang Anda pedulikan dan Anda selesai. Ini sangat baik jika Anda hanya bekerja dengan satu atau dua repositori. Dengan Perforce Anda harus menghabiskan sedikit waktu memetik dan memilih bit kode yang Anda inginkan.
Banyak toko Perforce menggunakan aliran yang dapat secara otomatis menghasilkan tampilan ruang kerja, atau mereka menghasilkan tampilan menggunakan skrip atau ruang kerja templat. Banyak yang meninggalkan pengguna mereka untuk menghasilkan ruang kerja mereka sendiri. Salah satu keuntungan bisa memetakan sejumlah modul dalam satu ruang kerja adalah Anda dapat dengan mudah memodifikasi beberapa modul kode dalam satu checkin; Anda dapat dijamin bahwa siapa pun yang memiliki tampilan klien serupa yang menyinkronkan checkin Anda akan memiliki semua kode dalam keadaan yang benar. Ini juga dapat menyebabkan kode terlalu tergantung; pemisahan paksa Git dapat menyebabkan modularitas yang lebih baik. Untungnya Perforce juga dapat mendukung modularitas yang ketat juga. Ini semua pertanyaan tentang bagaimana Anda memilih untuk menggunakan alat ini.
Mengapa ruang kerja?
Saya pikir dengan datang dari Git mudah untuk merasa seperti seluruh konsep ruang kerja jauh lebih banyak masalah daripada nilainya. Dibandingkan dengan kloning beberapa repositori Git, ini tidak diragukan lagi benar. Di mana ruang kerja bersinar, dan alasan Perforce masih dalam bisnis setelah bertahun-tahun ini, adalah bahwa ruang kerja adalah cara yang fantastis untuk memangkas jutaan proyek file untuk pengembang sambil tetap membuatnya mudah untuk dibuat dan dirilis untuk menarik semua sumber dari satu sumber otoritatif. Ruang kerja adalah salah satu alasan utama mengapa Perforce dapat berskala sebaik itu.
Ruang kerja juga bagus karena tata letak file di depot dan tata letak pada mesin pengguna dapat bervariasi jika perlu. Banyak perusahaan mengatur depot mereka untuk mencerminkan organisasi perusahaan mereka sehingga mudah bagi orang untuk menemukan konten berdasarkan unit bisnis atau proyek. Namun sistem build mereka tidak peduli tentang hierarki ini; ruang kerja memungkinkan mereka untuk memetakan ulang hierarki depot mereka dengan cara apa pun yang masuk akal untuk alat mereka. Saya juga telah melihat ini digunakan oleh perusahaan yang menggunakan sistem build yang sangat tidak fleksibel yang memerlukan kode untuk berada dalam konfigurasi yang sangat spesifik yang benar-benar membingungkan manusia. Ruang kerja memungkinkan perusahaan-perusahaan ini untuk memiliki hierarki sumber yang dapat dinavigasi oleh manusia sementara alat bangun mereka mendapatkan struktur yang mereka butuhkan.
Ruang kerja di Perforce tidak hanya digunakan untuk memetakan set file yang ingin dikerjakan pengguna, tetapi mereka juga digunakan oleh server untuk melacak dengan tepat revisi dari setiap file yang telah disinkronkan pengguna. Ini memungkinkan sistem untuk mengirim set file yang benar ke pengguna ketika menyinkronkan tanpa harus memindai file untuk melihat file mana yang perlu diperbarui. Dengan sejumlah besar data, ini bisa menjadi kemenangan kinerja yang cukup besar. Ini juga sangat populer di industri yang memiliki aturan audit yang sangat ketat; Admin Perforce dapat dengan mudah melacak dan mencatat pengembang mana yang telah menyinkronkan file mana.
Untuk informasi lebih lanjut tentang kekuatan penuh ruang kerja Perforce, baca Mengkonfigurasi P4 .
Checkout Eksplisit vs. Checkout Implisit
Salah satu tantangan terbesar bagi pengguna yang pindah dari Git ke Perforce adalah konsep checkout eksplisit. Jika Anda terbiasa dengan alur kerja Git / SVN / CVS mengubah file dan kemudian memberitahu sistem kontrol versi untuk mencari apa yang telah Anda lakukan, itu bisa menjadi transisi yang sangat menyakitkan.
Berita baiknya adalah jika Anda memilihnya, Anda dapat bekerja dengan alur kerja gaya Git di Perforce. Di Perforce Anda dapat mengatur opsi "allwrite" di ruang kerja Anda. Ini akan memberi tahu Perforce bahwa semua file harus ditulis ke disk dengan set bit yang dapat ditulis. Anda kemudian dapat mengubah file apa pun yang Anda inginkan tanpa secara tegas memberi tahu Perforce. Agar Perforce merekonsiliasi perubahan yang Anda buat, Anda dapat menjalankan "status p4". Ini akan membuka file untuk menambah, mengedit, dan menghapus yang sesuai. Saat bekerja dengan cara ini, Anda ingin menggunakan "pembaruan p4" alih-alih "sinkronisasi p4" untuk mendapatkan revisi baru dari server; "pembaruan p4" memeriksa perubahan sebelum disinkronkan sehingga tidak akan mengganggu perubahan lokal Anda jika Anda belum menjalankan "status p4".
Mengapa Checkout Eksplisit?
Pertanyaan yang sering saya terima adalah "mengapa Anda ingin menggunakan checkout eksplisit?" Awalnya dapat memerah tampaknya menjadi keputusan desain gila, tetapi checkout eksplisit memang memiliki beberapa manfaat yang kuat.
Salah satu alasan untuk menggunakan checkout eksplisit adalah menghilangkan kebutuhan untuk memindai file untuk perubahan konten. Sementara dengan proyek yang lebih kecil menghitung hash untuk setiap file untuk menemukan perbedaan cukup murah, banyak pengguna kami memiliki jutaan file di ruang kerja dan / atau memiliki file yang berukuran 100 megabita, jika tidak lebih besar. Menghitung semua hash dalam kasus tersebut sangat memakan waktu. Checkout eksplisit memungkinkan Perforce tahu persis file mana yang perlu bekerja dengannya. Perilaku ini adalah salah satu alasan Perforce sangat populer di industri file besar seperti game, film, dan industri perangkat keras.
Manfaat lain adalah checkout eksplisit menyediakan bentuk komunikasi asinkron yang memungkinkan pengembang tahu secara umum apa yang sedang dikerjakan rekan-rekan mereka, atau setidaknya di mana. Ini dapat memberi tahu Anda bahwa Anda mungkin ingin menghindari bekerja di area tertentu untuk menghindari konflik yang tidak perlu, atau dapat mengingatkan Anda pada fakta bahwa pengembang baru dalam tim telah berkeliaran ke dalam kode yang mungkin tidak mereka perlukan untuk mengedit. Pengalaman pribadi saya adalah bahwa saya cenderung bekerja di Git atau menggunakan Perforce dengan allwrite pada proyek-proyek di mana saya menjadi satu-satunya kontributor atau kontributor yang jarang, dan checkout eksplisit ketika saya bekerja erat dengan sebuah tim. Untungnya pilihan ada di tangan Anda.
Checkout eksplisit juga bermain baik dengan konsep Perforce daftar perubahan tertunda. Daftar perubahan yang tertunda adalah ember tempat Anda dapat memasukkan file terbuka untuk mengatur pekerjaan Anda. Di Git Anda berpotensi menggunakan cabang berbeda sebagai ember untuk mengorganisir pekerjaan. Cabang memang bagus, tapi terkadang menyenangkan untuk mengatur pekerjaan Anda menjadi beberapa perubahan bernama sebelum benar-benar mengirimkan ke server. Dengan model Perforce yang berpotensi memetakan banyak cabang atau beberapa proyek ke dalam satu ruang kerja, daftar perubahan yang tertunda membuatnya mudah untuk menjaga perubahan yang terpisah terorganisir.
Jika Anda menggunakan IDE untuk pengembangan seperti Visual Studio atau Eclipse, saya sangat menyarankan untuk menginstal plugin Perforce untuk IDE Anda. Sebagian besar plugin IDE akan secara otomatis checkout file ketika Anda mulai mengeditnya, membebaskan Anda dari keharusan melakukan checkout sendiri.
Ganti Perforce Untuk Fitur Git
git stash
==> p4 shelve
- git cabang lokal ==> baik rak Perforce atau cabang tugas
git blame
==> p4 annotate
atau Perforce Timelapse View dari GUI
Bekerja Terputus
Ada dua opsi untuk bekerja yang terputus dari layanan versi Perforce (itulah istilah umum kami untuk server Perforce).
1) Gunakan P4Sandbox untuk memiliki versi lokal lengkap dan percabangan lokal
2) Edit file sesuka Anda dan gunakan 'status p4' untuk memberi tahu Perforce apa yang telah Anda lakukan
Dengan kedua opsi di atas, Anda dapat memilih untuk menggunakan pengaturan "allwrite" di ruang kerja Anda sehingga Anda tidak perlu membuka kunci file. Saat bekerja dalam mode ini, Anda akan ingin menggunakan perintah "pembaruan p4" untuk menyinkronkan file baru alih-alih "sinkronisasi p4". "pembaruan p4" akan memeriksa perubahan file sebelum menyinkronkannya.
Mulai Cepat Paksa
Semua contoh berikut akan melalui baris perintah.
1) Konfigurasikan koneksi Anda ke Perforce
export P4USER=matt
export P4CLIENT=demo-workspace
export P4PORT=perforce:1666
Anda dapat menempel pengaturan ini di file konfigurasi shell Anda, gunakan p4 set
untuk menyimpannya di Windows dan OS X, atau menggunakan file konfigurasi Perforce.
1) Buat ruang kerja
p4 workspace
# set your root to where your files should live:
Root: /Users/matt/work
# in the resulting editor change your view to map the depot files you care about
//depot/main/... //demo-workspace/main/...
//depot/dev/... //demo-workspace/dev/...
2) Dapatkan file dari server
cd /Users/matt/work
p4 sync
3) Periksa file yang ingin Anda kerjakan dan modifikasi
p4 edit main/foo;
echo cake >> main/foo
4) Kirim ke server
p4 submit -d "A trivial edit"
5) Jalankan p4 help simple
untuk melihat perintah dasar yang Anda perlukan untuk bekerja dengan Perforce.
Perbedaan terbesar antara git dan p4, yang tidak dijawab oleh jawaban yang ada, adalah bahwa mereka menggunakan unit abstraksi yang berbeda.
diff
antara keadaan sebelumnya dan saat ini dari file yang sedang dikomit.Segala sesuatu yang lain mengalir dari perbedaan ini . Bercabang dan menggabungkan dalam git tidak menyakitkan karena, dari perspektif abstraksi git, setiap file dapat direkonstruksi sepenuhnya dengan menerapkan satu set tambalan secara berurutan, dan oleh karena itu untuk menggabungkan dua cabang, Anda hanya perlu menerapkan semua tambalan pada cabang sumber yang tidak ada di cabang target ke cabang target dalam urutan yang benar (dengan asumsi tidak ada tambalan di kedua cabang yang tumpang tindih).
Cabang Perforce berbeda. Operasi cabang di perforce akan menyalin file dari satu subfolder ke yang lain, dan kemudian menandai keterkaitan antara file dengan metadata di server. Untuk menggabungkan file dari satu cabang ke cabang lainnya (
integration
dalam istilah perforce), perforce akan melihat konten lengkap file di 'kepala' di cabang sumber dan konten lengkap file di kepala cabang target dan jika perlu bergabung menggunakan leluhur yang sama. Ia tidak dapat menerapkan tambalan satu per satu seperti git can, yang berarti penggabungan manual lebih sering terjadi (dan cenderung lebih menyakitkan).sumber
Mungkin tidak ada banyak dokumentasi seperti itu karena Perforce adalah sistem kontrol revisi yang cukup tradisional (lebih dekat ke CVS, Subversion, dll.) Dan biasanya dianggap kurang rumit daripada sistem kontrol revisi yang didistribusikan modern.
Mencoba memetakan perintah dari satu ke yang lain bukanlah pendekatan yang tepat; konsep dari sistem kontrol revisi terpusat vs terdistribusi tidak sama. Sebagai gantinya, saya akan menjelaskan alur kerja khas di Perforce:
p4 edit
pada setiap file yang ingin Anda edit. Anda perlu memberi tahu Perforce file mana yang sedang Anda edit. Jika Anda menambahkan file baru, gunakanp4 add
. Jika Anda menghapus file, gunakanp4 delete
.p4 change
untuk membuat perubahan. Di sini Anda dapat membuat deskripsi tentang perubahan Anda dan secara opsional menambahkan atau menghapus file dari perubahan Anda juga. Anda dapat menjalankanp4 change CHANGE_NUMBER
untuk mengedit deskripsi nanti jika perlu.p4 {add,edit,delete} -c CHANGE_NUMBER FILE
.p4 sync
untuk menarik perubahan terbaru dari server.p4 resolve
untuk menyelesaikan konflik apa pun dari sinkronisasi.p4 submit -c CHANGE_NUMBER
.Anda dapat menggunakan
p4 revert
untuk mengembalikan perubahan Anda ke file.Perhatikan bahwa Anda dapat mengerjakan beberapa perubahan secara bersamaan selama tidak ada file yang tumpang tindih. (File di klien Perforce Anda dapat dibuka hanya dalam satu perubahan pada satu waktu.) Ini kadang-kadang bisa nyaman jika Anda memiliki perubahan kecil dan independen.
Jika Anda merasa perlu mengedit file yang sudah Anda buka di set perubahan lain, Anda bisa membuat klien Perforce terpisah atau Anda dapat menyimpan perubahan yang ada untuk nanti melalui
p4 shelve
. (Tidak sepertigit stash
rak tidak mengembalikan file di pohon lokal Anda, jadi Anda harus mengembalikannya secara terpisah.)sumber
git
, dan mereka telah melakukannya selama bertahun-tahun.