2010-11-03 4 views
13

Короткой версии:неволей: Найти источник для списка изменений филиала

После ветвления в Р4, как я могу узнать «источник» список изменения в отрасли?

Длинная версия:

Скажем, у меня есть главная ветвь моего проекта на

//project/main/... 

Последний список изменений, представленный здесь @ 123, когда я решил создать ветку для версии 1.0 в

//project/1.0/... 

С P4V создается новый журнал изменений (скажем, @ 130), разрешенный и отправленный.

С CLI, это будет выглядеть примерно так:

p4 integrate -c 123 -o //project/main/... //project/1.0/... 
p4 submit 

Позже, я смотрю на под //project/1.0 группы изменений, и увидеть @ 130, содержащие список изменений много разветвленных файлы. Как я могу узнать список изменений. что это изначально было разветвлено от (т. е., @ 123)?

+0

Nitpick: команда CLI является 'p4 интегрировать // project/main/... //project/1.0/...'. ('-c 123' потерпит неудачу, потому что' -c' указывает * измененный список изменений *. В вашем примере 123 - это уже отправленный * список изменений.) –

+0

@Jon Вы работаете в Perforce? Так случилось, что я связался с их поддержкой вчера, и они указали ту же ошибку, которую я сделал :). Время было прекрасным. Кстати, предлагаемый я использую 'p4 filelog' с теми же параметрами, которые вы используете для' p4 changes', но я думаю, что ваше решение дает более ясные результаты (т. Е. Я могу просто заглянуть в список изменений, который мне нужен, в отличие от «filelog» «версия, которая намного сложнее). –

+0

Я знаю, что я дал плохой ответ изначально, но я полностью пересмотрел его и пошел на него совершенно по-другому. Я просто хотел уведомить вас; Я не уверен, что акисты уведомлены о пересмотренных ответах или нет. – Chance

ответ

8

p4 changes отобразит список представленных списков изменений, необязательно отфильтрованных по определенному пути.

p4 changes //project/main/... 
Change 123 ... 'Very last change.' 
Change 122 ... 'Next-to-last change.' 
Change 100 ... 'Only two changes to go...' 
... 

Не удивительно, но, как вы нашли, p4 changes менее полезно, когда вы интегрировать все эти изменения в одно изменение:

p4 changes //project/1.0/... 
Change 130 ... 'Integrated everything from main.' 

Хитрость заключается в том, чтобы использовать опцию -i, в котором содержит любые изменения списков имен, включенные в указанные файлы.

p4 changes -i //project/1.0/... 
Change 130 ... 'Integrated everything from main.' 
Change 123 ... 'Very last change.' 
Change 122 ... 'Next-to-last change.' 
Change 100 ... 'Only two changes to go...' 
... 

Чтобы получить именно то, что вы хотите (123) вам необходимо написать скрипт, который фильтрует вывод из p4 changes -i //project/1.0/... для удаления каких-либо изменений, перечисленных p4 changes //project/1.0/... (а затем принять самые последние оставшиеся изменения).

(При изучении, я часто также найти вариант -m max полезным. Этот ограничивает изменения в «макс» последний. Это помогает ваш вывод не течет закадровый, когда есть много изменений.)

+0

Но я уверен, что последнее изменение в 'p4 changes -i', которое не находится в' p4 changes', будет родителем данного набора изменений? Я могу объединить набор изменений 123 в ветвь X, а затем после этого сменить набор изменений 20. Как я могу напрямую найти родителя данного набора изменений? –

+0

@AlexanderBird, нет. Я не думаю, что это решение работает при слиянии изменений, которые произошли до изменений, которые уже были объединены. –

+0

Не очень полезно для больших кодовых баз. 'Слишком много строк сканируются (более 9000000); см. «p4 help maxscanrows». ' – Calmarius

0

Короткий ответ:

Используйте Revision Graph в P4V это шаг назад во времени и изучить историю интеграции. Video on the Perforce website.

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

Длинный ответ:

... [Удалено]

UPDATE: Как Revision график, по-видимому неосуществимо, возможно, вы можете решить эту проблему с помощью процесса/политики, то есть, когда вам выполните интеграцию, добавьте примечание в описание «Branched @ CL 123». Мы использовали этот подход сами, когда интегрировались из ствола, чтобы выпустить линии.

+0

Имея пару сотен файлов в каждой ветви, к сожалению, недоступен подход «Просмотр ревизии». Поскольку команда, которая создает интеграцию, указывает исходный список изменений, я надеялся, что информация будет где-то сохранена, и я просто не знаю, где искать. Я предполагаю, что всегда существует нечеткий подход проверки временных меток списков изменений в ветви источника и нахождения ближайшего к временной отметке интеграции. –

+0

Что касается обновления вашего ответа: мы * делаем * используем что-то подобное в нашем процессе; Я просто надеялся, что есть автоматический путь, и никто не заботился о нем. –

1

Я не знаю никакой простой команды, которая выполняет то, что вы хотели бы сделать. Если вы готовы сценарий немного, и команда не должны выполняться быстро, вы могли бы, возможно, попробовать что-то вроде сценария следующих за все разветвленных файлов:

  1. Найти исходный файл/пересмотр для целевой файл.

    p4 FileLog //project/1.1/foo.bar#1
    //project/1.1/foo.bar
    ... # 1 смена 6416 ветви на 2009/07/10 по обув @bar (текст) 'Release 1.1'
    ... ... branch from // project/main/foo.бар # 1, # 2

  2. Получить список изменений, при котором исходный файл/пересмотр был представлен.

    p4 fstat //project/main/foo.bar#2
    ... depotFile //project/main/foo.bar
    ... headAction редактировать
    ... headType текст
    ... headTime 1201771167
    ... headRev 2
    ... headChange
    ... headModTime 1201770971

  3. Повторите для всех файлов в ветке и выберите самое высокое изменение no (headChange выше), которое должно быть последним изменением, переданным родительскому элементу перед ветвлением для этого конкретного файла. Вы можете получить полный список всех разветвленных файлов, например, "p4 files //project/1.0/...#1".

(или, возможно, принять легкий путь и спросить Perforce поддержку)

0

Обновлено Ответ: Я думаю, что это будет работать. Попробуйте следующее:

p4 interchanges from_branch to_branch 

Это покажет неинтегрированные изменения с вашей основной ветки на вашу ветвь освобождения. Я считаю, что вы можете использовать верхний список изменений минус 1, чтобы найти свой список изменений в списке. interchanges - это недокументированная функция CLI Perforce. Чтобы узнать больше, введите p4 help interchanges, чтобы узнать больше об этой команде.

Опять же, я думаю это будет работать. Могут быть некоторые особые случаи, когда это не будет, но это мое лучшее предположение для жесткой и важной проблемы.

+1

Сокращение бит: если ветка была выполнена, когда изменение 120 было последним внесенным изменением в // project/main, а внесенное изменение интеграции получило номер 129, то основные @ 120 и [email protected] должны быть одинаковыми для большинства практических целей, но помните, что вы можете отредактировать цель перед подачей, «продвигая» цель, добавив с помощью «p4 edit», а затем измените содержимое файла. – rjnilsson

+0

После интеграции мне могут потребоваться списки изменений списков вишни для back-porting от main до 1.0.Я хочу, чтобы начальная интеграция CL из/main (@ 123 в моем примере), чтобы точно увидеть, что было добавлено в main после точки интеграции. (Правдоподобно, что в/main могут быть изменения между @ 123 и @ 130) –

+0

Я только что получил его. Вы переходите из предыдущего списка изменений, а не (обязательно) самого последнего. – Chance

0

Если вы используете вкладку Истории в P4V она покажет вам все группы изменения, представленные на ветку, так что смотреть на это для

//project/1.0/... 

как только вы нашли самую старую представленный список изменений, то на любом из файлов в этом списке изменений просмотреть График пересмотра для него, это покажет вам ветку, из которой был интегрирован файл (и остальные файлы).

Я посмотрю, смогу ли я вернуться с командами p4, чтобы сделать то же самое.

1

Поскольку никто ответов до сих пор предоставляют код для поиска исходного или корневого списка изменений в ветке, я думал, что предоставил бы однострочный пакет, чтобы сделать именно это. Этот подход основан на предложении @ Cwan и будет печатать «родительский» список изменений, из которого была создана ветка. Аргумент FIRST_BRANCH_CL должен быть заменен списком изменений создания ветки (т. Е. Первым списком изменений, представленным новой ветке). В качестве конкретного примера, заменив FIRST_BRANCH_CL на 130 на исходный вопрос, этот однострочный файл вывел 123.

p4 describe -s FIRST_BRANCH_CL | perl -lne 'if(/^\.\.\. (.+#[0-9]+) .+$/) {print quotemeta $1}' | xargs p4 filelog -m1 | perl -lne 'if(/^\.\.\. \.\.\. branch from (.+#[0-9]+)/) {print quotemeta $1}' | xargs p4 fstat | perl -lne 'if(/^\.\.\. headChange (\d+)/) {$MaxCL=$1 if($1 > $MaxCL)} END {print $MaxCL}' 
+0

Эй, это действительно работает! Я пробовал это в одном из наших филиалов, после того, как сначала нашел ту же информацию, используя инструкции, описанные Джоном-Эриком. Тем не менее, требуется некоторое время. – fencekicker

+0

Ницца, но я думаю, было бы здорово, если бы вы объяснили логику своего лайнера. – Kostas

0

«p4 интегрированный» работал для меня. Ищите "копию из" в описании

Смежные вопросы