Perforce: найдите исходный список изменений для ветки
Краткая версия:
После разветвления в P4, как я могу узнать "источник" списка изменений в ветке?
Длинная версия:
Скажем, у меня есть главная ветвь моего проекта в
//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)?
Ответы
Ответ 1
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
), вам нужно написать script, который фильтрует вывод из p4 changes -i //project/1.0/...
, чтобы удалить все изменения, перечисленные в p4 changes //project/1.0/...
(а затем взять последнее оставшееся изменение).
(При изучении я часто также нахожу опцию -m max
полезной. Это ограничивает изменения в "max" в последнее время. Это помогает вашему потоку не перетекать с экрана, когда есть много изменений.)
Ответ 2
Я не знаю никакой простой команды, которая выполняет то, что вы хотели бы сделать. Если вы захотите script немного, и команда не должна выполняться быстро, вы можете попробовать script что-то вроде следующего для всех разветвленных файлов:
-
Найдите исходный файл/ревизию для целевого файла.
p4 filelog //project/1.1/foo.bar # 1
//project/1.1/foo.bar
... # 1 изменить 6416 филиал на 2009/07/10 по foo @bar (текст) 'Release 1.1'
...... от //project/main/foo.bar # 1, # 2
-
Получить список изменений, в который был отправлен исходный файл/версия.
p4 fstat //project/main/foo.bar # 2
... depotFile//project/main/foo.bar
... headAction редактировать
... headType text
... headTime 1201771167
... headRev 2
... headChange 5353
... headModTime 1201770971
-
Повторите для всех файлов в ветке и выберите самое высокое изменение no (headChange выше), которое должно быть последним изменением, переданным родительскому элементу перед разветвлением для этого конкретного файла. Вы можете получить полный список всех разветвленных файлов, например, "p4 files//project/1.0/...# 1".
(или, возможно, выберете простой путь и попросите поддержку Perforce)
Ответ 3
Поскольку ни один из ответов до сих пор не содержит кода для поиска исходного или корневого списка изменений в ветке, я думал, что я предоставил бы один лайнер, чтобы сделать именно это. Этот подход основан на предложении @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}'
Ответ 4
Короткий ответ:
Использование графика пересмотра в P4V - это шаг назад и исследование истории интеграции. Видео на веб-сайте Perforce.
Я успешно использовал график ревизий в ветвях с тысячами файлов, чтобы отслеживать, когда определенные изменения были интегрированы в ветку. Вот почему я рекомендовал его и связал с обучающим видео, поскольку большинство людей недооценивают его, потому что они не знают, как его использовать.
Длинный ответ:
... [Удалено]
ОБНОВЛЕНИЕ: Поскольку график пересмотра, по-видимому, неосуществим, вы, возможно, можете решить это, используя процесс/политику, т.е. когда вы выполняете интеграцию, добавьте примечание в описание "Branched @CL 123". Мы использовали этот подход сами, когда интегрировались из ствола в выпуск линий.
Ответ 5
Обновленный ответ: Я думаю, что это сработает. Попробуйте следующее:
p4 interchanges from_branch to_branch
Это покажет неинтегрированные изменения из вашей основной ветки в вашу ветку выпуска. Я считаю, что вы можете использовать верхний список изменений минус 1, чтобы найти свой список изменений в списке. interchanges
- это недокументированная функция CLI Perforce. Чтобы узнать больше, введите p4 help interchanges
, чтобы узнать больше об этой команде.
Опять же, я думаю, что это сработает. Могут быть какие-то особые случаи, когда это не будет, но это мое лучшее предположение для жесткой и важной проблемы.
Ответ 6
Если вы используете вкладку history в p4v, она покажет вам все списки изменений, представленные против ветки, поэтому посмотрите на это для
//project/1.0/...
после того, как вы найдете самый старый отправленный список изменений, затем на любом из файлов в этом списке изменений просмотрите график изменений для него, это покажет вам ветку, в которую был интегрирован файл (и остальные файлы).
Я посмотрю, смогу ли я вернуться с командами p4, чтобы сделать то же самое.
Ответ 7
"p4 интегрированный" работал у меня. Найдите "копию из" в описании