Version control “你能”吗;“忽略”;Perforce中的文件?

Version control “你能”吗;“忽略”;Perforce中的文件?,version-control,perforce,ignore,Version Control,Perforce,Ignore,我有时会使用Perforce的P4V IDE中的“协调脱机工作…”功能来同步我在与P4仓库断开连接时一直在处理的任何文件。它启动另一个执行“文件夹差异”的窗口 我有一些我从来都不想签入源代码管理的文件(比如在bin文件夹中找到的文件,比如dll、代码生成的输出等等)。有没有办法过滤掉那些可能被添加为“新”的文件/文件夹。他们往往会把我真正感兴趣的文件列表弄得乱七八糟。P4是否具有Subversion的“忽略文件”功能 自2012.1版起,Perforce支持P4IGNORE环境变量。我更新了我的

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


我有一些我从来都不想签入源代码管理的文件(比如在bin文件夹中找到的文件,比如dll、代码生成的输出等等)。有没有办法过滤掉那些可能被添加为“新”的文件/文件夹。他们往往会把我真正感兴趣的文件列表弄得乱七八糟。P4是否具有Subversion的“忽略文件”功能

自2012.1版起,Perforce支持
P4IGNORE
环境变量。我更新了我的答案,解释了它是如何工作的。然后我注意到这个答案,我想这是多余的


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

-//depot/foo/*.dll //CLIENT/foo/*.dll -//depot/foo/.../*.dll //CLIENT/foo/.../*.dll -//depot/foo/*.dll//CLIENT/foo/*.dll -//depot/foo/../../*.dll//CLIENT/foo/../../*.dll 第一行从目录“foo”中删除它们,第二行从所有子目录中删除它们。现在,当您“协调脱机工作…”时,所有.dll文件都将移动到位于文件夹差异显示底部的“排除文件”文件夹中。他们将远离你的方式,但仍然可以查看和操纵他们,如果你真的需要

你也可以用另一种方法,这将把你的“排除的文件”文件夹减少到一个,但是你将无法操作它包含的任何文件,因为路径将被破坏(但是如果你只是想让它们离开你的路,那没关系)

-//仓库/foo…/*.dll//CLIENT/foo…/*.dll
威尔关于使用
.p4ignore
的建议似乎只适用于WebSphereStudio(P4WSAD)插件。我只是在我的本地windows框上尝试了一下,我列出的所有文件和目录都没有被忽略

Raven建议修改您的客户规范是Performce下的正确方法。对代码/数据/可执行文件和生成的输出文件进行适当的组织将使文件的签入排除过程更加容易


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

如果您使用的是Eclipse Perforce插件,然后列出几种忽略文件的方法。

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

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

我记得以前做过这个,但是我没有必要的权限在这里测试这个。查看并试用历史答案-不再正确。在最初写这篇文章的时候,它是真实的

您不能写入和签入服务器将用于创建忽略规则的文件;perforce中忽略常规全局或regexp文件模式

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

简言之,我发现这方面的表现确实很弱。虽然我很感激那些使用Eclipse插件的人可以使用
.p4ignore
,我认为这很好,但它却让我们这些不使用Eclipse插件的人蒙在鼓里


更新:请参阅2012年年中添加的新P4IGNORE功能的公认答案。

我发现使用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)'

我将其改编自。

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


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

从Performce 2013.1开始,新的P4IGNORE机制首次在2012.1版中添加,在Performce博客上描述如下:

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


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

p4帮助流

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\u depot/stream\u name
或在p4v的流视图中右键单击流来编辑流

正如@svec所指出的,为每个工作区指定忽略文件的功能很快就会出现,事实上是这样的

Perforce 2012.1版添加了一个名为的功能,其灵感来自Git。然而,Perforce开发人员在没有正当理由的情况下对行为进行了更改,这恰好使该功能的实用性大大降低

虽然Git从所有文件中获取规则,但在环境变量
P4中指定文件名之前,Perforce不知道在哪里查找
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.