コンテキスト:誰かが活発な開発中の大規模な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
)。わかった。 - 削除したファイルは移動できません(
//depot/path - can't move (already opened for delete)
)。悪い - 移動したファイルは再度移動できません。保留中の変更がからに移動し、他の変更がに移動した場合、変更
//depot/path
の//depot/newpath
「//depot/path
移動/追加」部分を取得することはできますが、変更の「移動/削除」部分を取得することもできませ//depot/newdir/path
ん(前のポイントと同じエラー)。悪い。p4 move newpath newdir/newpath
p4 move path newdir/path
裸のp4コマンドが機能しない場合は、ファイルを移動して適切なコマンドを接着するために、bash-fuを無効にする必要があります。移動の影響を受ける多数のユーザーに多数の保留中の変更が存在する可能性があるため、自動化されたソリューションが必要です。これらはすべて、可能な限り簡単に解決する必要があります。
また、Perforceサーバーから切断された作業方法を適応させて新しい場所に変更を適用することも検討しましたが、これにより「移動」メタデータが失われ、さらに重要なことに、複数の人が同じことをしなければならない場合は機能しません。私が彼らの前に入ると、彼らは私が行った変更で解決しなければなりません。
おもちゃの例と一緒にプレイしたい場合は、ここに私の再現テストケースの手順を示します。
# 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
# day@office:~/p4test/workspace1$ tree
# .
# ├── file0
# ├── file1
# ├── file3.1
# └── main
# ├── file1
# ├── file2
# ├── file3
# └── file4
#
# 1 directory, 7 files
# Now ... how to resolve?