Perforce: Как я могу p4 интегрировать локальный список изменений?
Итак, вот мой сценарий:
У меня есть два проекта projectA и projectB. Филиал автоматически интегрирует projectA в projectB.
Теперь у меня есть список изменений, который изменяет некоторые файлы в projectA - я еще не совершил/не отправил этот список изменений.
Я хочу, чтобы этот список изменений включался только в projectB.
Выполнение
p4 интегрировать -b branchspec -c changelistNumber
показывает
"Все ревизии интегрированы".
Как я могу интегрировать незарегистрированный список изменений?
Ответы
Ответ 1
Решение Hack-ish:
- Проверьте файлы в проекте B
- Вручную скопировать файлы из проекта A в проект B (они не защищены от записи из-за шага 1)
- Список изменений Shelve в проекте A
- Отправить в B
- Интегрируйте файлы из B в и разрешите
- Удалите файлы с шага 3. При необходимости решите их.
- Отправить в при готовности
Другой подход - создать отдельную ветку, где вы выполняете свою работу, а затем интегрировать в или B по мере необходимости.
Общая идея заключается в том, что Perforce работает в отношении поданных или отмененных списков изменений. Идея интегрировать неподдерживаемый список изменений, похоже, идет вразрез с естественным зерном Perforce, что делает эти обходные пути громоздкими.
Ответ 2
Perforce имеет гораздо более простой способ сделать это:
-
Поместите свой список изменений на branchA (обратите внимание на список изменений #, мы назовем его NUM для справки здесь)
-
Создайте отображение ветвей между ветвями и ветвью B (мы назовем это A_to_B)
-
Выполните следующую команду:
p4 unshelve -s NUM -b A_to_B
Ответ 3
p4 diff -u your/branch/... | patch -p x -d your/otherbranch
Где x - int, вы должны попробовать от 0 до тех пор, пока он не будет работать, используйте -dry-run в патче для тестирования. (-p - это номер каталога, который нужно разбить, чтобы путь к файлу в вашем/ветке и ваши/другие символы совпадали, 2 в этом примере)
Ответ 4
Я просто столкнулся с одной и той же ситуацией, вот мое решение для нее (очень похожее на Джеффа, но в этом деле нет Submit), возможно, это когда-нибудь поможет кому-то:
- Интегрируйте (и разрешите) связанные файлы из ProjectB в ProjectA, пока есть отредактированные, но не представленные файлы.
- Откажитесь от связанных файлов в ProjectB.
- Вручную скопировать связанные файлы из ProjectA в ProjectB.
- Вернуть файлы в ProjectA.
Ответ 5
Вы можете использовать P4_Shelve, чтобы переместить изменения в новую ветку, которую вы могли бы затем интегрировать в projectB.
Ответ 6
Чтобы быстро сделать это, выполните следующие действия:
param([int]$changelistNum, [string]$destBranch)
$regex = "^\s+//[^/]+(/\S+)\s"
$sourceFiles = p4 change -o $changelistNum | select-string $regex | %{$_.matches[0]}
$sourceFiles | %{
$sourcePath = (p4 where $_.groups[0].value.trim()).split(' ')[2];
$destPath = (p4 where ($destBranch + $_.groups[1].value)).split(' ')[2];
p4 edit $destPath;
copy $sourcePath $destPath;
p4 add $destPath;
}
(не знаю, почему отступ не работает выше - я префикс внутри блока script на 8 пробелов?)
script извлекает все файлы из описания списка изменений, и каждый пытается найти соответствующий путь в другой ветке. Он грубый - заставляет как редактировать p4 для каждого файла, так и добавить p4, а не пытаться угадать, какой из них прав. Это довольно многословно!
Чтобы скопировать список изменений 443 в ветвь myBranch:
Copy-PendingChangelistToBranch.ps1 443 "//myBranch"