我有时会使用Perforce的P4V IDE中的“协调脱机工作...”功能来同步我在与P4软件仓库断开连接时所处理的所有文件。它启动另一个执行“文件夹差异”的窗口。
我有文件我从不想检查源代码控制(比如在bin文件夹中找到的文件,如DLL,代码生成输出等)有没有办法过滤掉那些文件/文件夹,从而显示为“new”可能会添加。它们往往会混淆我真正感兴趣的文件列表.P4是否具有Subversion的“忽略文件”功能?
答案 0 :(得分:58)
从2012.1版开始,Perforce支持P4IGNORE
环境变量。我更新了this question about ignoring directories的答案并解释了它的工作原理。然后我注意到了这个答案,我现在认为这是多余的。
假设您有一个名为“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
答案 1 :(得分:45)
是的,但是。
Perforce版本2012.1增加了一项名为p4ignore的功能,受Git的启发。然而,Perforce开发人员在没有任何理由的情况下对行为进行了更改,这恰好使该功能变得不那么有用。
虽然Git从所有.gitignore
文件中获取规则,但在环境变量P4IGNORE
中指定文件名之前,Perforce不知道在哪里查看。这种自由是一种诅咒。您不能破解为其忽略文件使用不同名称的两个存储库。
此外,Perforce的忽略功能无法解决问题。您可以轻松地为自己设置它,但除非明确选择加入,否则其他人不会受益。没有意外提交不受欢迎文件的贡献者(例如,由构建脚本创建的bin
文件夹)。
Git的忽略功能很棒,因为它可以解决问题。如果将.gitignore
文件添加到存储库(everyone does this),它们将为每个人设置框。没有人会不小心发布他们的私钥。
有趣的是,Perforce docs显示'.p4ignore'作为示例忽略规则,这是向后的!如果规则有用,则应将它们作为存储库的一部分进行共享。
Perforce仍然可以在这项功能上取得成功。选择文件名的约定,例如p4ignore.txt
,这样该功能就可以解决问题。删除P4IGNORE
环境变量,这会适得其反。编辑文档,鼓励开发人员共享有用的规则。让用户在其主文件夹as Git does中的文件中编写个人规则。
如果您认识Perforce的任何人,请发送电子邮件给他们。
答案 2 :(得分:22)
这与Perforce 2013.1一样,新的P4IGNORE机制最初是在2012年发布的版本中添加的,在Perforce博客中描述:
如前所述,您将环境变量“P4IGNORE”设置为包含要忽略的文件列表的文件名。
所以你可以查看一下,看看你喜欢它。
答案 3 :(得分:7)
如果您想要一个适用于所有工作空间而无需复制的解决方案,您(或您的系统管理员)可以通过使用p4保护表中的以下行来拒绝提交这些文件类型: / p>
write user * * -//.../*.suo
write user * * -//.../*.obj
write user * * -//.../*.ccscc
我记得以前这样做过,但我没有必要的权限来测试这个。查看Perforce's Sysadmin guide然后试一试
答案 4 :(得分:6)
从版本2011.1开始,Perforce Streams使忽略文件变得更加容易。根据{{3}},您可以忽略目录中的某些扩展名或某些路径。
来自p4 help stream
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所说,每个工作区指定忽略文件的能力即将到来,实际上是在documentation,
答案 5 :(得分:3)
Will建议使用.p4ignore
似乎只适用于WebSphere Studio(P4WSAD)插件。我刚刚在我的本地Windows框中尝试过它,我列出的所有文件和目录都被忽略了 。
Raven建议修改客户端规范是Perforce下的正确方法。正确组织您的代码/数据/可执行文件和生成的输出文件将使得排除文件的过程变得更加容易。
作为一种更严苛的方法,您始终可以编写提交触发器,如果它们包含特定文件或具有特定扩展名的文件等,则会拒绝提交更改列表。
答案 6 :(得分:2)
历史回答 - 不再正确。当时这是最初写的,这是真的;
您无法编写和签入服务器将用于制定忽略规则的文件; perforce中的常规glob或regexp文件模式忽略。
其他答案的全局服务器配置是全局的(而不是每个文件夹)。 其他答案显示可能适合您的事项,如果您希望每个文件夹在视图中有一行与在该单个文件夹中要忽略的扩展数相对应,或者仅在WebSphere Studio插件中提供此功能,或者为服务器提供功能管理员,但用户无法使用。
简而言之,我觉得Perforce在这方面确实很弱。虽然我很欣赏那些使用Eclipse插件的人可以使用.p4ignore
,但我认为这很好,它让我们这些人不在黑暗中。
更新:请参阅2012年年中添加的新P4IGNORE功能的已接受答案。
答案 7 :(得分:1)
我发现使用像这样的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)'
答案 8 :(得分:0)
我正在寻找类似于.p4ignore的解决方案(而不是与特定IDE绑定的解决方案)。到目前为止,我发现的最接近的是p4delta。这听起来像是原始海报所要求的,尽管是通过另一层间接。
http://p4delta.sourceforge.net
不幸的是,虽然这似乎产生了正确的文件列表,但我无法使“p4delta --execute”工作(“无法修改冻结的字符串”)并且该项目未在年份更新。也许其他人会有更好的运气。
答案 9 :(得分:-1)
如果您使用的是Eclipse Perforce插件,那么the plugin documentation列出了几种忽略文件的方法。