我们使用Visual Studio,它生成许多bin
和obj
目录。当我使用 P4V 的“协调脱机工作”功能时,这些功能会显示在“不在软件仓库中的本地文件”列表中。
我想排除它们。我找到了this question,但是它谈到了文件,当我尝试它的建议时(将以下内容添加到我的工作区视图中),它不起作用:
//depot/Foo/... //Client/Foo/...
-//depot/Foo/.../*.user //Client/Foo/.../*.user
-//depot/Foo/.../bin/... //Client/Foo/.../bin/...
-//depot/Foo/.../obj/... //Client/Foo/.../obj/...
它实际上似乎不适用于文件:foo.csproj.user文件仍显示在列表中。
我可以从P4V中排除目录吗?如果是这样,怎么样?我做错了什么?
答案 0 :(得分: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
请务必使用绝对路径! Perforce documentation未指定此内容且我的第一次尝试无效(在Windows上无论如何),因为我没有指定绝对路径
执行此操作后,任何添加忽略列表中的文件或目录的尝试都将被拒绝,您将看到诸如此类的警告(它们确实为您提供了抑制选项):
如果您使用的是2012.1之前版本的Perforce服务器,您仍可以在客户端规范中执行此操作。您的排除规则的语法只是一点点。你想要的是这个:
-//depot/Foo.../*.user //Client/Foo.../*.user -//depot/Foo...bin/... //Client/Foo...bin/... -//depot/Foo...obj/... //Client/Foo...obj/...
注意“Foo”之后和“bin”和“obj”之前的斜杠。
答案 1 :(得分:7)
更新回答: 这在过去有点棘手,因为没有内置的方法从Perforce命令中排除目录。自2012年以来,这已发生变化 您可以查看a nice perforce article for this problem。
从2012.1开始,P4IGNORE
环境变量可以设置为指定用于从Perforce中排除文件的文件。 Perforce Server(p4d)和客户端(p4,P4V)都需要为2012.1或更高版本。 P4IGNORE
的目的是在将新文件添加到库并协调工作空间时忽略文件。与其他版本控制系统中的类似功能一样,P4IGNORE不能用于忽略存储库控制下的文件。
P4Eclipse按照自己的条件管理.p4ignore
个文件。
(参见关于这一点的手册here)
使用客户端视图排除文件和目录:
在Perforce中排除文件和目录的传统方法是使用排除客户端映射。有关完整文档,请参阅视图的命令参考。示例视图:
查看:
//depot/... //test_ws/depot/...
-//depot/dir/etc/... //test_ws/depot/dir/etc/...
此视图将阻止将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.
或者,您可以使用shell命令根据需要过滤输出。
p4 files //depot/dir/... |
awk -F# '{print $1}' |
grep -v "//depot/dir/etc/" |
p4 -x - fstat
在“//depot/dir/
”下的所有文件上运行p4 fstat,但“//depot/dir/etc/
”下的文件除外。通过列出所有文件,然后使用grep删除要排除的目录下的那些文件来完成此目录排除。 “//depot/dir/etc/
”中的尾部斜杠是必要的,以防止“//depot/dir/
”下以“etc”开头的匹配目录(例如,“//depot/dir/etc2009
”)。
注意:强>
awk命令假定没有包含“#”字符的文件名。 grep命令还可以从文件中读取其模式,如果需要排除多个目录,这将非常有用。 我们使用'-x - '标志和p4命令将输入用作相应命令的参数;有关详细信息,请参阅Perforce命令行全局选项。
答案 2 :(得分:6)
有一种方法可以直接在Perforce中执行:
导航项目树。 右键单击文件或文件夹。 选择包含或排除文件,文件夹,整个树。
答案 3 :(得分:3)
这对我很有用:
//depot/... //my_workspace_name/...
-//depot/.../.git/... //my_workspace_name/.../.git/...
-//depot/.../xcuserdata/... //my_workspace_name/.../xcuserdata/...
-//depot/.../xcschemes/... //my_workspace_name/.../xcschemes/...
-//depot/.../xcdebugger/... //my_workspace_name/.../xcdebugger/...
答案 4 :(得分:1)
这可能不相关,但如果您的任何路径中有空格,则需要确保将它们正确地封入“”,但不要将 - 括在引号内。
答案 5 :(得分:-1)
我会继续进行协调离线工作并完成除提交之外的所有工作。在提交之前,请执行以下操作:
p4 revert // Client / Foo /.../*。user
p4 revert // Client / Foo /.../ bin /...
p4 revert // Client / Foo /.../ obj /...
它不是自动化的,但这是我现在能想到的最好的。