您可以“忽略” Perforce中的文件吗?


101

有时我会使用Perforce的P4V IDE中的“协调离线工作...”功能来同步与P4软件仓库断开连接时正在处理的所有文件。它启动另一个执行“文件夹差异”的窗口。

我有一些我永远不想检入源代码管理的文件(例如在bin文件夹中找到的文件,例如DLL,代码生成的输出等)。是否有一种方法可以过滤掉那些文件/文件夹,使其不显示为“ new”(可能是)添加。它们往往使我真正感兴趣的文件列表变得混乱。P4是否具有Subversion的“忽略文件”功能的等效功能?


您能否提供CVS输出的​​示例,以便我们了解您的意思,以及为什么给出的答案没有达到您想要的目的?
格雷格·惠特菲尔德

2
在Perforce创意的论坛上,您可以对有关Git样式的忽略列表的建议进行投票p4ideax.com/ideas/15/ignore-support
Panic Panic

点击“协调离线工作”,取消勾选“本地文件不在仓库中”,按“协调”。只要您不添加文件,那么它可能是最快的解决方法。
2015年

Answers:


59

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


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

-// depot / foo / *。dll //客户端/foo/*.dll
-// depot / foo /.../*。dll //客户端/foo/.../*.dll

第一行将其从目录“ foo”中删除,第二行将其从所有子目录中删除。现在,当您“协调脱机工作...”时,所有.dll文件都将移动到文件夹diff显示底部的“已排除文件”文件夹中。它们将不碍您使用,但如果您确实需要,它们仍然可以查看和操作它们。

您也可以使用另一种方法,将“ Excluded Files”文件夹减少到一个,但由于路径已损坏,您将无法操作其中包含的任何文件(但是如果您希望将它们删除)以您的方式,没关系)。

-// depot / foo ... / *。dll //客户端/foo.../*.dll

30
尽管这行得通,但并不是很有用,因为您必须将这些行放入您创建的每个工作区中。
dgrant

6
注意:这对于从p4v进行的正常协调脱机工作不起作用。“排除的文件”似乎只在“高级”协调窗口中……
Catskul 2010年

6
排除过滤器在Reconcile Offline Work对话框中不起作用。如果您在内部将其打开,它确实可以工作,Advanced Reconcile...但这是没有用的,因为在99.9%的时间中,您不需要或不想使用高级对话框。
索林2010年

12
@raven:1)(示例:)某些项目在每个项目下使用bin / obj文件夹,而不是将它们放在中央位置。(通用结论:) Perforce假设所有中间文件都放置在易于排除的工作空间位置中,这对于要制作的VCS来说是不必要的限制性设计。2)有些项目在目录结构中涉及本地缓存和/或其他按用户生成的文件(例如,*。ncb IntelliSense缓存)。无法将它们作为通用策略排除在外会严重损害“协调脱机工作”和“差异文件夹”功能。
山姆·哈威尔

6
这个特殊的问题使我丧命。
沃伦·P

47

对,但是。

Perforce 2012.1版本添加了一个受Git启发的称为p4ignore的功能。但是,Perforce开发人员在没有任何理由的情况下对行为进行了更改,这恰巧使该功能的实用性大大降低。

虽然Git从所有.gitignore文件中获取规则,但是Perforce直到在环境变量中指定文件名后才知道要查找的位置P4IGNORE。这种自由是一种诅咒。您无法破解两个使用不同名称作为其忽略文件的存储库。

此外,Perforce的忽略功能无法正常使用。您可以为自己设置足够容易的设置,但是其他人除非明确选择加入,否则不会从中受益。尚未提交的贡献者可能会意外提交不受欢迎的文件(例如,bin由构建脚本创建的文件夹)。

Git的ignore功能很棒,因为它可以解决问题。如果将.gitignore文件添加到存储库(每个人都这样做),它们将为所有人解决问题。没有人会意外地发布其私钥。

有趣的是,Perforce文档将 “ .p4ignore”显示为示例忽略规则,这是倒退的!如果这些规则有用,则应将其作为存储库的一部分共享。


Perforce仍然可以在该功能上发挥作用。选择文件名的约定,例如p4ignore.txt,这样该功能就可以解决。删除P4IGNORE环境变量,将适得其反。编辑文档,以鼓励开发人员共享有用的规则。与Git一样,让用户将个人规则写入其主文件夹中的文件中。

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


2
感谢您的澄清。我尝试将.p4ignore与P4VS结合使用,但是我的应该被忽略的解决方案却未被忽略。首先我以为我做错了什么。现在我知道了。
Michael S.

1
@gentlesea,从Perforce 2013.1开始,忽略功能最终在图形应用程序中起作用。
Panic Panic


1
对于因使用的工作空间而异的配置变量,请尝试使用P4CONFIG文件。然后,当您在工作空间之间移动时,可以让您的P4CONFIG文件指定一个不同的P4IGNORE值。
Bryan Pendleton

2
Perforce不知道如何构建适当的软件,甚至连基础知识都没有。这就是为什么每个坚持perforce的人都梦想着转向git的原因。
帕维尔P

22

此功能自Perforce 2013.1起起作用,新的P4IGNORE机制于2012.1版本中首次添加,在Perforce博客上对此进行了描述:

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

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

因此,您可以检查一下以了解您的喜好。


1
您还可以包括目录名称,而不仅仅是文件名。
ashes999

如前所述:不幸的是,您必须设置P4IGNORE。
Technophile

1
我修复了@DerMike链接-我猜Perforce更改了他们的博客URL。
svec

7

如果您想要一种无需复制即可应用于所有工作空间的解决方案,则您(或您的sysadmin)可以通过使用p4保护表中的以下代码行拒绝提交这些文件类型:

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

我记得以前曾经做过,但是我没有必要的权限在这里进行测试。查阅Perforce的Sysadmin指南并尝试一下


3
不幸的是,这会导致提交错误,而不是使协调视图被忽略。因此,它可以将某些文件排除在存储库之外,但不能帮助您的用户避免杂音。
沃伦·P

6

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

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所指出的,即将在每个工作空间中指定忽略文件的功能即将出现,并且实际上是在P4 2012.1 beta中。


是的,这对我来说可以在团队中共享“忽略”设置(我使用的是p4 2013.2)。请注意,它仅在启用了流的软件仓库中起作用。(如果您可以在团队中传播P4IGNORE = .p4ignore环境变量,那可能是最好的解决方案。)
yoyo

1
请注意,流的“忽略”字段可用于忽略特定的文件夹,文件或文件扩展名,但是通配符支持受到限制,并且无法忽略整个文件夹,然后“忽略”特定的文件或子文件夹。(从p4服务器版本2013.2开始)
yoyo 2014年

3

威尔(Will)建议.p4ignore仅使用WebSphere Studio(P4WSAD)插件。我只是在本地Windows框上尝试过,所有列出的文件和目录都不会被忽略。

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

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


15
我完全不同意整个“代码的正确组织...”声明。事实是,遵循Perforce编辑工作区的约定要求每个用户进行更改。而真正的.p4ignore文件将仅创建/管理一次。
迈克,

9
哦,更不用说了,您想分支代码吗?祝您在每个分支机构都能保持工作空间。这听起来很有趣!
迈克

2

历史答案-不再正确。在最初编写时,这是真的。

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

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

简而言之,我发现Perforce在这方面确实很薄弱。尽管我赞赏使用Eclipse插件的人可以使用.p4ignore,并且我认为这很棒,但它却使我们中那些不愿意使用的人陷入了黑暗。

更新:请参见2012年中新增的P4IGNORE功能的可接受答案。


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)'

我从Perforce知识库文章中对此进行了改编。


那是七年前,我并不感到惊讶。我很惊讶任何人仍在使用Perforce。
凯文·克莱恩

...不是通过选择:'(
DerMike

0

我也在寻找类似.p4ignore的解决方案(而不是与特定IDE绑定的解决方案)。到目前为止,我发现的最接近的东西是p4delta。听起来它将完全按照原始发布者的要求进行操作,即使通过另一层间接操作也是如此。

http://p4delta.sourceforge.net

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.