我有一些文件我不想签入到源"/>

关于版本控制:你能在 Perforce 中”忽略”一个文件吗?

关于版本控制:你能在 Perforce 中”忽略”一个文件吗?

Can you "ignore" a file in Perforce?

我有时会使用 Perforce 的 P4V IDE 中的"协调脱机工作..."功能来同步我在与 P4 库断开连接时一直在处理的所有文件。它会启动另一个执行 \\'Folder Diff\\' 的窗口。

我有一些文件我不想签入到源代码管理中(比如在 bin 文件夹中找到的文件,例如 DLL、代码生成的输出等)。有没有办法过滤掉这些文件/文件夹,使其不显示为 "new " 可能会被添加。它们往往会弄乱我真正感兴趣的文件列表。P4 是否具有与 Subversion\\'s\\'ignore file\\' 功能等效的功能?


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

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

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

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

您也可以采用另一种方式,将您的"排除文件"文件夹减少到一个,但您将无法操作其中包含的任何文件,因为路径将损坏(但如果您只是想让它们远离你,没关系)。

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

是的,但是。

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

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

此外,Perforce 的忽略功能也不是现成的。您可以为自己轻松设置它,但除非他们明确选择加入,否则其他人不会受益。没有提交的贡献者可能会意外提交不受欢迎的文件(例如,由构建脚本创建的 bin 文件夹)。

Git 的忽略功能非常棒,因为它开箱即用。如果将 .gitignore 文件添加到存储库(每个人都这样做),他们将为每个人解决问题。没有人会意外地公开他们的私钥。

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

Perforce 仍然可以很好地利用该功能。为文件名选择一个约定,比如 p4ignore.txt,这样该功能就可以发挥作用。删除 P4IGNORE 环境变量,它会适得其反。编辑文档,鼓励开发者分享有用的规则。让用户像 Git 一样在其主文件夹中的文件中写入个人规则。

如果你认识 Perforce 的任何人,请发邮件给他们。


这在 Perforce 2013.1 中有效,新的 P4IGNORE 机制是在 2012.1 版本中首次添加的,在此处的 Perforce 博客中进行了描述:

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

正如目前所描述的,您将环境变量"P4IGNORE"设置为包含要忽略的文件列表的文件名。

所以你可以看看你喜欢它。


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

1
2
3
write user * * -//.../*.suo
write user * * -//.../*.obj
write user * * -//.../*.ccscc

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


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

来自 p4 help stream

1
2
3
4
5
6
7
8
9
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 中。


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

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

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


历史答案 - 不再正确。在最初写这篇文章的时候,这是真的;

您不能写入和签入??服务器将用来制定忽略规则的文件; perforce 中的一般 glob 或正则表达式文件模式忽略。

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

简而言之,我发现 Perforce 在这方面确实很弱。虽然我很欣赏那些使用 Eclipse 插件的人可以使用 .p4ignore,而且我认为这很棒,但它让我们这些不使用的人一无所知。

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/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 知识库文章。


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

http://p4delta.sourceforge.net

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


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


推荐阅读