在发现与另一个项目存在运行时冲突后,我最近不得不退出提交的更改列表(CL#926201)。
在退出更改列表后,我同步到我之前通过使用(从工作区的根目录)提交的更改列表:
p4 sync ...@926201
将已更改文件的旧版本下载到工作区,但未将其添加到待处理的更改列表中。
我希望将原始更改列表中的文件添加到新的更改列表中,以便在本地调查问题并进行任何必要的修订后重新提交。
我找不到任何可以为我完成此操作的命令,但我确实调整了工作区中已更改的文件,这些文件未通过使用(从我的工作区的根目录)添加到工作区中的任何更改列表中:
p4 reconcile
结果证明这是一个错误。该命令运行大约需要一个小时,最后从我从该工作区用完的每个项目中添加每个目标目录中的每个工件。我最终获得了52,000个文件更改列表。 Perforce尽职地检查了所有这些文件来自我的仓库,这需要一个小时左右才能撤消。
此时我决定手动将我在CL#926201中修改过的文件添加到新的更改列表中。这需要一段时间,但我最终得到的一切都与最初提交CL#926201之前的情况相符。
如果我在这个过程中犯了错误,我决定再次与仓库同步,以确保差异正是我想要保留的差异。我使用了IntelliJ,我假设在内部调用了一些p4同步(我知道强制标志已关闭,因为IntelliJ GUI中有一个选项)。我预计会有合并冲突(或Perforce称之为),这样我就可以简单地接受所有本地修订。不幸的是,我的新更改列表中的所有文件都立即恢复为退出修订版。我怀疑从之前检索特定的修订版已经以某种方式将这些文件标记为“可以覆盖它们,因为它们已经老了”。我不知道具体细节,但我很想知道。
现在我又回到了原点,我决定放弃直接使用Perforce并最终手动将所有文件差异逐行复制到现有类中,以便在我看起来像Perforce的新变化最终去提交他们。这是一个单调乏味的过程,我觉得这样做非常愚蠢,但最终有效。
现在我想知道我应该如何解决这个问题。这似乎是一个相当常见的用例,但我找不到任何正确的方法来获取您的更改并在退出后重新提交它们。我应该在这做什么呢?
答案 0 :(得分:3)
请记住,恢复已退出的更改列表实际上只是退出更改列表的另一种情况(您要退出退出),因此我要说的所有内容都与退出更改列表有关,而不是“重新提交“专门撤销的变更清单”。 :)
如果您的目标是将当前目录下的所有内容恢复到更改926201所处的状态,这里有一个非常简单的选项:
p4 copy ...@926201 ...
这将打开文件,因此您可以在提交之前查看生成的更改列表/差异/等。
如果您要使用reconcile来执行此操作,则步骤序列将更像是:
p4 sync ...@926201
p4 sync -k ...
p4 reconcile ...
有一种技巧是你要告诉服务器你正在操作相对于头版本的文件,即使工作区的实际内容是@ 926201 - 那就是“sync -k”的来源(在保持物理工作空间内容的同时,将rev转换为head rev)。
有关“p4 copy”和“p4 reconcile”之前的更复杂变体,请参阅此Perforce知识库文章:http://answers.perforce.com/articles/KB/3474/?q=backout+a+changelist&l=en_US&fs=RelatedArticle
根据你对IntelliJ进行“同步”的描述,听起来像幕后可能涉及“还原” - 一旦用“p4编辑”或“p4调和”,“p4同步打开文件” “即使使用”-f“选项,也绝对不会碰它。它最多会安排一个“p4 resolve”(然后根据所选的resolve选项更新/覆盖/合并/保留内容)。