Menentukan daftar perubahan terakhir yang disinkronkan di Perforce


117

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.


p4 changes | head -1tampaknya lebih mudah daripada kebanyakan solusi ini.
Sridhar Sarnobat

Jawaban:


91

Saya merekomendasikan sebaliknya untuk sistem build otomatis: Anda harus terlebih dahulu mendapatkan daftar perubahan terbaru dari server menggunakan:

p4 changes -s submitted -m1

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:

p4 changes -m1 @clientname

mereka mencatat beberapa gotcha:

  • Ini hanya berfungsi jika Anda belum mengirimkan apa pun dari ruang kerja yang dimaksud.
  • Ada kemungkinan juga bahwa ruang kerja klien tidak disinkronkan ke daftar perubahan tertentu.

dan ada tambahan gotcha yang tidak mereka sebutkan:

  • Jika daftar perubahan tertinggi tempat terjadinya sinkronisasi benar-benar menghapus file dari ruang kerja, daftar perubahan tertinggi berikutnya akan dilaporkan (kecuali jika itu juga, file yang dihapus secara ketat).

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:

p4 sync -n @changelist_number

Mengapa "Ini hanya berfungsi jika Anda belum mengirimkan apa pun dari ruang kerja yang dimaksud."?
gdw2

Jika Anda mengirimkan perubahan, 'perubahan p4 -s terkirim -m1' akan mengembalikan nomor daftar perubahan Anda. Misalnya, Anda menyinkronkan ke daftar perubahan 5, tunggu beberapa jam lalu kirimkan daftar perubahan 10. Perintah perubahan di atas akan mengembalikan 10.
Rinn

Tautannya sudah mati, apakah itu artikel ini? jawaban.perforce.com/articles/KB/3458/
user31389

Perhatikan bahwa Anda dapat menggunakan #havealih-alih @clientname, yang menyelamatkan Anda dari keharusan mencari nama ruang kerja klien Anda.
yoyo

29

Hanya untuk menjawab ini sendiri sesuai dengan saran Jeff untuk menggunakan Stackoverflow sebagai tempat menyimpan cuplikan teknis ....

Dari penggunaan baris perintah:

p4 changes -m1 @<clientname>

Dan ganti saja spek klien dengan nama anda. Ini akan menghasilkan keluaran berupa:

Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'

Yang mudah diurai untuk mengekstrak nomor daftar perubahan.


Saya mendapatkan: Permintaan terlalu besar (lebih dari 1500000); lihat 'p4 help maxresults'.
pengguna674669

@ user674669: gunakan opsi -m1 yang hanya mengembalikan daftar perubahan terakhir (1)
panako

Ini memberikan informasi dari daftar perubahan yang terakhir dikirimkan , bukan daftar perubahan terakhir yang disinkronkan , yang ingin diketahui oleh op.
Andreas

@marsh Saya pikir itu sebenarnya nama ruang kerja klien, yang default ke nama komputer jika tidak disetel. Lihat di sini: P4CLIENT .
Andreas Haferburg

15

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

p4 changes -m1 "./...#have"

karena yang terakhir tampaknya berjalan di server dan mungkin gagal di struktur sumber yang besar karena batas "MaxResults".

$ p4 changes -m1 "./...#have"
Request too large (over 850000); see 'p4 help maxresults'.

$ p4 -G files "./...#have" | python c:/cygwin/usr/local/bin/p4lastchange.py
Files: 266948
2427657

di mana p4lastchange.py didasarkan pada kode dari presentasi Using P4G.py Dari Baris Perintah oleh JTGoldstone, Kodak Information Network / Ofoto, 15 April 2005.

#! /usr/bin/env python
import sys, os, marshal

if os.name == "nt":
    # Disable newline translation in Windows.  Other operating systems do not
    # translate file contents.
    import msvcrt
    msvcrt.setmode( sys.stdin.fileno(), os.O_BINARY )

lastcl = 0
num = 0
try:
    while 1:
        dict = marshal.load(sys.stdin)
        num = num + 1
        for key in dict.keys():
            # print "%s: %s" % (key,dict[key])
            if key == "change":
                cl = int(dict[key])
                if cl > lastcl:
                    lastcl = cl
except EOFError:
    pass
print "Files: %s" % num
print lastcl

10

Jika Anda menggunakan P4V, Anda dapat melakukan ini secara grafis:

  • Pada tab Dashboard (View-> Dashboard) pilih folder dan Anda akan melihat daftar changelist yang foldernya belum diperbarui. Catat angka terendah (di baris tertinggi).
  • Pastikan bahwa di Pohon Ruang Kerja Anda telah memilih folder yang sama seperti sebelumnya di Dasbor. Lalu pergi ke tab History (View-> History) dan gulir ke bawah ke nomor yang dicatat sebelumnya. Angka di bawah angka itu adalah nomor daftar perubahan Anda saat ini.

9

p4 changes -m1 @clientname yang merupakan cara "disarankan" untuk melakukannya untuk klien saya membutuhkan waktu sekitar 10 menit

ini yang saya gunakan:

p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'

untuk klien yang sama membutuhkan 2,1 detik


Apa nama klien? Bagaimana saya dapat menemukan informasi ini?
rawa

1
Nama @marsh client (atau juga ruang kerja) adalah nama objek perforce yang menyimpan pemetaan dari depo server ke sistem file lokal Anda
GSF

2
Meningkatkan jawaban ini, karena ini menjawab pertanyaan sebenarnya daripada mengatakan "jangan lakukan itu" (yang merupakan poin yang valid, tetapi tidak menjawab pertanyaan).
sam hocevar

1
p4 changes -m1 @clientnameberjalan tanpa henti ... p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'benar-benar berfungsi! Terima kasih!
simomo

@gsf - terima kasih, baru saja mencobanya di komputer Linux saya dan berhasil!

8

Anda juga bisa menggunakan perintah cstat:

p4 membantu cstat

cstat -- Dump change/sync status for current client

p4 cstat [files...]

Lists changes that are needed, had or partially synced in the current
client. The output is returned in tagged format, similar to the fstat
command.

The fields that cstat displays are:

    change   changelist number
    status   'have', 'need' or 'partial'

5

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 changeuntuk 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 segarsync 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.


Erickson - saran yang bagus, tetapi saya pikir ini mencakup situasi yang sedikit berbeda dari jawaban yang saya berikan. Penghitung pasti akan bekerja jika Anda cenderung hanya memiliki revisi kepala, dan server tidak cukup sibuk sehingga seseorang, mungkin bekerja pada proyek lain, tidak akan melakukan pengiriman antara sinkronisasi dan memanggil penghitung p4. Jadi menurut saya saran Anda mungkin paling baik ketika sistem build melakukan tarikan yang berbeda kemudian membangun. Jawaban saya mencakup kasus-kasus di mana sinkronisasi dapat dipisahkan pada waktunya dari build. Keduanya valid tergantung pada keadaan menurut saya.
Greg Whitfield

3

Untuk seluruh depot (bukan hanya ruang kerja / klien Anda)

p4 counter change

melakukan pekerjaan, hanya memberi tahu daftar perubahan terakhir.


2
Perhatikan bahwa ini melaporkan jumlah daftar perubahan depot terbaru, TERMASUK daftar perubahan yang menunggu keputusan (yaitu yang belum dikirim). Jadi, setiap pengguna yang memulai beberapa pekerjaan baru di klien mereka akan memengaruhi nomor ini. Ini akan berbeda dari daftar perubahan terakhir yang disinkronkan ke ruang kerja lokal.
jasonmray

2

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.


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.