Подтвердить что ты не робот

Perforce: как разрешить ожидающие изменения, когда файлы были перемещены другим измененным изменением

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

Рассмотрим мой ожидающий список изменений с добавлением, редактированием, удалением и перемещением различных файлов.

Если другой пользователь отправляет p4 move из всех этих файлов в подкаталог, в то время как мой журнал изменений все еще находится на рассмотрении, как мне разрешить, чтобы те же изменения были применены к тем же файлам в их новом местоположении?

После того, как другой пользователь перемещает файлы, и я делаю p4 sync, что делает файлы в их новом месте в моей рабочей области, p4 resolve просто говорит, что есть No file(s) to resolve.

Я попытался сделать p4 move path newdir/path для каждого файла в моем изменении, это не совсем работает:

  • Добавленные мной файлы перемещаются для добавления в новое место. ХОРОШО.
  • Файлы, которые я редактировал, требуют использования флага -f на p4 move (без него вы получите //depot/newdir/path - is synced; use -f to force move). OK.
  • Файлы, которые я удалил, не могут быть перемещены (//depot/path - can't move (already opened for delete)). BAD
  • Файлы, которые я переместил, не могут быть перемещены снова. Если мое ожидающее изменение перемещалось от //depot/path до //depot/newpath, а другое изменение переместило //depot/path в //depot/newdir/path, тогда я могу p4 move newpath newdir/newpath выбрать "изменение/добавление" части изменения, но я не могу p4 move path newdir/path, чтобы также получить часть "move/delete" изменения (та же ошибка, что и предыдущая точка). BAD.

Если голые команды p4 не будут работать, мне придется вырезать bash -fu для перемещения файлов и склеивания правильных команд. Мне нужно автоматическое решение, так как может быть большое количество ожидающих изменений для большого числа пользователей, затронутых ходом, и все это необходимо как можно проще решить.

Я также рассмотрел возможность адаптации метода "Отключено от сервера Perforce" , чтобы применить мои изменения в новом местоположении, но это теряет метаданные "move" и, что более важно, не будет работать, если несколько людей должны сделать то же самое, что им придется решать с изменениями, сделанными мной, если я доберусь до них.

Если вы хотите играть вместе с примером игрушек, вот мои примеры тестовых примеров:

# Get p4 client and server, install in path (~/bin for me)
cd ~/bin
wget http://www.perforce.com/downloads/perforce/r12.1/bin.linux26x86/p4
chmod +x p4
wget http://www.perforce.com/downloads/perforce/r12.1/bin.linux26x86/p4d
chmod +x p4d

# Start p4 server in a test area (server dumps files in CWD)
mkdir -p ~/p4test/server
cd ~/p4test/server
p4d&
sleep 3
export P4PORT=localhost:1666
unset P4CONFIG # In case you use elsewhere :)

# Create some default client specs and workspaces for them.
mkdir ../workspace1
cd ../workspace1
export P4CLIENT=client1
p4 client -o | p4 client -i
mkdir ../workspace2
cd ../workspace2
export P4CLIENT=client2
p4 client -o | p4 client -i

# Create files and commit initial depot from client1
cd ../workspace1
export P4CLIENT=client1
for i in 1 2 3 4; do echo "This is file $i" > file$i; done
p4 add file*
p4 submit -d 'Initial files'

# Now make some changes to the files. But do not submit - leave pending.
# Add
echo "New file 0" > file0
p4 add file0
# Edit
p4 edit file1
echo "Edited $(date)" >> file1
# Delete
p4 delete file2
# Move
p4 edit file3
p4 move file3 file3.1

# Pending changelist looks like this:
# p4 opened
#//depot/file0#1 - add default change (text)
#//depot/file1#1 - edit default change (text)
#//depot/file2#1 - delete default change (text)
#//depot/file3#1 - move/delete default change (text)
#//depot/file3.1#1 - move/add default change (text)

# Meanwhile, in client2, another user moves everything to a new dir
cd ../workspace2
export P4CLIENT=client2
p4 sync
p4 edit file*
p4 move ... main/...
p4 submit -d 'Move everything to new "main" directory'

# Now what happens in client1?
cd ../workspace1
export P4CLIENT=client1
p4 sync

# //depot/file4#1 - deleted as /home/day/p4test/workspace1/file4
# //depot/file1#1 - is opened for edit - not changed
# //depot/file2#1 - is opened for delete - not changed
# //depot/file3#1 - is opened for move/delete - not changed
# //depot/file3.1#1 - is opened for move/add - not changed
# //depot/main/file1#1 - added as /home/day/p4test/workspace1/main/file1
# //depot/main/file2#1 - added as /home/day/p4test/workspace1/main/file2
# //depot/main/file3#1 - added as /home/day/p4test/workspace1/main/file3
# //depot/main/file4#1 - added as /home/day/p4test/workspace1/main/file4
# [email protected]:~/p4test/workspace1$ tree
# .
# ├── file0
# ├── file1
# ├── file3.1
# └── main
#     ├── file1
#     ├── file2
#     ├── file3
#     └── file4
#
# 1 directory, 7 files

# Now ... how to resolve?
4b9b3361

Ответ 1

В теории вы должны теперь это сделать:

p4 move -f ... main/...             # meld your opened files to their renamed files
p4 move -f main/file3.1 main/file3  # meld your renamed file to their renamed file
p4 revert '*'                       # revert your now-spurious pending deletes
p4 move main/file3 main/file3.1     # move their renamed file to the name you wanted
p4 resolve                          # merge their edits with your edits

Но, похоже, есть ошибка с третьим "движением p4", и он отбрасывает ожидающее решение на main/file3.1 (fka main/file3).

Однако, похоже, он работает правильно, если вы делаете это в следующем порядке:

p4 move -f ... main/...
p4 move -f main/file3.1 main/file3
p4 revert '*'
p4 resolve
p4 move main/file3 main/file3.1