你能"忽略"P4V中的目录吗?

Rog*_*mbe 49 perforce

我们使用Visual Studio,它生成许多binobj目录.当我使用P4V的"协调脱机工作"功能时,这些功能会出现在"不在软件仓库中的本地文件"列表中.

我想排除它们.我发现了这个问题,但是这涉及到文件,当我尝试它的建议时(将以下内容添加到我的工作区视图中),它不起作用:

//depot/Foo/... //Client/Foo/...
-//depot/Foo/.../*.user //Client/Foo/.../*.user
-//depot/Foo/.../bin/... //Client/Foo/.../bin/...
-//depot/Foo/.../obj/... //Client/Foo/.../obj/...
Run Code Online (Sandbox Code Playgroud)

它实际上似乎不适用于文件:foo.csproj.user文件仍然显示在列表中.

我可以从P4V中排除目录吗?如果是这样,怎么样?我究竟做错了什么?

rav*_*ven 73

从2012.1版开始,Perforce支持P4IGNORE环境变量.这允许您指定的文件和目录使用搜索命令时忽略或添加新的文件(p4 add,p4 status,和p4 reconcile).

要使用忽略文件,请在工作区的根目录中创建一个文件,并为其指定一些有意义的名称.该约定似乎类似于.ignore.p4ignore,但任何事情都可以(我使用p4ignore.txt以便我可以通过简单的双击来编辑它).然后用你的忽略规则填充它.以下将忽略Visual Studio生成的不需要的碎片:

# directories
bin
obj

# files
*.suo
*.user

创建此文件后,将P4IGNORE环境变量设置为指向它.在命令行中,键入以下内容:

p4 set P4IGNORE=C:\somepath\p4ignore.txt
Run Code Online (Sandbox Code Playgroud)

一定要使用绝对路径!Perforce的文件没有规定这一点,我第一次尝试没有工作(在Windows反正),因为我没有指定一个绝对路径.

执行此操作后,任何添加忽略列表中的文件或目录的尝试都将被拒绝,您将看到此类警告(它们确实为您提供了禁止选项):

P4V'忽略'文件消息


如果您使用的是2012.1之前的Perforce服务器版本,则仍可以在客户端规范中执行此操作.您的排除规则的语法只是一点点.你想要的是这个:

-//depot/Foo.../*.user //Client/Foo.../*.user
-//depot/Foo...bin/... //Client/Foo...bin/...
-//depot/Foo...obj/... //Client/Foo...obj/...

注意"Foo"之后和"bin"和"obj"之前丢失的斜杠.

  • 不要将`P4IGNORE`设置为绝对路径.将其设置为*文件名*.例如,`p4 set P4IGNORE = .gitignore`.然后你可以将这个名字的文件放在任何相关的目录和子目录中,Perforce会识别它​​们,类似于git和`.gitignore`. (8认同)
  • @Hans我所说的是,当你不使用绝对路径时,Perforce似乎在每个目录中查找文件名(即`.gitignore`),就像git一样.换句话说,整个工作区不需要单个文件.试试吧......我很惊喜!(请注意,Perforce的解析/处理与git不同,因此行为不相同,特别是对于通配符和子目录.) (4认同)
  • 使用P4V 2010.2为我工作 (3认同)
  • 这仍然需要所有开发人员设置P4IGNORE envar.是否没有客户端会遵守的默认忽略文件?(很像git的.gitignore文件) (3认同)

Tha*_*ama 7

更新的答案:这在过去有点棘手,因为没有内置的方法从Perforce命令中排除目录.自2012年以来,这已发生变化 你可以看看这个问题的一篇很好的perforce文章.

从2012.1开始,P4IGNORE可以设置环境变量以指定用于从Perforce中排除文件的文件.Perforce Server(p4d)和客户端(p4,P4V)都需要为2012.1或更高版本. P4IGNORE的目的是在将新文​​件添加到库和协调工作空间时忽略文件.与其他版本控制系统中的类似功能一样,P4IGNORE不能用于忽略存储库控制下的文件.

P4Eclipse .p4ignore按照自己的条件管理文件.(请参阅此处有关此点的手册)

使用客户端视图排除文件和目录:

在Perforce中排除文件和目录的传统方法是使用排除客户端映射.有关完整文档,请参阅视图的命令参考.示例视图:

视图:

//depot/... //test_ws/depot/...
-//depot/dir/etc/... //test_ws/depot/dir/etc/...
Run Code Online (Sandbox Code Playgroud)

此视图将阻止将dir/etc中的文件添加到库中.如果尝试从只读查询中排除目录,请使用客户端或相对语法.

$ p4 files //depot/dir/etc/...
//depot/dir/etc/foo#1 - add change 1186 (text)
//depot/dir/etc/bar#1 - add change 1186 (text) 


$ p4 files //test_ws/dir/etc/...
//test_ws/test_ignore/ignoredir/... - file(s) not in client view. 

$ cd dir/etc
$ p4 files ...
... - file(s) not in client view.
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用shell命令根据需要过滤输出.

p4 files //depot/dir/... |
    awk -F# '{print $1}' |
    grep -v "//depot/dir/etc/" |
    p4 -x - fstat
Run Code Online (Sandbox Code Playgroud)

它在" //depot/dir/" 下的所有文件上运行p4 fstat ,但" //depot/dir/etc/" 下的文件除外.通过列出所有文件,然后使用grep删除要排除的目录下的那些文件来完成此目录排除." //depot/dir/etc/"中的尾部斜杠是必要的,以防止在" //depot/dir/"以"etc"开头的匹配目录(例如," //depot/dir/etc2009").

注意:

awk命令假定没有包含"#"字符的文件名.grep命令还可以从文件中读取其模式,如果您需要排除多个目录,这将非常有用.我们使用'-x - '标志和p4命令将输入​​用作相应命令的参数; 有关详细信息,请参阅Perforce命令行全局选项.

  • 为什么公司为此付钱? (61认同)
  • 这个答案不再正确.见[这个答案](http://stackoverflow.com/a/3103898/4228). (7认同)
  • 嘎.这很可怕,但可能是做我想做的最好的方式.我稍后会给它一个旋转. (2认同)

Cli*_*ent 7

有一种方法可以直接在Perforce中执行:

  • 连接菜单
  • 编辑当前工作区...

导航项目树.右键单击文件或文件夹.选择包括或排除文件,文件夹,整个树.

  • 仅当您的工作区与树视图兼容时,这才有效。所讨论的那个人不是。 (2认同)