Perforce ile senkronize edilen son değişiklik listesini belirleme


117

Perforce'da en son senkronize ettiğiniz değişiklik listesini belirlemenin en iyi yolunun ne olduğu, ara sıra ortaya çıkan bir sorudur. Bu, genellikle değişiklik listesi numarasını revizyon bilgisine otomatik oluşturma sistemi tarafından enjekte etmek gibi şeyler için gereklidir.


p4 changes | head -1bu çözümlerin çoğundan daha kolay görünüyor.
Sridhar Sarnobat

Yanıtlar:


91

Otomatik derleme sistemleri için tam tersini öneririm: İlk önce aşağıdakileri kullanarak sunucudan en son değişiklik listesini almalısınız:

p4 changes -s submitted -m1

daha sonra bu değişiklikle senkronize edin ve bunu revizyon bilgisine kaydedin. Nedeni aşağıdaki gibidir. Perforce , çalışma alanının senkronize edildiği değişiklik listesini belirlemek için aşağıdakileri önermesine rağmen :

p4 changes -m1 @clientname

birkaç sorunu not ederler:

  • Bu, yalnızca söz konusu çalışma alanından hiçbir şey göndermediyseniz işe yarar.
  • Bir istemci çalışma alanının herhangi bir belirli değişiklik listesiyle senkronize edilmemiş olması da mümkündür.

ve bahsetmedikleri ek bir sorun var:

  • Eşitlemenin gerçekleştiği en yüksek değişiklik listesi, dosyaları çalışma alanından kesin olarak sildiyse, sonraki en yüksek değişiklik listesi rapor edilecektir (bu değişiklik de olmadığı sürece, dosyalar kesinlikle silinmiştir).

Önce senkronize edip daha sonra kaydetmeniz gerekiyorsa, Perforce, yukarıdaki sorunların sizi ısırıp ısırmadığını belirlemek için aşağıdaki komutu çalıştırmanızı önerir; hiçbir şeyin senkronize edilmediğini veya kaldırılmadığını göstermelidir:

p4 sync -n @changelist_number

Neden "Bu yalnızca söz konusu çalışma alanından hiçbir şey göndermediyseniz çalışır."
gdw2

Bir değişiklik gönderirseniz, 'p4 değişiklikleri -s gönderildi -m1' değişiklik listesi numaranızı döndürür. Örneğin, 10. dönecektir değişiklik listesi 10. Yukarıdaki değişiklikler gönderme komutunun ardından bir kaç saat bekleyin ve eğer 5 değişiklik listesi senkronize demek
Rinn

Bağlantı öldü, bu makale miydi? answers.perforce.com/articles/KB/3458/
user31389

#haveBunun yerine kullanabileceğinizi unutmayın; @clientnamebu, sizi istemci çalışma alanı adınızı aramaktan kurtarır.
yoyo

29

Jeff'in Stackoverflow'u teknik snippet'leri saklamak için bir yer olarak kullanma önerisine uygun olarak bunu kendim yanıtlamak için ....

Komut satırından şunları kullanın:

p4 changes -m1 @<clientname>

Ve sadece müşteri spesifikasyonunuzun adıyla değiştirin. Bu, formun çıktısını üretecektir:

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

Değişiklik listesi numarasını çıkarmak için kolayca ayrıştırılır.


Anlıyorum: Çok büyük istek (1500000'den fazla); bkz. "p4 help maxresults".
user674669

@ user674669: sadece son (1) değişiklik listesini döndüren -m1 seçeneğini kullanın
panako

Bu , operasyonun bilmek istediği son senkronize değişiklik listesinin değil , son gönderilen değişiklik listesinin bilgilerini verir .
Andreas

@marsh Bunun aslında istemci çalışma alanı adı olduğunu düşünüyorum, bu da ayarlanmadıysa varsayılan olarak bilgisayar adıdır. Buraya bakın: P4CLIENT .
Andreas Haferburg

15

"P4 dosyaları" komutunun çıktısında maksimum değişiklik sayısını bulmayı deneyebilirsiniz. Yine de çalışma dizini, senkronizasyon sonrası işlemleri içermemelidir. Bu sadece biraz daha iyi

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

çünkü ikincisi sunucuda çalışıyor gibi görünüyor ve "MaxResults" limitleri nedeniyle büyük kaynak ağaçlarında başarısız olabilir.

$ 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

burada p4lastchange.py, JTGoldstone, Kodak Information Network / Ofoto, 15 Nisan 2005 , Komut Satırından P4G.py Kullanımı sunumundaki kodu temel alır .

#! /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

P4V kullanıyorsanız, bunu grafiksel olarak yapabilirsiniz:

  • Gösterge Tablosu sekmesinde (Görünüm-> Gösterge Tablosu) bir klasör seçin ve klasörün henüz güncellenmediği değişiklik listelerinin bir listesini göreceksiniz. En düşük sayıya (en yüksek satıra) dikkat edin.
  • Çalışma Alanı Ağacında, Kontrol Panelinde daha önce olduğu gibi aynı klasörü seçtiğinizden emin olun. Ardından Geçmiş sekmesine gidin (Görünüm-> Geçmiş) ve daha önce not ettiğiniz sayıya gidin. Bu sayının hemen altındaki sayı, mevcut değişiklik listenizin numarasıdır.

9

p4 changes -m1 @clientname Müşterim için bunu yapmanın "önerilen" yolu yaklaşık 10 dakika sürer

bu benim kullandığım şey:

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

aynı müşteri için 2,1 saniye sürer


Müşteri adı nedir? Bu bilgiyi nasıl bulabilirim?
marsh

1
@marsh client (veya aynı zamanda çalışma alanı) adı, sunucu
deposundan

2
"Bunu yapma" demek yerine asıl soruyu yanıtladığı için (bu geçerli bir noktadır, ancak soruya cevap vermez) bu yanıtı desteklemek.
sam hocevar

1
p4 changes -m1 @clientnamesonsuza kadar koş ... p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'gerçekten işe yarıyor! Teşekkürler!
simomo

@gsf - teşekkürler, sadece Linux kutumda denedim ve işe yaradı!

8

Cstat komutunu da kullanabilirsiniz:

p4 yardım 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

Ciddi bir yapı için (test için hazırlanan), istenen etiketi veya değişiklik listesi numarasını açıkça belirtin, etikete senkronize edin, ve bunu yapı yapılarına yerleştirin.

Bir değişiklik listesi (veya etiket) verilmemişse, p4 counter changemevcut değişiklik numarasını almak ve kaydetmek için kullanın. Ancak yine de bu değişiklik numarasını kullanarak her şeyi senkronize etmeniz gerekiyor .

Tam olarak istediğinizi başarabileceğinizi sanmıyorum, çünkü genel olarak, tüm bir çalışma alanı belirli bir değişiklik listesi numarasıyla senkronize edilmez. Bazı dosyalar açıkça eski revizyonlarla senkronize edilebilir ve ardından tek bir değişiklik listesi numarası anlamsızdır. Bu yüzden tazesync , tek bir değişiklik listesi numarasının kod sürümünü doğru bir şekilde temsil etmesini sağlamak için yeni bir kod gereklidir.


Yorumlarla ilgili olarak: Evet, cevabım, KG'ye vermek için bir yapı hazırlayan konfigürasyon yöneticileri tarafından kullanılmak üzere tasarlanmıştır. Geliştiricilerimiz normalde bir yapının parçası olarak senkronize olmaz; göndermeden önce bir derleme yaparlar — böylece değişikliklerinin yapıyı veya testleri bozmadığından emin olabilirler. Bu bağlamda, bir depo etiketi yerleştirme zahmetine girmeyiz.

Yaklaşımınızla, tüm çalışma alanınızın en son değişiklik listesi gönderiminiz sırasında başa senkronize edildiğini ve bu değişiklik listesinin tüm açık dosyalarınızı içerdiğini varsayıyorsunuz. Bu varsayımlarda yanılmak çok kolay, tespit edilmesi zor ve kaybedilen zaman açısından korkunç derecede pahalı. Öte yandan, problemi çözmek kolaydır ve hiçbir sakınca yoktur. Ve bir değişiklik listesi numarası açıkça belirtilebildiğinden, hangi revizyona ihtiyacınız olduğu veya kod tabanının ne kadar hızlı değiştiği önemli değildir.


Erickson - güzel bir öneri, ama bence verdiğim cevaptan biraz farklı koşulları kapsıyor. Kesinlikle, yalnızca baş revizyonuna sahipseniz ve sunucu yeterince meşgul değilse, belki de başka bir proje üzerinde çalışan biri, senkronizasyon ile p4 sayacını çağırma arasında bir gönderme yapmayacağı için, sayaç çalışacaktır. Bu yüzden, derleme sistemi farklı bir çekip inşa ederken önerinizin en iyisi olduğunu düşünüyorum. Cevabım, senkronizasyonun zaman içinde yapıdan ayrılabileceği durumları kapsıyor. Her ikisi de bence koşullara bağlı olarak geçerlidir.
Greg Whitfield

3

Tüm depo için (sadece çalışma alanınız / müşteriniz değil)

p4 counter change

işi yapar, sadece son değişiklik listesine söyler.


2
Bunun, bekleyen (yani henüz gönderilmemiş) değişiklik listeleri DAHİL OLMAK ÜZERE, en son depo değişiklik listesinin numarasını bildirdiğine dikkat edin. Dolayısıyla, müşterisinde yeni bir işe başlayan herhangi bir kullanıcı bu sayıyı etkileyecektir. Bu, yerel çalışma alanına senkronize edilen son değişiklik listesinden farklı olacaktır.
jasonmray

2

Şimdiye kadar bulduğum en iyi şey, oluşturmak istediğiniz değişiklik listesiyle senkronizasyonunuzu yapmak ve ardından mevcut yerel değişiklik listesini (revizyon) almak için -m1 //...#have değişikliklerini kullanmaktır.

p4 senkronizasyon @CHANGELIST_NUM p4 değişiklikleri -m1 //...#have | awk '{baskı $ 2}'

İstediğiniz yerde kullanabileceğiniz değişiklik listesi numarasını size verir. Şu anda p4 değişiklikleri -m1 //...#have'den daha basit bir yol arıyorum.


0

İhtiyacınız olan cevabı aldığınızdan emin değilim ama benim de benzer bir problemim vardı. Amaç, kaydedicimize projenin belirli versiyonunu yazmaktı. Sorun şu ki, kendi makefile'ımızı oluştururken, genel yapı sistemi konfigürasyon yönetimimiz tarafından kontrol ediliyor. Bu, "bir şeyle senkronize et sonra bir şeyler yap" diyen tüm çözümlerin gerçekten işe yaramadığı ve her işlem yaptığımızda sürümü manuel olarak değiştirmek istemediğim anlamına geliyor (hatalar için kesin bir kaynak). Çözüm (aslında yukarıdaki bazı cevaplarda ima edilen) şudur: makefile'mizde p4 değişiklikleri yapıyorum -m1 "./...#have" Bunun sonucu, değişiklik_sayısını user @ client ile değiştir ' msg' Mesajı, kaydedici tarafından yazdırılan bir dizede oluşturuyorum (değişiklik numarası önemli unsurdur, ancak diğeri, belirli bir sürümün, kontrol etmeye gitmeden kendi başınıza yaptığınızı bildiğiniz değişiklikleri içerip içermediğine hızlıca karar vermek için de yararlıdır). Bu yardımcı olur umarım.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.