Perforce声明文件是不同的

时间:2018-04-12 16:23:59

标签: windows version-control perforce file-permissions

我有这个文件,似乎已进入一个奇怪的状态。 Perforce声称它已经过修改和未开放:

> p4 diff -se
data.xml

通常,当文件被修改并且未打开时,我可以使用sync -f来修复它。但是,出于某种原因,这个特定的文件真的很顽固:

> p4 sync -f data.xml
//Depot/Stream/data.xml#19 - refreshing data.xml

> p4 diff -se
data.xml

sync -f一样,clean似乎有效,但它仍声称已经修改过:

> p4 clean data.xml
//Depot/Stream/data.xml#19 - refreshing data.xml

> p4 diff -se
data.xml

不出所料,当我尝试reconcile -w时会发生同样的事情:

> p4 reconcile -w data.xml
//Depot/Stream/data.xml#19 - refreshing data.xml

> p4 diff -se
data.xml

如果我使用reconcile(没有-w),则会打开文件,但P4Merge会将文件显示为相同,即使不忽略空格或行结尾:

> p4 reconcile data.xml
//Depot/Stream/data.xml#19 - opened for edit

> p4 diff -se

> p4 diff -sa
data.xml

使用revert只需将其恢复到之前的状态:

> p4 revert data.xml
//Depot/Stream/data.xml#19 - was edit, reverted

> p4 diff -sa

> p4 diff -se
data.xml

是什么给出的?我以前复制过这个文件而没有打开它进行编辑,这是偶然的。是否将其置于不可逆转的状态,可能与Windows权限有关?

我尝试删除文件(del data.xml)并再次获取,但Perforce创建的新副本也遇到了同样的问题。

2 个答案:

答案 0 :(得分:3)

有两种可能性浮现在脑海中:

  1. 服务器的文件校验和与其内容不匹配(这意味着diff将始终将其显示为不同)。您的管理员可以使用share命令进行检查。
  2. 文件中的行结尾不一致您有dos2unix LineEnd选项,无论何时从中读取,都会对每个文件进行隐式dos2unix行结束转换本地磁盘。如果\r是无操作,则文件将显示为相同;如果文件中有p4 verify个,那么它们的删除将显示为差异。
  3. 在任何一种情况下,提交都可能通过创建校验和来修复文件,该校验和与工作区中的任何内容相匹配 - 但是我建议进行管理员检查x,因为如果文件有变坏了它可能是一个更大问题的症状(磁盘故障等)。

答案 1 :(得分:0)

只需详细说明@Samwise的答案:

如果您的工作空间配置了行尾配置“ Shared”,但是某个时候某个文件被检入到带有Windows(CrLf)行尾的存储库中,那么将发生这种情况:

  • 在获取文件时,perforce会将其具有的/轨道的内容(文本文件,带有Windows行尾)完全保存到您的工作区中,因为“共享”规定不进行同步时间转换。
  • 如果要保存文件,它将把行尾转换为unix行尾(作为提交的一部分有效地运行“ dos2unix”)。
  • 因此,例如,当您运行“ reconcile”时,它会将这些Windows行结束文件突出显示为“本地修改”,并邀请您打开它们进行编辑并提交。

这种情况大概是出现在另一个用户,其工作空间配置为“ Unix”行结束模式时,实际上提交了Windows样式的文件。由于配置“ unix”根本不规定任何转换,因此“ Cr”字符已保存在服务器上。这可能是偶然的,也可能是故意的。

在这种情况下正确的行动方针似乎还不清楚:

  • 通过将“行尾字符”设置更改为“ unix”而不是“ shared”,可以“正确”协调工作;但是,您可能会冒风险,因为稍后自己不小心签入新的CrLf文件(假设您使用的是Windows,并且某些工具趋向于这种方式),就像以前的用户那样
  • 您真的可以将所有这些CrLf文件转换为Lf(通过使用“共享”工作区设置打开它们以进行编辑并提交它们,而无需进行更改),以防止将来再次出现此问题,但对于潜在的用户而言,这将是一个虚假的更改许多文件。如果工具中的任何内容实际上依赖于这些包含Cr字符的文件-例如,如果将它们与某些测试过程的输出进行校验和,则做错了

就个人而言,我将临时将工作空间设置从“共享”更改为“ unix”(仅用于协调操作),然后再切换回“共享”以进行日常强制使用。