2012-08-17 67 views
11

上下文:有人在活動開發中的大型Perforce軟件倉庫上進行了一些重構工作,並且仍在處理它們。其他人都需要保留其未決更改,但將其移至新目錄結構中的新位置。Perforce:當文件被另一個提交的更改移動時,如何解決未決的更改

考慮我的待處理更改列表,包括添加,編輯,刪除各種文件的移動

如果另一個用戶將所有這些文件的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來移動文件並將正確的命令粘合在一起。我需要一個自動化的解決方案,因爲可能會有大量的用戶受到移動影響而發生大量未決更改,而這些都需要儘可能輕鬆地解決。

我也算適應Working Disconnected From The Perforce Server方法應用在新的位置我的變化,但這種失去了「移動」的元數據,更重要的是,不會,如果多個人都做同樣的事情,他們的工作如果我在他們之前進入,將必須解決我所做的更改。

如果你想用玩具例如一起玩,這裏是我的再現測試用例步驟:

# 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? 

回答

7

從理論上講,你現在應該能夠做到這一點:

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 
+1

請注意,你需要爲這個漂亮的最近的客戶端和服務器版本的工作。我用2012.1測試了這個。 – user1054341 2012-08-18 07:58:16

+0

工作表示感謝。我如何自動執行'p4 move'命令,將命名遷移到新目錄(我的玩具示例中爲file3 => file3.1,解決方案中爲第二個和第三個'p4 move'命令)。我不得不從「p4 opened」的輸出中找出「from」和「to」文件,但是這並不能提供足夠的信息,所以如果有多個文件移動列表。有任何想法嗎? – Day 2012-08-20 09:25:34

+2

'p4 fstat'給出所需的移動信息。 – Day 2012-08-20 10:17:46

相關問題