perforce - 使用操作系统意外删除的文件。如何恢复它们?
问题描述
事件顺序:
- 创建了一个文件 A
- 将其添加到存储库:
p4 add A
- 将其提交到存储库:
p4 submit A
- 不小心从我的工作目录中删除了它:
\rm -f A
将它带回我的工作目录的神奇 p4 命令是什么?
试过了,没用
1. p4 sync
2. p4 sync -f
3. p4 edit A
4. p4 sync A
5. p4 sync -f A
解决方案
如果文件已打开以进行编辑(如果是这种情况,您会因为在最初的事件序列中省略它而感到羞耻),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
自动将文件替换为适当的软件仓库版本;当您重新打开它进行编辑时,您将有一个全新的开始。
推荐阅读
- r - 在某个模式之前计算唯一值的数量?
- laravel - laravel 永远登录
- java - 从包外部使用包私有构造函数访问最终静态类
- api - 从我的网站访问托管在我的 Pi 上的 ExpressJs 服务器
- java - Java - 渲染 HTML、JS 和 CSS 并将输出 html 作为字符串发送
- c - Vigenere CS50 - 需要帮助循环字母
- git - 仅使用 Git 来检查更改,而不创建历史记录
- haskell - Rank2Types,“……会脱离它的范围”(梁)
- javascript - 来自 Spotify 响应的背景图像反应
- serverless-framework - 如何在无服务器框架中创建多个阶段