如何在不修改本地文件的情况下取消Perforce变更列表中的变更(P4V 2015.2)?

时间:2018-07-18 22:59:40

标签: perforce p4v

注意:此问题与How do you clear the default changelist without altering your worktree in Perforce有关,但并非重复。我的观点是,尽管类似,但这个问题专门针对P4V客户端。

概述

假设我正在使用perforce来跟踪文件。在服务器file1上,文件(Depot)的当前状态是相同的,在本地Filesystem上,文件的当前状态是相同的。出于说明的目的,我还将显示默认变更列表的当前“状态”:

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file1 | file1      | <empty>        |

如果我离线进行更改(file1现在为file2),perforce尚不知道(我知道理想情况下不应发生这种情况,所有更改都应始终跟踪,并且该文件应该已被写保护,但是如果perforce没有运行,月亮位于错误的区域等,它可以这样做,因此出于争论的缘故,假设实际上确实发生了这种情况):

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file1 | file2      | <empty>        |

如果我Reconcile Offline Work...或已将文件手动添加到变更列表,则变更列表现在知道此更改:

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file1 | file2      | file1 -> file2 |

如果我随后提交变更列表,则它当前已跟踪的变更将应用到服务器上,并且变更列表再次为空:

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file2 | file2      | <empty>        |

问题

假设我进行了更改并进行了跟踪。本地文件系统已更改(file2现在为file3),更改列表反映出:

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file2 | file3      | file2 -> file3 |

假设现在我想回到工作空间/更改列表不知道file2已更改为file3的状态,但实际上并没有修改磁盘上的文件: >

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file2 | file3      | <empty>        |

请注意文件系统仍处于file3状态,而不是file2

状态

要怎么做?有没有一种方法可以执行此操作,而无需将更改备份到工作区之外并完全还原或运行“干净”,然后脱机重新应用更改?

我知道我不想只“恢复”更改,因为这不仅恢复了更改列表的状态,还恢复了本地文件的状态:

| Depot | Filesystem | Changelist     |
|-------+------------+----------------|
| file2 | file2      | <empty>        |

请注意文件系统如何丢失状态file3并还恢复为file2

TL; DR:

在不还原或以任何方式修改本地文件系统中的文件的情况下,如何“还原”变更列表/工作区以不再跟踪变更?

我正在使用P4V v2015.2

1 个答案:

答案 0 :(得分:2)

概述

仅使用P4V UI(至少在v2015.2中)是不可能的。

不过,可以通过命令行在其中,“ revert”命令具有一个-k标志,p4 help revert解释为:

  

-k标志将文件标记为在服务器元数据中已还原,而不更改客户端工作空间中的文件。

我知道这里在类似的问题中对此进行了讨论:How do you clear the default changelist without altering your worktree in Perforce-但是问题和选定的答案都没有提及P4V客户,因此,我在下面编写了更详细的解释,以防有人受惠

如何在不修改本地文件的情况下从Perforce更改列表中删除挂起的更改

  1. 右键单击工作区视图中的任意位置,然后选择Open Command Window Here

    • 该命令实际上并未使用current working directory,因此您所位于的文件夹无关紧要。
    • 尽管如此,我们仍需要使用它来设置环境变量,因此,如果您没有设置环境变量,则可能无法在干净的命令行窗口中运行命令。
  2. 输入以下命令:p4 revert -k -c default //...

    • -k标志意味着在还原更改列表时不修改本地文件
    • -c标志指定所需的更改列表。使用default或您要取消跟踪文件的确切更改列表号。
    • 最后一个参数指定(相对于工作空间根目录)应该在哪里查找要从变更列表中清除的文件。 //...表示工作空间中的所有文件。请注意,这始终始终限于您用-c指定的变更列表中的文件!
  3. 运行该命令后,它将列出从变更列表中删除的每个未决变更。

    • 除非您按f5或单击刷新按钮,否则Perforce客户端实际上不会反映此更改。此时,您应该会再次看到更改列表。

您为什么要这样做?

是否应执行此类操作取决于读者的判断,并应考虑the other answer中的警告。

我的主要用例是,由于某种原因删除,移动或重命名了变更列表中的文件,而没有跟踪这些操作。

是的,理想情况下应该跟踪这些更改 ,我可能不得不研究我的工作流程以避免将来发生这种情况。尽管如此,在这种状态下尝试提交更改列表可能会导致错误,因为从技术上讲,这些“待更改”不再存在。

为避免这种情况,我发现如上所述最简单的方法是使用-k标记清除更改列表,删除不再代表本地文件系统的旧更改,然后运行Reconcile Offline Work...在所有相关目录上将 just 当前最新状态保存到变更列表中,然后提交。