版本控制 - 你能“忽略”Perforce中的文件吗?

我有时会使用Perforce的P4V IDE中的“Reconcile Offline Work ...”功能来同步我在P4 depot断开连接时所处理的所有文件。 它启动另一个窗口,执行'Folder Diff'。

我有文件,我从来不想检查源代码控制(如在bin文件夹中找到的DLL,代码生成输出等)有没有办法过滤这些文件/文件夹出现可能是“新” 添加。 它们往往会混淆我真正感兴趣的文件列表.P4是否具有Subversion的“忽略文件”功能?

Ray Vega asked 2019-08-02T12:56:45Z
10个解决方案
58 votes

从2012.1版开始,Perforce支持P4IGNORE环境变量。 我更新了这个关于忽略目录的问题的答案,并解释了它的工作原理。 然后我注意到了这个答案,我猜这个答案现在多余了。


假设您有一个名为“CLIENT”的客户端,名为“foo”的目录(位于项目根目录下),并且您希望忽略该目录树中的所有.dll文件,则可以将以下行添加到工作区视图中以完成 这个:

-//depot/foo/*.dll //CLIENT/foo/*.dll
-//depot/foo/.../*.dll //CLIENT/foo/.../*.dll

第一行将它们从目录“foo”中删除,第二行将它们从所有子目录中删除。 现在,当您“协调脱机工作...”时,所有.dll文件将被移动到文件夹差异显示底部的“Excluded Files”文件夹中。 它们会让您失望,但如果您真的需要,仍然可以查看和操作它们。

你也可以用另一种方式来做,这会将你的“Excluded Files”文件夹减少到一个,但是你将无法操纵它包含的任何文件,因为路径会被破坏(但如果你只是想要它们 你的方式,没关系)。

-//depot/foo.../*.dll //CLIENT/foo.../*.dll
raven answered 2019-08-02T12:57:23Z
45 votes

对,但是。

Perforce版本2012.1增加了一个名为p4ignore的功能,灵感来自Git。 然而,Perforce开发人员在没有正当理由的情况下对行为进行了更改,恰好使该功能变得不那么有用。

虽然Git从所有p4ignore.txt文件中获取规则,但在环境变量p4ignore.txt中指定文件名之前,Perforce不知道在哪里查看。这种自由是一种诅咒。 您不能破解为其忽略文件使用不同名称的两个存储库。

此外,Perforce的忽略功能无法解决问题。 您可以轻松地为自己设置它,但除非明确选择加入,否则其他人不会受益。 没有意外提交不受欢迎文件的贡献者(例如,由构建脚本创建的p4ignore.txt文件夹)。

Git的忽略功能很棒,因为它可以解决问题。 如果将p4ignore.txt文件添加到存储库(每个人都这样做),他们将为每个人设计框。 没有人会不小心发布他们的私钥。

有趣的是,Perforce文档将“.p4ignore”显示为示例忽略规则,这是向后的! 如果规则有用,则应将它们作为存储库的一部分进行共享。


Perforce仍然可以在该功能上取得成功。 选择文件名的约定,例如p4ignore.txt,以便该功能可以使用该框。 删除P4IGNORE环境变量,这会适得其反。 编辑文档,鼓励开发人员共享有用的规则。 让用户在其主文件夹中的文件中编写个人规则,就像Git那样。

如果您认识Perforce的任何人,请发送电子邮件给他们。

Colonel Panic answered 2019-08-02T12:58:41Z
22 votes

这适用于Perforce 2013.1,新的P4IGNORE机制最初是在2012年版本中添加的,在Perforce博客中描述:

[https://www.perforce.com/blog/new-20121-p4ignore]

如当前所述,您将环境变量“P4IGNORE”设置为包含要忽略的文件列表的文件名。

所以你可以看一下,看看你喜欢它。

svec answered 2019-08-02T12:59:28Z
7 votes

如果您想要一个适用于所有工作空间而无需复制的解决方案,您(或您的系统管理员)可以通过使用p4保护表中的以下行来拒绝提交这些文件类型:

write user * * -//.../*.suo
write user * * -//.../*.obj
write user * * -//.../*.ccscc

我记得以前这样做,但我没有必要的权限来测试这里。 查看Perforce的系统管理员指南并试一试

Mike Burrows answered 2019-08-02T13:00:04Z
6 votes

从版本2011.1开始,Perforce Streams使忽略文件变得更加容易。 根据文档,您可以忽略目录中的某些扩展或某些路径。

来自p4 stream //stream_depot/stream_name

Ignored: Optional; a list of file or directory names to be ignored in
                 client views. For example:

                     /tmp      # ignores files named 'tmp'
                     /tmp/...  # ignores dirs named 'tmp'
                     .tmp      # ignores file names ending in '.tmp'

                 Lines in the Ignored field may appear in any order.  Ignored
                 names are inherited by child stream client views.

这基本上是@ raven的答案所指定的,但是使用流更容易,因为它使用该流自动传播到每个工作空间。 它还适用于从您指定忽略类型的流继承的任何流。

您可以通过p4 stream //stream_depot/stream_name编辑流,或者在p4v的流视图中右键单击流。

正如@svec所说,每个工作区指定忽略文件的能力即将推出,实际上是在P4 2012.1测试版中。

Chance answered 2019-08-02T13:00:58Z
3 votes

Will的建议使用.p4ignore似乎只适用于WebSphere Studio(P4WSAD)插件。 我只是在我的本地Windows框中尝试过它,我列出的任何文件和目录都没有被忽略。

在Perforce下,Raven建议修改客户端规范是正确的方法。 正确组织您的代码/数据/可执行文件和生成的输出文件将使得排除文件的过程变得更加容易。

作为一种更严格的方法,您始终可以编写提交触发器,如果它们包含特定文件或具有特定扩展名的文件等,则会拒绝提交更改列表。

Mark answered 2019-08-02T13:01:39Z
2 votes

历史回答 - 不再正确。 当时这是写的,这是真的;

您无法编写和签入服务器将用于制定忽略规则的文件; perforce中的常规glob或regexp文件模式忽略。

其他答案具有全局(而不是每个文件夹)的全局服务器配置。其他答案显示了可能对您有用的内容,如果您希望每个文件夹在视图中有一行与在该单个文件夹中要忽略的扩展数相对应,或者仅在WebSphere Studio插件中提供此功能,或者为服务器提供功能 管理员,但用户无法使用。

简而言之,我发现Perforce在这方面确实很弱。 虽然我很欣赏那些使用Eclipse插件的人可以使用.p4ignore,我认为这很棒,但是我们这些人不会在黑暗中离开。

更新:请参阅2012年中期添加的新P4IGNORE功能的已接受答案。

Warren P answered 2019-08-02T13:02:35Z
1 votes

我发现使用像这样的BASH脚本协调脱机工作最容易:

#!/bin/bash
# reconcile P4 offline work, assuming P4CLIENT is set
if [ -z "$P4CLIENT" ] ; then echo "P4CLIENT is not set"; exit 1; fi
unset PWD # confuses P4 on Windows/CYGWIN

# delete filew that are no longer present
p4 diff -sd ... | p4 -x - delete

# checkout files that have been changed.  
# I don't run this step.  Instead I just checkout everything, 
# then revert unchanged files before committing.
p4 diff -se ... | pr -x - edit

# Add new files, ignoring subversion info, EMACS backups, log files
# Filter output to see only added files and real errors
find . -type f \
 | grep -v -E '(\.svn)|(/build.*/)|(/\.settings)|~|#|(\.log)' \
 | p4 -x - add \
 | grep -v -E '(currently opened for add)|(existing file)|(already opened for edit)'

我从Perforce知识库文章中对此进行了调整。

kevin cline answered 2019-08-02T13:03:07Z
0 votes

我也在寻找类似于.p4ignore的解决方案(而不是一个与特定IDE绑定的解决方案)。 到目前为止,我发现的最接近的是p4delta。 听起来它会完全像原始海报所要求的那样,尽管是通过另一层间接。

[http://p4delta.sourceforge.net]

不幸的是,虽然这似乎产生了正确的文件列表,但我无法使“p4delta --execute”工作(“无法修改冻结的字符串”)并且项目未在一年内更新。 也许其他人会有更好的运气。

Derek Prior answered 2019-08-02T13:03:47Z
-1 votes

如果您使用的是Eclipse Perforce插件,那么插件文档列出了几种忽略文件的方法。

Deepak Sarda answered 2019-08-02T13:04:12Z
translate from https://stackoverflow.com:/questions/55449/can-you-ignore-a-file-in-perforce