Визначення останнього списку змін, синхронізованого в Perforce


117

Питання, яке періодично виникає - це найкращий спосіб визначити список змін, який ви востаннє синхронізували в Perforce. Це часто потрібно для таких речей, як введення номера списку змін в інформацію про версію системою автоматичного збирання.


p4 changes | head -1здається легше, ніж більшість цих рішень.
Шрідхар Сарнобат

Відповіді:


91

Я рекомендую навпаки для систем автоматичного збирання: спочатку слід отримати останній список змін із сервера, використовуючи:

p4 changes -s submitted -m1

потім синхронізуйте цю зміну і запишіть її в інформацію про версію. Причина така. Хоча Perforce рекомендує наступне для визначення списку змін, до якого синхронізується робоча область:

p4 changes -m1 @clientname

вони відзначають декілька ґатів:

  • Це працює лише в тому випадку, якщо ви нічого не надіслали з відповідної робочої області.
  • Можливо також, що робоча область клієнта не синхронізується з певним списком змін.

і є додатковий диван, який вони не згадують:

  • Якщо найвищий список змін, до якого синхронізація мала строго видалені файли з робочої області, повідомлятиметься про наступний найвищий список змін (якщо це теж строго видалені файли).

Якщо ви повинні синхронізувати спочатку і записати пізніше, Perforce рекомендує виконати наступну команду, щоб визначити, чи вас покусали вищезгадані gotchas; це повинно вказувати, що нічого не було синхронізовано або видалено:

p4 sync -n @changelist_number

Чому це так: "Це працює лише в тому випадку, якщо ви нічого не надіслали з відповідної робочої області."
gdw2

Якщо ви внесете зміни, "p4 зміни -s відправлено -m1" поверне номер вашого списку змін. Наприклад, скажіть, що ви синхронізуєте зі списком змін 5, зачекайте пару годин, а потім надішліть список змін 10. Наведена вище команда змін повернеться 10.
Рінн

Посилання мертва, це була ця стаття? answer.perforce.com/articles/KB/3458/
користувач31389

Зауважте, що ви можете використовувати #haveзамість @clientname, що позбавляє вас від необхідності шукати ім’я робочої області клієнта.
yoyo

29

Просто щоб відповісти на це сам у відповідь на пропозицію Джеффа використовувати Stackoverflow як місце для збереження технічних фрагментів ....

З командного рядка використовуйте:

p4 changes -m1 @<clientname>

І просто замініть ім'я свого клієнта. Це дасть вихід форми:

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

Який легко аналізується, щоб отримати номер списку змін.


Я отримую: Запит занадто великий (понад 1500000); див. "Максимальні результати допомоги p4".
користувач674669

@ user674669: скористайтеся опцією -m1, яка повертає лише останній (1) список змін
panako

Це дає інформацію про останній поданий список змін, а не про останній синхронізований список змін, про що хотіла знати оп.
Андреас

@marsh Я думаю, що це насправді назва робочої області клієнта, яка за замовчуванням відповідає імені комп'ютера, якщо його не встановлено. Дивіться тут: P4CLIENT .
Андреас Гафербург

15

Ви можете спробувати знайти максимальну кількість змін у висновку команди "p4 файли". Однак робочий каталог не повинен містити комісій після синхронізації. Це просто тад краще, ніж

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

оскільки останній, здається, працює на сервері і може вийти з ладу на великих джерелах дерев через обмеження "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

де p4lastchange.py заснований на коді з презентації Використання P4G.py З командного рядка JTGoldstone, Інформаційна мережа Kodak / Ofoto, 15 квітня 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

Якщо ви використовуєте P4V, ви можете зробити це графічно:

  • На вкладці Інформаційна панель (Перегляд-> Інформаційна панель) виберіть папку, і ви побачите список списків змін, з якими папка ще не оновлюється. Зверніть увагу на найменше число (у найвищому рядку).
  • Переконайтеся, що на дереві робочої області ви вибрали ту саму папку, що і раніше на інформаційній панелі. Потім перейдіть на вкладку «Історія» (Перегляд-> Історія) та прокрутіть униз до зазначеного раніше числа. Число трохи нижче цього числа - це номер вашого поточного списку змін.

9

p4 changes -m1 @clientname що є "рекомендованим" способом зробити це для мого клієнта, займає близько 10 хвилин

ось що я використовую:

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

для того ж клієнта потрібно 2,1 секунди


Що таке ім'я клієнта? Як я можу знайти цю інформацію?
болото

1
Ім'я клієнта @marsh (або також робочої області) - це ім'я об'єкта perforce, який зберігає відображення від серверного депо до вашої локальної файлової системи
gsf

2
Охвалюючи цю відповідь, оскільки вона відповідає на власне питання, а не каже "не роби цього" (що є дійсним моментом, але не відповідає на питання).
sam hocevar

1
p4 changes -m1 @clientnameбігати нескінченно ... p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'справді працює! Дякую!
simomo

@gsf - дякую, я просто спробував це на моєму Linux-коробці і він працював!

8

Ви також можете скористатися командою cstat:

p4 допомогти 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

Для серйозної збірки (тієї, яка готується до тестування) явно вкажіть потрібний номер мітки чи списку змін, синхронізуйте з міткою та ввімкніть її в артефакти збірки.

Якщо список змін (або мітки) не вказаний, використовуйте p4 counter changeдля отримання поточного номера зміни та записуйте його. Але все одно потрібно синхронізувати все, використовуючи цей номер зміни.

Я не думаю, що ти можеш досягти саме того, що ти хочеш, адже загалом ціла робоча область не синхронізована з певним номером списку змін. Можна явно синхронізувати деякі файли зі старими версіями, і тоді номер одного списку змін не має сенсу. Ось чому потрібен новий sync, щоб гарантувати, що номер єдиного списку змін точно представляє версію коду.


Щодо коментарів: Так, моя відповідь призначена для використання менеджерами конфігурації, які готують збірку, щоб надати QA. Наші розробники зазвичай не синхронізуються як частина збірки; вони складають перед надсиланням - щоб переконатися, що їх зміни не порушують збірку або тести. У цьому контексті ми не намагаємося вставляти мітку сховища.

Зі своїм підходом ви робите припущення, що під час подання останнього списку змін ви синхронізували всю робочу область, і цей список змін включав усі ваші відкриті файли. Занадто просто помилитися в тих припущеннях, важко виявити і жахливо дорого з точки зору втраченого часу. З іншого боку, вирішити проблему легко, без недоліків. Оскільки номер списку змін може бути явно вказаний, не має значення, яка редакція вам потрібна або як швидко змінюється база коду.


Еріксон - приємна пропозиція, але, думаю, вона охоплює дещо інший набір обставин, ніж відповідь, яку я надавав. Безумовно, лічильник буде працювати, якщо ви, ймовірно, будете лише переглянути версію голови, а сервер недостатньо зайнятий, щоб хтось, можливо, працював над іншим проектом, не робив подачу між синхронізацією та викликом лічильника p4. Тому я думаю, що ваша пропозиція, ймовірно, найкраща, коли система збирання робить чітке тягнення, а потім будувати. Моя відповідь охоплює випадки, коли синхронізація може бути вчасно відокремлена від збірки. Обидва дійсні залежно від обставин, які я думаю.
Грег Вітфілд

3

Для всього депо (не тільки для вашої робочої області / клієнта)

p4 counter change

виконує роботу, лише повідомляючи останній список змін.


2
Зауважте, що тут повідомляється про номер останнього списку змін депо, Включаючи відкладені (тобто ще не подані) списки змін. Тож будь-який користувач, який розпочинає якусь нову роботу у своєму клієнті, вплине на це число. Це буде відрізнятися від останнього списку змін, синхронізованого до локальної робочої області.
jasonmray

2

Найкраще, що я знайшов поки що, - це зробити синхронізацію з будь-яким списком змін, який ви хочете створити, а потім використовувати зміни -m1 //...#have, щоб отримати поточний локальний список змін (редагування).

p4 синхронізація @CHANGELIST_NUM p4 змінює -m1 //...#have | awk '{print $ 2}'

Показує номер списку змін, який ви можете використовувати, де захочете. В даний час я шукаю більш простий спосіб, ніж p4 зміни -m1 //...#have.


0

Я не впевнений, чи отримали ви потрібну відповідь, але у мене була подібна проблема. Метою було записати в наш реєстратор конкретну версію проекту. Проблема полягала в тому, що, коли ми робимо власний makefile, загальну систему збирання контролює наше управління конфігурацією. Це означає, що всі рішення, які говорять "синхронізувати з чимось, то роби щось", насправді не працюють, і я не хотів вручну змінювати версію кожного разу, коли ми робимо (достовірне джерело помилок). Рішення (яке насправді натякано на деякі відповіді вище) полягає в наступному: в нашому makefile я роблю p4 зміни -m1 "./...#have" Результатом цього є Зміна змінного номера на дату користувачем @ клієнтом " msg ' Я просто створюю повідомлення в рядок, який друкується реєстратором (номер зміни є важливим елементом, але інший також корисний для швидкого вирішення, чи певна версія містить зміни, які ви знаєте, що ви зробили самі, не збираючись перевіряти). Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.