Pertanyaan yang terkadang muncul adalah cara terbaik untuk menentukan daftar perubahan yang terakhir kali Anda sinkronkan di Perforce. Ini sering kali diperlukan untuk hal-hal seperti memasukkan nomor daftar perubahan ke dalam info revisi oleh sistem build otomatis.
117
p4 changes | head -1
tampaknya lebih mudah daripada kebanyakan solusi ini.Jawaban:
Saya merekomendasikan sebaliknya untuk sistem build otomatis: Anda harus terlebih dahulu mendapatkan daftar perubahan terbaru dari server menggunakan:
lalu sinkronkan ke perubahan itu dan catat di info revisi. Alasannya adalah sebagai berikut. Meskipun Perforce merekomendasikan hal berikut untuk menentukan daftar perubahan tempat ruang kerja disinkronkan:
mereka mencatat beberapa gotcha:
dan ada tambahan gotcha yang tidak mereka sebutkan:
Jika Anda harus menyinkronkan terlebih dahulu dan merekam nanti, Perforce merekomendasikan untuk menjalankan perintah berikut untuk menentukan apakah Anda telah digigit oleh gotcha di atas; itu harus menunjukkan tidak ada yang disinkronkan atau dihapus:
sumber
#have
alih-alih@clientname
, yang menyelamatkan Anda dari keharusan mencari nama ruang kerja klien Anda.Hanya untuk menjawab ini sendiri sesuai dengan saran Jeff untuk menggunakan Stackoverflow sebagai tempat menyimpan cuplikan teknis ....
Dari penggunaan baris perintah:
Dan ganti saja spek klien dengan nama anda. Ini akan menghasilkan keluaran berupa:
Yang mudah diurai untuk mengekstrak nomor daftar perubahan.
sumber
Anda dapat mencoba mencari jumlah perubahan maksimum dalam output dari perintah "file p4". Namun, direktori kerja tidak boleh berisi komit pasca-sinkronisasi. Ini hanya sedikit lebih baik dari
karena yang terakhir tampaknya berjalan di server dan mungkin gagal di struktur sumber yang besar karena batas "MaxResults".
di mana p4lastchange.py didasarkan pada kode dari presentasi Using P4G.py Dari Baris Perintah oleh JTGoldstone, Kodak Information Network / Ofoto, 15 April 2005.
sumber
Jika Anda menggunakan P4V, Anda dapat melakukan ini secara grafis:
sumber
p4 changes -m1 @clientname
yang merupakan cara "disarankan" untuk melakukannya untuk klien saya membutuhkan waktu sekitar 10 menitini yang saya gunakan:
untuk klien yang sama membutuhkan 2,1 detik
sumber
p4 changes -m1 @clientname
berjalan tanpa henti ...p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
benar-benar berfungsi! Terima kasih!Anda juga bisa menggunakan perintah cstat:
p4 membantu cstat
sumber
Untuk build yang serius (yang sedang disiapkan untuk pengujian), tentukan secara eksplisit nomor daftar perubahan atau label yang diinginkan, sinkronkan ke label, dan tanamkan dalam artefak build.
Jika daftar perubahan (atau label) tidak diberikan, gunakan
p4 counter change
untuk mendapatkan nomor perubahan saat ini, dan catat. Tetapi Anda masih perlu menyinkronkan semuanya menggunakan nomor perubahan itu.Saya tidak berpikir Anda dapat mencapai apa yang Anda inginkan, karena secara umum, seluruh ruang kerja tidak disinkronkan ke nomor daftar perubahan tertentu. Seseorang dapat secara eksplisit menyinkronkan beberapa file ke revisi lama, dan kemudian nomor daftar perubahan tunggal tidak ada artinya. Itu sebabnya segar
sync
itu, diperlukan perubahan baru untuk memastikan bahwa satu nomor daftar perubahan secara akurat mewakili versi kode.Mengenai komentar: Ya, jawaban saya dimaksudkan untuk digunakan oleh manajer konfigurasi yang mempersiapkan build untuk diberikan kepada QA. Pengembang kami biasanya tidak menyinkronkan sebagai bagian dari build; mereka melakukan build sebelum dikirim — sehingga mereka dapat memastikan perubahan mereka tidak merusak build atau pengujian. Dalam konteks itu, kami tidak repot-repot menyematkan label repositori.
Dengan pendekatan Anda, Anda membuat asumsi bahwa seluruh ruang kerja Anda telah disinkronkan ke head pada saat pengiriman daftar perubahan terakhir Anda, dan daftar perubahan tersebut menyertakan semua file terbuka Anda. Terlalu mudah untuk salah dalam asumsi tersebut, sulit untuk dideteksi, dan sangat mahal dalam hal waktu yang hilang. Di sisi lain, memecahkan masalah itu mudah, tanpa kekurangan. Dan karena nomor daftar perubahan dapat ditentukan secara eksplisit, tidak masalah revisi apa yang Anda butuhkan atau seberapa cepat basis kode berubah.
sumber
Untuk seluruh depot (bukan hanya ruang kerja / klien Anda)
melakukan pekerjaan, hanya memberi tahu daftar perubahan terakhir.
sumber
Hal terbaik yang saya temukan sejauh ini adalah melakukan sinkronisasi ke daftar perubahan apa pun yang ingin Anda buat, lalu gunakan perubahan -m1 //...#have untuk mendapatkan daftar perubahan lokal saat ini (revisi).
p4 sync @CHANGELIST_NUM p4 perubahan -m1 //...#have | awk '{print $ 2}'
Memberi Anda nomor daftar perubahan yang dapat Anda gunakan di mana pun Anda inginkan. Saat ini saya mencari cara yang lebih sederhana daripada perubahan p4 -m1 //...#have.
sumber
Saya tidak yakin apakah Anda mendapatkan jawaban yang Anda butuhkan tetapi saya memiliki masalah serupa. Tujuannya adalah untuk menulis di logger kami versi spesifik dari proyek tersebut. Masalahnya adalah saat kami membuat makefile sendiri, keseluruhan sistem build dikontrol oleh manajemen konfigurasi kami. Ini berarti bahwa semua solusi yang mengatakan "sinkronkan ke sesuatu lalu lakukan sesuatu" tidak benar-benar berfungsi dan saya tidak ingin mengubah versinya secara manual setiap kali kita melakukan (sumber kesalahan yang pasti). Solusinya (yang sebenarnya diisyaratkan dalam beberapa jawaban di atas) adalah ini: di makefile kami, saya melakukan perubahan p4 -m1 "./...#have" Hasilnya adalah Ubah change_number pada tanggal oleh pengguna @ klien ' pesan Saya cukup membuat pesan menjadi string yang dicetak oleh logger (nomor perubahan adalah elemen penting tetapi yang lain juga berguna untuk segera memutuskan apakah versi tertentu berisi perubahan yang Anda tahu Anda buat sendiri tanpa harus memeriksanya). Semoga ini membantu.
sumber