Питання, яке періодично виникає - це найкращий спосіб визначити список змін, який ви востаннє синхронізували в Perforce. Це часто потрібно для таких речей, як введення номера списку змін в інформацію про версію системою автоматичного збирання.
Питання, яке періодично виникає - це найкращий спосіб визначити список змін, який ви востаннє синхронізували в Perforce. Це часто потрібно для таких речей, як введення номера списку змін в інформацію про версію системою автоматичного збирання.
Відповіді:
Я рекомендую навпаки для систем автоматичного збирання: спочатку слід отримати останній список змін із сервера, використовуючи:
p4 changes -s submitted -m1
потім синхронізуйте цю зміну і запишіть її в інформацію про версію. Причина така. Хоча Perforce рекомендує наступне для визначення списку змін, до якого синхронізується робоча область:
p4 changes -m1 @clientname
вони відзначають декілька ґатів:
і є додатковий диван, який вони не згадують:
Якщо ви повинні синхронізувати спочатку і записати пізніше, Perforce рекомендує виконати наступну команду, щоб визначити, чи вас покусали вищезгадані gotchas; це повинно вказувати, що нічого не було синхронізовано або видалено:
p4 sync -n @changelist_number
#have
замість @clientname
, що позбавляє вас від необхідності шукати ім’я робочої області клієнта.
Просто щоб відповісти на це сам у відповідь на пропозицію Джеффа використовувати Stackoverflow як місце для збереження технічних фрагментів ....
З командного рядка використовуйте:
p4 changes -m1 @<clientname>
І просто замініть ім'я свого клієнта. Це дасть вихід форми:
Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'
Який легко аналізується, щоб отримати номер списку змін.
Ви можете спробувати знайти максимальну кількість змін у висновку команди "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
Якщо ви використовуєте P4V, ви можете зробити це графічно:
p4 changes -m1 @clientname
що є "рекомендованим" способом зробити це для мого клієнта, займає близько 10 хвилин
ось що я використовую:
p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
для того ж клієнта потрібно 2,1 секунди
p4 changes -m1 @clientname
бігати нескінченно ... p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
справді працює! Дякую!
Ви також можете скористатися командою 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'
Для серйозної збірки (тієї, яка готується до тестування) явно вкажіть потрібний номер мітки чи списку змін, синхронізуйте з міткою та ввімкніть її в артефакти збірки.
Якщо список змін (або мітки) не вказаний, використовуйте p4 counter change
для отримання поточного номера зміни та записуйте його. Але все одно потрібно синхронізувати все, використовуючи цей номер зміни.
Я не думаю, що ти можеш досягти саме того, що ти хочеш, адже загалом ціла робоча область не синхронізована з певним номером списку змін. Можна явно синхронізувати деякі файли зі старими версіями, і тоді номер одного списку змін не має сенсу. Ось чому потрібен новий sync
, щоб гарантувати, що номер єдиного списку змін точно представляє версію коду.
Щодо коментарів: Так, моя відповідь призначена для використання менеджерами конфігурації, які готують збірку, щоб надати QA. Наші розробники зазвичай не синхронізуються як частина збірки; вони складають перед надсиланням - щоб переконатися, що їх зміни не порушують збірку або тести. У цьому контексті ми не намагаємося вставляти мітку сховища.
Зі своїм підходом ви робите припущення, що під час подання останнього списку змін ви синхронізували всю робочу область, і цей список змін включав усі ваші відкриті файли. Занадто просто помилитися в тих припущеннях, важко виявити і жахливо дорого з точки зору втраченого часу. З іншого боку, вирішити проблему легко, без недоліків. Оскільки номер списку змін може бути явно вказаний, не має значення, яка редакція вам потрібна або як швидко змінюється база коду.
Для всього депо (не тільки для вашої робочої області / клієнта)
p4 counter change
виконує роботу, лише повідомляючи останній список змін.
Найкраще, що я знайшов поки що, - це зробити синхронізацію з будь-яким списком змін, який ви хочете створити, а потім використовувати зміни -m1 //...#have, щоб отримати поточний локальний список змін (редагування).
p4 синхронізація @CHANGELIST_NUM p4 змінює -m1 //...#have | awk '{print $ 2}'
Показує номер списку змін, який ви можете використовувати, де захочете. В даний час я шукаю більш простий спосіб, ніж p4 зміни -m1 //...#have.
Я не впевнений, чи отримали ви потрібну відповідь, але у мене була подібна проблема. Метою було записати в наш реєстратор конкретну версію проекту. Проблема полягала в тому, що, коли ми робимо власний makefile, загальну систему збирання контролює наше управління конфігурацією. Це означає, що всі рішення, які говорять "синхронізувати з чимось, то роби щось", насправді не працюють, і я не хотів вручну змінювати версію кожного разу, коли ми робимо (достовірне джерело помилок). Рішення (яке насправді натякано на деякі відповіді вище) полягає в наступному: в нашому makefile я роблю p4 зміни -m1 "./...#have" Результатом цього є Зміна змінного номера на дату користувачем @ клієнтом " msg ' Я просто створюю повідомлення в рядок, який друкується реєстратором (номер зміни є важливим елементом, але інший також корисний для швидкого вирішення, чи певна версія містить зміни, які ви знаєте, що ви зробили самі, не збираючись перевіряти). Сподіваюся, це допомагає.
p4 changes | head -1
здається легше, ніж більшість цих рішень.