Perforce p4取消搁置将导致“取消搁置”;重命名:。。。“拒绝许可”;

Perforce p4取消搁置将导致“取消搁置”;重命名:。。。“拒绝许可”;,perforce,windows-subsystem-for-linux,Perforce,Windows Subsystem For Linux,我在Windows 10上的WSL下使用p4。我通常可以使用其他操作,从打开文件进行编辑到上架等 现在我有了自己的搁置变更列表,即12345,我的工作区的当前状态是干净的。我想将此类变更列表中的所有搁置文件解除搁置到本地工作区中。我使用以下命令执行 p4 unshelve -s 12345 对于每个文件,结果与以下类似 //depot/mydir/myfile#22 - unshelved, opened for edit ... //depot/mydir/myfile#22 - also

我在Windows 10上的WSL下使用
p4
。我通常可以使用其他操作,从打开文件进行编辑到上架等

现在我有了自己的搁置变更列表,即
12345
,我的工作区的当前状态是干净的。我想将此类变更列表中的所有搁置文件解除搁置到本地工作区中。我使用以下命令执行

p4 unshelve -s 12345
对于每个文件,结果与以下类似

//depot/mydir/myfile#22 - unshelved, opened for edit
... //depot/mydir/myfile#22 - also opened by someone@someone_at_work
rename: /mnt/d/mydir/myfile: Permission denied
我尝试了
strace p4 unshelve-s 12345
,它似乎试图创建一个临时文件,
chmod
it,然后最后尝试将临时文件重命名为实际文件名,如工作区中所示。最后一步有“-1 EACCES(权限被拒绝)”,类似于以下内容

chmod("/mnt/d/mydir/tmp.1648.139747365556800.93", 0666) = 0
stat("/mnt/d/mydir/tmp.1648.139747365556800.93", {st_mode=S_IFREG|0777, st_size=16367, ...}) = 0
openat(AT_FDCWD, "/etc/localtime", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=2326, ...}) = 0
fstat(4, {st_mode=S_IFREG|0644, st_size=2326, ...}) = 0
read(4, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\t\0\0\0\t\0\0\0\0"..., 512) = 512
lseek(4, 347, SEEK_CUR)                 = 859
read(4, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\t\0\0\0\t\0\0\0\0"..., 512) = 512
read(4, ".\204\313\220\0\0\0\0/t\274\220\0\0\0\0000d\255\220\0\0\0\0001]\331\20\0\0\0\0"..., 512) = 512
read(4, "j\335T\220\0\0\0\0k\250[\220\0\0\0\0l\306q\20\0\0\0\0m\210=\220\0\0\0\0"..., 512) = 443
close(4)                                = 0
stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=2326, ...}) = 0
rename("/mnt/d/mydir/tmp.1648.139747365556800.93", "/mnt/d/mydir/myfile") = -1 EACCES (Permission denied)
write(2, "rename: /mnt/d/mydir/m"..., 90rename: /mnt/d/mydir/myfile: Permission denied
) = 90
brk(0x1b40000)                          = 0x1b40000
unlink("/mnt/d/mydir/tmp.1648.139747365556800.93") = 0
unlink("/mnt/d/mydir/tmp.1648.139747365556800.93") = -1 ENOENT (No such file or directory)
brk(0x1b30000)                          = 0x1b30000
gettimeofday({tv_sec=1596130958, tv_usec=871360}, NULL) = 0
尽管可能知道根本原因是什么,但我不知道我能做些什么使
p4
起作用。请注意,我的WSL用户名与P4用户名不同

更新

这个WSL非常接近我的问题,可能是因为WSL和p4之间的兼容性。感谢Samwise在评论中指出了正确的方向


更新2

我找到的解决办法是

  • 打开搁置更改列表中列出的所有文件进行编辑
  • 从搁置的变更列表中取消搁置文件
有了这个,我们需要做一些清理以获得实际的干净文件名。需要3个步骤,如下所示

  • p4 files@=12345|sed's/#.//g'| cut-d'/'-f5-| xargs-n1-I{}p4 edit-c 12345{}
    (从变更列表中获取文件列表,删除不相关的部分,删除文件路径中的前两个组件,然后逐个将此类文件编辑到搁置文件的变更列表
    12345
    )。注意:我们也可以删除
    cut-d'/'-f5-
    ,因为我测试了它,它仍然可以正常工作。您的流/视图路径可能很复杂,因此
    -f5-
    无法涵盖所有情况
  • p4取消搁置-s 12345
  • p4解析-af
    (或
    at
    获取他们的更改,或
    ay
    仅获取您的更改)
PS:使用
edit-c
非常重要,因为如果您编辑到默认变更列表中,您将无法搁置所有文件并再次更新它,因为perfoce无法检测到与该变更列表关联的任何搁置文件


更新3
如果使用WSL(1或2),那么我们可以通过直接使用
p4.exe
并在Windows文件系统中进行逻辑工作来避免应用变通方法。要使其正常工作,需要将
p4.exe客户端中的
Root:
属性修改为基于Windows文件系统。然后继续对所有其他命令使用
p4.exe

您是自己从源代码构建
p4
二进制文件并将其链接到WSL库,还是使用不一定支持WSL的预构建二进制文件?如果是后者,我会尝试前者;您可以从workshop.perforce.com获取来源。我没有使用WSL,但我记得Cygwin曾经有一个自定义的
p4
版本,这是处理Cygwin的ACL实现所必需的,我怀疑这里需要类似的东西。@Samwise这是一个很好的问题。我从这里下载,但选择了Linux x86平台。然后手动安装到WSL中。我现在正在尝试Cygwin…我对WSL了解不够,无法确定它与其他Linux发行版之间的兼容性有多好,但这似乎是一个潜在的问题。Cygwin上的
p4
似乎过时了,Cygwin包中没有可供下载的包
p4
source存在内部500错误,用户无法下载源代码,不确定您是否必须注册为我需要发送电子邮件的成员。顺便说一句,谢谢你给我指明了正确的方向。我一直在看。您应该可以将p4客户端指向workshop服务器并
p4 sync
,而无需注册帐户。