首页 > 解决方案 > 使用操作系统意外删除的文件。如何恢复它们?

问题描述

事件顺序:

  1. 创建了一个文件 A
  2. 将其添加到存储库:p4 add A
  3. 将其提交到存储库:p4 submit A
  4. 不小心从我的工作目录中删除了它:\rm -f A

将它带回我的工作目录的神奇 p4 命令是什么?

试过了,没用

 1. p4 sync
 2. p4 sync -f 
 3. p4 edit A
 4. p4 sync A
 5. p4 sync -f A

标签: perforce

解决方案


如果文件已打开以进行编辑(如果是这种情况,您会因为在最初的事件序列中省略它而感到羞耻),sync -f在您恢复之前不要触摸它,此时您将获得仓库版本文件。做就是了:

p4 revert A

如果文件未打开,则p4 sync -f A应该这样做,但您真正想要的命令是:

p4 clean

这将遍历您的整个客户端并“清理”任何与您的同步状态不匹配的未打开文件。要查看您的同步状态,请使用p4 have(带或不带文件参数)。


在这种特殊情况下,事件的顺序类似于:

C:\Perforce\test>p4 edit foo
//stream/main/foo#4 - opened for edit

C:\Perforce\test>del foo

此时,foo已打开以供编辑,但在本地文件系统中缺失。尝试提交它会失败,因为它是开放的edit,而不是delete

C:\Perforce\test>p4 submit -d "my awesome edit"
Submitting change 156.
Locking 1 files ...
edit //stream/main/foo#5
open for read: c:\Perforce\test\foo: The system cannot find the file specified.
Submit aborted -- fix problems then use 'p4 submit -c 156'.
Some file(s) could not be transferred from client.

做 ap4 sync -f不会做任何事情,因为sync总是跳过打开的文件,除了更新工作版本;由于您已经在进行头部修订,因此它只会报告“最新”:

C:\Perforce\test>p4 sync -f foo
foo - file(s) up-to-date.

同样,p4 edit不会做任何事情,因为 (a) 文件已经打开以供编辑,并且 (b)p4 edit仅打开工作区中的现有文件;它不会同步它或以任何方式修改其内容。(它确实会执行 chmod,但如果 chmod 失败,则无论如何都会打开文件。)

C:\Perforce\test>p4 edit foo
//stream/main/foo#4 - currently opened for edit
(file is still missing)

解决丢失文件情况的一种方法是手动替换原始文件,方法是从其他地方复制或使用p4 print如下:

C:\Perforce\test>p4 print -o foo //stream/main/foo
//stream/main/foo#4 - edit change 119 (text)

但是,手动替换方法存在内容与您签出的修订不匹配的风险,这可能会导致数据丢失(即,您会欺骗冲突解决逻辑,使其认为您故意添加/删除了基于在您刚刚抓取的文件的版本上)。

相反,我建议进行还原并重新打开文件:

C:\Perforce\test>p4 revert foo
//stream/main/foo#4 - was edit, unlocked and reverted

C:\Perforce\test>p4 edit foo
//stream/main/foo#4 - opened for edit

revert自动将文件替换为适当的软件仓库版本;当您重新打开它进行编辑时,您将有一个全新的开始。


推荐阅读