882 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			882 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								title: Perforce Helix Core搭建
							 | 
						|||
| 
								 | 
							
								date: 2022-12-21 14:51:55
							 | 
						|||
| 
								 | 
							
								excerpt: 
							 | 
						|||
| 
								 | 
							
								tags: Perforce 
							 | 
						|||
| 
								 | 
							
								rating: ⭐
							 | 
						|||
| 
								 | 
							
								---
							 | 
						|||
| 
								 | 
							
								# 前言
							 | 
						|||
| 
								 | 
							
								- 知乎
							 | 
						|||
| 
								 | 
							
									- P4服务器部署、配置、备份流程详解 https://zhuanlan.zhihu.com/p/676332084
							 | 
						|||
| 
								 | 
							
								# Perforce Docker
							 | 
						|||
| 
								 | 
							
								可以使用这个容器:
							 | 
						|||
| 
								 | 
							
								https://hub.docker.com/r/sourcegraph/helix-p4d
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								但这个容器是2020年构建的,我这里重新调整了一下,并且手动构建成功,具体可以参考下文。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## DockerFile构建
							 | 
						|||
| 
								 | 
							
								大致步骤如下:
							 | 
						|||
| 
								 | 
							
								1. 下载**blueroseslol/helix-docker**仓库的所有文件。
							 | 
						|||
| 
								 | 
							
								2. 构建DockerFile。
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								cd /home/perforce/helix-docker/helix-p4d/ && \
							 | 
						|||
| 
								 | 
							
								docker build -f /home/perforce/helix-docker/helix-p4d/Dockerfile -t helix-p4d:2024.5 .
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								 docker build --file ./helix-p4d/Dockerfile --tag helix-p4d:2023.7 .
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## 使用
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								docker run -d --name helix-p4d\
							 | 
						|||
| 
								 | 
							
								    -p 1666:1666 \
							 | 
						|||
| 
								 | 
							
								    -v /home/perforce/p4:/p4 \
							 | 
						|||
| 
								 | 
							
								    helix-p4d:2024.5
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								docker run -d \
							 | 
						|||
| 
								 | 
							
								    -p 1666:1666 \
							 | 
						|||
| 
								 | 
							
								    -v /home/perforce/p4:/p4 \
							 | 
						|||
| 
								 | 
							
								    sourcegraph/helix-p4d:2020.2
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								admin
							 | 
						|||
| 
								 | 
							
								pass12349ers
							 | 
						|||
| 
								 | 
							
								### Github文档
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								docker run --rm \
							 | 
						|||
| 
								 | 
							
								    --publish 1666:1666 \
							 | 
						|||
| 
								 | 
							
								    sourcegraph/helix-p4d:2020.2
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								默认端口`:1666`, 默认用户名为 `admin`, 默认密码: `pass12349ers`。以下是所有配置的默认值。
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								NAME=perforce-server
							 | 
						|||
| 
								 | 
							
								P4HOME=/p4
							 | 
						|||
| 
								 | 
							
								P4NAME=master
							 | 
						|||
| 
								 | 
							
								P4TCP=1666
							 | 
						|||
| 
								 | 
							
								P4PORT=1666
							 | 
						|||
| 
								 | 
							
								P4USER=admin
							 | 
						|||
| 
								 | 
							
								P4PASSWD=pass12349ers
							 | 
						|||
| 
								 | 
							
								P4CASE=-C0
							 | 
						|||
| 
								 | 
							
								P4CHARSET=utf8
							 | 
						|||
| 
								 | 
							
								JNL_PREFIX=perforce-server
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								可以使用`--env` 覆盖上述环境变量:
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								docker run --rm \
							 | 
						|||
| 
								 | 
							
								    --publish 1666:1666 \
							 | 
						|||
| 
								 | 
							
								    --env P4USER=amy \
							 | 
						|||
| 
								 | 
							
								    --env P4PASSWD=securepassword \
							 | 
						|||
| 
								 | 
							
								    sourcegraph/helix-p4d:2020.2
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								请注意,尽管服务器在重启后仍能存活(即数据被保留),但如果你在初始启动后(即镜像的第一次运行,在选项被硬编码为Perforce Helix核心服务器自身配置时)改变选项,它可能会中断。要启动一个长期运行的生产容器,记得要把数据目录(`P4HOME`)容器,把`--rm`标志换成`d`(分离):
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								docker run -d \
							 | 
						|||
| 
								 | 
							
								    --publish 1666:1666 \
							 | 
						|||
| 
								 | 
							
								    --env P4PASSWD=securepassword \
							 | 
						|||
| 
								 | 
							
								    --volume ~/.helix-p4d-home:/p4 \
							 | 
						|||
| 
								 | 
							
								    sourcegraph/helix-p4d:2020.2
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 启用SSL
							 | 
						|||
| 
								 | 
							
								首先生成自签名证书:
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								mkdir ssl
							 | 
						|||
| 
								 | 
							
								pushd ssl
							 | 
						|||
| 
								 | 
							
								openssl genrsa -out privatekey.txt 2048
							 | 
						|||
| 
								 | 
							
								openssl req -new -key privatekey.txt -out certrequest.csr
							 | 
						|||
| 
								 | 
							
								openssl x509 -req -days 365 -in certrequest.csr -signkey privatekey.txt -out certificate.txt
							 | 
						|||
| 
								 | 
							
								rm certrequest.csr
							 | 
						|||
| 
								 | 
							
								popd
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								接下来设置SSL文件映射目录也就是`P4SSLDIR`的值,并且设置`P4PORT`使用SSL。
							 | 
						|||
| 
								 | 
							
								```shell
							 | 
						|||
| 
								 | 
							
								docker run --rm \
							 | 
						|||
| 
								 | 
							
								    --publish 1666:1666 \
							 | 
						|||
| 
								 | 
							
								    --env P4PORT=ssl:1666 \
							 | 
						|||
| 
								 | 
							
								    --env P4SSLDIR=/ssl \
							 | 
						|||
| 
								 | 
							
								    --volume ./ssl:/ssl \
							 | 
						|||
| 
								 | 
							
								    sourcegraph/helix-p4d:2023.1
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 时间显示问题
							 | 
						|||
| 
								 | 
							
								1. 修改容器内系统时区。
							 | 
						|||
| 
								 | 
							
								2. 修改P4V时间显示,Edit - Preferences - Display - Show date andtime as,Server time => Local time。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								##### Docker容器修改时间
							 | 
						|||
| 
								 | 
							
								方法一:配置Dockerfile镜像时修改,这样打包出来的镜像文件是需要的时区的。
							 | 
						|||
| 
								 | 
							
								操作方式:Dockerfile中添加代码
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								# 在安装tzdata之前最好先update和upgrade,以防apt-get获取不到tzdata
							 | 
						|||
| 
								 | 
							
								RUN apt-get update -y && apt-get upgrade -y
							 | 
						|||
| 
								 | 
							
								# 安装,中国用户填写[Asia/Shanghai] ,表示亚洲/上海 ,东八区
							 | 
						|||
| 
								 | 
							
								RUN apt-get install -y tzdata && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								缺点:由于构建时需要更新ubuntu,所以需要需要网络支持,网络不好的时候拖累构建镜像的速度。亲测,在中国白天速度快,晚上慢。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								**建议通过env进行指定**:
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								ENV TZ=Asia/Shanghai
							 | 
						|||
| 
								 | 
							
								RUN In -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								方法二(强烈不推荐):在运行的容器中,进行修改
							 | 
						|||
| 
								 | 
							
								操作方式:docker attach 登录到运行的容器中执行如下代码
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								# 在安装tzdata之前最好先update和upgrade,以防apt-get获取不到tzdata
							 | 
						|||
| 
								 | 
							
								apt-get update -y && apt-get upgrade -y
							 | 
						|||
| 
								 | 
							
								# 安装
							 | 
						|||
| 
								 | 
							
								apt-get install -y tzdata
							 | 
						|||
| 
								 | 
							
								# 配置
							 | 
						|||
| 
								 | 
							
								echo "Asia/Shanghai" > /etc/timezone
							 | 
						|||
| 
								 | 
							
								# dpkg-reconfigure -f noninteractive tzdata 或者这个。
							 | 
						|||
| 
								 | 
							
								dpkg-reconfigure tzdata
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								方法三:启动容器的时候进行设置
							 | 
						|||
| 
								 | 
							
								操作方式:启动命令中添加 挂载目录,例如:
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								# 启动容器时挂载宿主机目录
							 | 
						|||
| 
								 | 
							
								docker run -v /etc/localtime:/etc/localtime:ro <IMAGE:TAG>
							 | 
						|||
| 
								 | 
							
								#  其中 -v 参数中ro代表只读模式(read only)
							 | 
						|||
| 
								 | 
							
								#  如果您的项目中已经使用了-v 没有关系,启动时挂载多个目录只要写多个-v就可以
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								缺点:依赖于宿主机,一般生产环境宿主机都是linux,如果你也是Linux内核,推荐使用
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 推送镜像到Dockerhub
							 | 
						|||
| 
								 | 
							
								登录
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								docker login
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Github
							 | 
						|||
| 
								 | 
							
								docker login ghcr.io -u 378100977@qq.com -p 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
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								推送
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								docker tag 5572f8b12de1 blueroses/perforce-helix-p4d:2024.5
							 | 
						|||
| 
								 | 
							
								docker push blueroses/perforce-helix-p4d:2024.5
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# 登录github
							 | 
						|||
| 
								 | 
							
								docker push ghcr.io/blueroses/perforce-helix-p4d:2024.5
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## helix-proxy Docker
							 | 
						|||
| 
								 | 
							
								Package: helix-proxy
							 | 
						|||
| 
								 | 
							
								Priority: optional
							 | 
						|||
| 
								 | 
							
								Section: non-free/vcs
							 | 
						|||
| 
								 | 
							
								Installed-Size: 30
							 | 
						|||
| 
								 | 
							
								Maintainer: Perforce Software, Inc. <support+packaging@perforce.com>
							 | 
						|||
| 
								 | 
							
								Architecture: amd64
							 | 
						|||
| 
								 | 
							
								Source: perforce
							 | 
						|||
| 
								 | 
							
								Version: 2024.1-2596294~focal
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# IDE设置
							 | 
						|||
| 
								 | 
							
								- VSCode - Settings - Extensions - Perforce
							 | 
						|||
| 
								 | 
							
									- Client:工作区名称
							 | 
						|||
| 
								 | 
							
									- Dir:工作目录
							 | 
						|||
| 
								 | 
							
									- Password:密码
							 | 
						|||
| 
								 | 
							
									- Port:服务器ip与端口
							 | 
						|||
| 
								 | 
							
									- User:用户名
							 | 
						|||
| 
								 | 
							
								- Rider - Settings - Version Control - Perforce
							 | 
						|||
| 
								 | 
							
									- 输入Server、User、Workspace、utf8
							 | 
						|||
| 
								 | 
							
								# Perforce
							 | 
						|||
| 
								 | 
							
								## 参考
							 | 
						|||
| 
								 | 
							
								- 官方文档
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/manuals/p4guide/Content/P4Guide/Home-p4guide.html
							 | 
						|||
| 
								 | 
							
									- https://help.perforce.com/helix-core/quickstart-unreal/Content/quickstart/game-home-quickstart.html
							 | 
						|||
| 
								 | 
							
								- 知乎&UE官方文档
							 | 
						|||
| 
								 | 
							
									- https://docs.unrealengine.com/5.1/en-US/using-perforce-as-source-control-for-unreal-engine/
							 | 
						|||
| 
								 | 
							
									- [UE5 源码引擎构建&UGS部署与搭建](https://zhuanlan.zhihu.com/p/414193101?utm_id=0)
							 | 
						|||
| 
								 | 
							
									- [UE4管理多重项目-WiseeEngineering](https://zhuanlan.zhihu.com/p/364346565)
							 | 
						|||
| 
								 | 
							
									- [UnrealEnigne源码构建&Perforce&(UnrealGameSync)开发版本控制基础部署](https://zhuanlan.zhihu.com/p/362276094)
							 | 
						|||
| 
								 | 
							
									- [打通UE4美术资源版本控制关节](https://zhuanlan.zhihu.com/p/261692804)
							 | 
						|||
| 
								 | 
							
									- [UE5+Perforce+阿里云ECS版本控制搭建流程与工作流程](https://zhuanlan.zhihu.com/p/640743305)
							 | 
						|||
| 
								 | 
							
									- 解决大小写问题 :[P4服务器部署、配置、备份流程详解](https://zhuanlan.zhihu.com/p/676332084)
							 | 
						|||
| 
								 | 
							
								- 视频
							 | 
						|||
| 
								 | 
							
									- [ [英文直播]版本控制基础 | Version Control Fundamental(真实字幕组)](https://www.bilibili.com/video/BV1tp4y1C7f8/?spm_id_from=333.337.search-card.all.click&vd_source=d47c0bb42f9c72fd7d74562185cee290)
							 | 
						|||
| 
								 | 
							
									- [配置管理软件Perforce代码版本管理中分支和标签应用示例—4.Local库的分支](https://www.bilibili.com/video/BV14z411b7VB/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290)
							 | 
						|||
| 
								 | 
							
									- [配置管理软件Perforce代码版本管理中分支和标签应用示例—5.stream库的分支](https://www.bilibili.com/video/BV1xK41177W1/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290)
							 | 
						|||
| 
								 | 
							
									- [P4V进阶教学自用——stream分支基本操作+文件resolve+分支制作](https://www.bilibili.com/video/BV1LC411z76w/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### cmd
							 | 
						|||
| 
								 | 
							
								- 设置默认服务器IP:`p4 set P4PORT=servername:port`
							 | 
						|||
| 
								 | 
							
								- 设置默认用户名:`p4 set P4USER=your.username`
							 | 
						|||
| 
								 | 
							
								- 设置typemap:`p4 -P YourPassword typemap`
							 | 
						|||
| 
								 | 
							
								- 设置p4ignore
							 | 
						|||
| 
								 | 
							
									- `p4 set P4IGNORE=.p4ignore`
							 | 
						|||
| 
								 | 
							
									- `p4 ignores`
							 | 
						|||
| 
								 | 
							
								- `p4 add -f  ...`:add(add所有文件并且包含文件名含通配符的文件)
							 | 
						|||
| 
								 | 
							
								- `p4 reconcile -aed`:检查所有增加/修改/删除的文件并且放到Pending Changelist
							 | 
						|||
| 
								 | 
							
								- [p4 clean](https://www.perforce.com/manuals/cmdref/Content/CmdRef/p4_clean.html)
							 | 
						|||
| 
								 | 
							
									- `p4 clean -a`:从工作区中删除没有add的文件。
							 | 
						|||
| 
								 | 
							
									- `p4 clean -n`:不执行任何操作即可预览操作结果。
							 | 
						|||
| 
								 | 
							
									- `p4 clean -i`:可清除ignore的文件。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## 规划
							 | 
						|||
| 
								 | 
							
								### 开发目录设计
							 | 
						|||
| 
								 | 
							
								- [UE4管理多重项目-WiseeEngineering(翻译)](https://zhuanlan.zhihu.com/p/364346565)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								- ArtSource(美术资源:引擎中相应的美术资产应该统一从ArtSource仓库导入,这样美术人员可以集中在标准资产管线下的资产迭代,可以更加集中注意力于美术资产质量,所以前提是项目初期必须构建标准稳定的渲染和审核验收流程(这一点也是国内很多项目及经常返工,开发成本极高的原因))
							 | 
						|||
| 
								 | 
							
								- Engine(引擎路径,这里我用于个人使用则不需要太多的分流)
							 | 
						|||
| 
								 | 
							
								- Project(项目工程)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Example:
							 | 
						|||
| 
								 | 
							
								- e:\\Perforce
							 | 
						|||
| 
								 | 
							
									- ArtSource
							 | 
						|||
| 
								 | 
							
									- ShowRoom
							 | 
						|||
| 
								 | 
							
									- UnrealEngine
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### ASoul P4的设计
							 | 
						|||
| 
								 | 
							
								仓库:
							 | 
						|||
| 
								 | 
							
								1. Engine(Stream Depot)
							 | 
						|||
| 
								 | 
							
									1. 引擎源码
							 | 
						|||
| 
								 | 
							
								2. Project(Stream Depot)
							 | 
						|||
| 
								 | 
							
									1. 构建引擎。
							 | 
						|||
| 
								 | 
							
									2. 项目工程。
							 | 
						|||
| 
								 | 
							
								3. ArtSource(Local Depot)
							 | 
						|||
| 
								 | 
							
									1. 美术资产。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### 分支
							 | 
						|||
| 
								 | 
							
								1. Release
							 | 
						|||
| 
								 | 
							
								2. Mainline
							 | 
						|||
| 
								 | 
							
								3. Development
							 | 
						|||
| 
								 | 
							
									1. UE4
							 | 
						|||
| 
								 | 
							
									2. UE5
							 | 
						|||
| 
								 | 
							
									3. Trunk分支(主干)
							 | 
						|||
| 
								 | 
							
									4. shiwan(线上分支)
							 | 
						|||
| 
								 | 
							
										1. shiwanxxx
							 | 
						|||
| 
								 | 
							
										2. shiwanpico 
							 | 
						|||
| 
								 | 
							
										3. ...
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								使用最暴力的Mainland(主干)分支开发模式,如有试玩需求,会创建shiwan分支。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### 用户
							 | 
						|||
| 
								 | 
							
								1. admin 
							 | 
						|||
| 
								 | 
							
								2. art
							 | 
						|||
| 
								 | 
							
								3. director
							 | 
						|||
| 
								 | 
							
								4. ~~remote~~ (这个用户名无法登陆)
							 | 
						|||
| 
								 | 
							
								5. qa
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### 权限管理
							 | 
						|||
| 
								 | 
							
								`//仓库名/分支/目录/...`
							 | 
						|||
| 
								 | 
							
								1. *
							 | 
						|||
| 
								 | 
							
									1. read://...
							 | 
						|||
| 
								 | 
							
								2. art:
							 | 
						|||
| 
								 | 
							
									1. write://Project/Development/LiveDirector/Content/...
							 | 
						|||
| 
								 | 
							
								3. director
							 | 
						|||
| 
								 | 
							
									1. write://Project/Development/LiveDirector/Content/...
							 | 
						|||
| 
								 | 
							
								4. qa
							 | 
						|||
| 
								 | 
							
									1. write://Project
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### WorkSpace设置
							 | 
						|||
| 
								 | 
							
								1. 编码使用:UTF8-no bom
							 | 
						|||
| 
								 | 
							
								2. Connection–>Edit Current Workspace–>Advanced,设置为
							 | 
						|||
| 
								 | 
							
									1. Line ending characters for text file -> `UNIX style linefeed`
							 | 
						|||
| 
								 | 
							
									2. OnSubmit -> `Don't submit unchanged files`
							 | 
						|||
| 
								 | 
							
									3. 勾选
							 | 
						|||
| 
								 | 
							
										1. Allwrite
							 | 
						|||
| 
								 | 
							
										2. Clobbr
							 | 
						|||
| 
								 | 
							
										3. Altsync(直播棚不要勾这个)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#### .p4ignore 
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								# Ignore IDE related files
							 | 
						|||
| 
								 | 
							
								.vscode\
							 | 
						|||
| 
								 | 
							
								.vsconfig\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore project-specific files
							 | 
						|||
| 
								 | 
							
								LiveDirector\Binaries\**\*.pdb
							 | 
						|||
| 
								 | 
							
								LiveDirector\Binaries\**\*-Debug.*
							 | 
						|||
| 
								 | 
							
								LiveDirector\Binaries\**\*-Shipping.*
							 | 
						|||
| 
								 | 
							
								LiveDirector\Build\Receipts\*
							 | 
						|||
| 
								 | 
							
								LiveDirector\DerivedDataCache\*
							 | 
						|||
| 
								 | 
							
								LiveDirector\Intermediate\*
							 | 
						|||
| 
								 | 
							
								LiveDirector\Plugins\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								LiveDirector\Saved\*
							 | 
						|||
| 
								 | 
							
								LiveDirector\*.sln
							 | 
						|||
| 
								 | 
							
								LiveDirector\*.vcxproj
							 | 
						|||
| 
								 | 
							
								LiveDirector\*.vs\
							 | 
						|||
| 
								 | 
							
								LiveDirector\*.idea\
							 | 
						|||
| 
								 | 
							
								LiveDirector\obj\
							 | 
						|||
| 
								 | 
							
								LiveDirector\**\FileOpenOrder\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Binaries\**\*.pdb
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Binaries\**\*-Debug.*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Binaries\**\*-Shipping.*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Build\Receipts\*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\DerivedDataCache\*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Plugins\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\Saved\*
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\*.sln
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\*.vcxproj
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\*.vs\
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\*.idea\
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\obj\
							 | 
						|||
| 
								 | 
							
								Tools\VCluster\**\FileOpenOrder\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore Engine temporary files
							 | 
						|||
| 
								 | 
							
								Engine\**\__pycache__\*.pyc
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore temporary files for Editor runs
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Intermediate\EditorRuns\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Add back binary-distributed plugins
							 | 
						|||
| 
								 | 
							
								!LiveDirector\Plugins\DirectorAssistanter\Intermediate\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore RiderLink
							 | 
						|||
| 
								 | 
							
								LiveDirector\Plugins\Developer\RiderLink\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ingore LiveCoding(?) temporary files
							 | 
						|||
| 
								 | 
							
								Engine\**\Intermediate\Build\**\*.h.old
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore UnrealInsights temporary files
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Programs\UnrealInsights\Saved\
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Programs\UnrealInsights\Intermediate\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore Node.js moddules for RemoteControlWebInterface
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\**\node_modules\
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\**\package.json
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\**\package-lock.json
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\WebApp\**\build\
							 | 
						|||
| 
								 | 
							
								Engine\Engine\Plugins\VirtualProduction\RemoteControlWebInterface\WebApp\Server\public\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore all Engine files.
							 | 
						|||
| 
								 | 
							
								Engine\
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Ignore Ts History
							 | 
						|||
| 
								 | 
							
								LiveDirector\ts_file_versions_info.json
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## 搭建p4顺序
							 | 
						|||
| 
								 | 
							
								1. 搭建Perforce服务
							 | 
						|||
| 
								 | 
							
								2. 创建一个Stream Depot或者所有Depot。
							 | 
						|||
| 
								 | 
							
								3. 设置 p4 typemap
							 | 
						|||
| 
								 | 
							
								4. 创建MainLine分支
							 | 
						|||
| 
								 | 
							
								5. 添加.p4ignore文件
							 | 
						|||
| 
								 | 
							
								6. 创建一个工作区,设置工作区设置后上传文件。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Typemap
							 | 
						|||
| 
								 | 
							
								typemap 的设置能够在 Perforce 中控制文件的只读和可写的形式。 然后要做这件事情,需要管理员先在命令行cmd下设置 P4 的环境变量。
							 | 
						|||
| 
								 | 
							
								在指定仓库上右键,点击`Open Command Windows Here`,输入`p4 typemap`即可在弹出的txt文件中修改保存关闭即可。(输入UE官方推荐的内容即可)
							 | 
						|||
| 
								 | 
							
								```text
							 | 
						|||
| 
								 | 
							
								# The form data below was edited by Jeff
							 | 
						|||
| 
								 | 
							
								# Perforce File Type Mapping Specifications.
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								#  TypeMap:	a list of filetype mappings; one per line.
							 | 
						|||
| 
								 | 
							
								#		Each line has two elements:
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								#  		Filetype: The filetype to use on 'p4 add'.
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								#  		Path:     File pattern which will use this filetype.
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# See 'p4 help typemap' for more information.
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								TypeMap:
							 | 
						|||
| 
								 | 
							
									text //....asp
							 | 
						|||
| 
								 | 
							
									text //....cnf
							 | 
						|||
| 
								 | 
							
									text //....css
							 | 
						|||
| 
								 | 
							
									text //....htm
							 | 
						|||
| 
								 | 
							
									text //....html
							 | 
						|||
| 
								 | 
							
									text //....inc
							 | 
						|||
| 
								 | 
							
									text //....js
							 | 
						|||
| 
								 | 
							
									text //....ts
							 | 
						|||
| 
								 | 
							
									text+w //....log
							 | 
						|||
| 
								 | 
							
									text+w //....ini
							 | 
						|||
| 
								 | 
							
									text+w //....pdm
							 | 
						|||
| 
								 | 
							
									binary+Fl //....zip
							 | 
						|||
| 
								 | 
							
									binary+Fl //....bz2
							 | 
						|||
| 
								 | 
							
									binary+Fl //....rar
							 | 
						|||
| 
								 | 
							
									binary+Fl //....gz
							 | 
						|||
| 
								 | 
							
									binary+Fl //....avi
							 | 
						|||
| 
								 | 
							
									binary+Fl //....jpg
							 | 
						|||
| 
								 | 
							
									binary+Fl //....jpeg
							 | 
						|||
| 
								 | 
							
									binary+Fl //....mpg
							 | 
						|||
| 
								 | 
							
									binary+Fl //....gif
							 | 
						|||
| 
								 | 
							
									binary+Fl //....tif
							 | 
						|||
| 
								 | 
							
									binary+Fl //....mov
							 | 
						|||
| 
								 | 
							
									binary+Fl //....jar
							 | 
						|||
| 
								 | 
							
									binary+l //....ico
							 | 
						|||
| 
								 | 
							
									binary+l //....exp
							 | 
						|||
| 
								 | 
							
									binary+l //....btr
							 | 
						|||
| 
								 | 
							
									binary+l //....bmp
							 | 
						|||
| 
								 | 
							
									binary+l //....doc
							 | 
						|||
| 
								 | 
							
									binary+l //....dot
							 | 
						|||
| 
								 | 
							
									binary+l //....xls
							 | 
						|||
| 
								 | 
							
									binary+l //....ppt
							 | 
						|||
| 
								 | 
							
									binary+l //....pdf
							 | 
						|||
| 
								 | 
							
									binary+l //....tar
							 | 
						|||
| 
								 | 
							
									binary+l //....exe
							 | 
						|||
| 
								 | 
							
									binary+l //....dll
							 | 
						|||
| 
								 | 
							
									binary+l //....lib
							 | 
						|||
| 
								 | 
							
									binary+l //....bin
							 | 
						|||
| 
								 | 
							
									binary+l //....class
							 | 
						|||
| 
								 | 
							
									binary+l //....war
							 | 
						|||
| 
								 | 
							
									binary+l //....ear
							 | 
						|||
| 
								 | 
							
									binary+l //....so
							 | 
						|||
| 
								 | 
							
									binary+l //....rpt
							 | 
						|||
| 
								 | 
							
									binary+l //....cfm
							 | 
						|||
| 
								 | 
							
									binary+l //....ma
							 | 
						|||
| 
								 | 
							
									binary+l //....mb
							 | 
						|||
| 
								 | 
							
									binary+l //....pac
							 | 
						|||
| 
								 | 
							
									binary+l //....m4a
							 | 
						|||
| 
								 | 
							
									binary+l //....mp4
							 | 
						|||
| 
								 | 
							
									binary+l //....aac
							 | 
						|||
| 
								 | 
							
									binary+l //....wma
							 | 
						|||
| 
								 | 
							
									binary+l //....docx
							 | 
						|||
| 
								 | 
							
									binary+l //....pptx
							 | 
						|||
| 
								 | 
							
									binary+l //....xlsx
							 | 
						|||
| 
								 | 
							
									binary+l //....png
							 | 
						|||
| 
								 | 
							
									binary+l //....raw
							 | 
						|||
| 
								 | 
							
									binary+l //....odt
							 | 
						|||
| 
								 | 
							
									binary+l //....ods
							 | 
						|||
| 
								 | 
							
									binary+l //....odg
							 | 
						|||
| 
								 | 
							
									binary+l //....odp
							 | 
						|||
| 
								 | 
							
									binary+l //....otg
							 | 
						|||
| 
								 | 
							
									binary+l //....ots
							 | 
						|||
| 
								 | 
							
									binary+l //....ott
							 | 
						|||
| 
								 | 
							
									binary+l //....psd
							 | 
						|||
| 
								 | 
							
									binary+l //....sxw
							 | 
						|||
| 
								 | 
							
									binary+S2w //....exe
							 | 
						|||
| 
								 | 
							
									binary+S2w //....dll
							 | 
						|||
| 
								 | 
							
									binary+S2w //....lib
							 | 
						|||
| 
								 | 
							
									binary+S2w //....app
							 | 
						|||
| 
								 | 
							
									binary+S2w //....dylib
							 | 
						|||
| 
								 | 
							
									binary+S2w //....stub
							 | 
						|||
| 
								 | 
							
									binary+S2w //....ipa
							 | 
						|||
| 
								 | 
							
									binary //....bmp
							 | 
						|||
| 
								 | 
							
									text //....ini
							 | 
						|||
| 
								 | 
							
									text //....config
							 | 
						|||
| 
								 | 
							
									text //....cpp
							 | 
						|||
| 
								 | 
							
									text //....h
							 | 
						|||
| 
								 | 
							
									text //....c
							 | 
						|||
| 
								 | 
							
									text //....cs
							 | 
						|||
| 
								 | 
							
									text //....m
							 | 
						|||
| 
								 | 
							
									text //....mm
							 | 
						|||
| 
								 | 
							
									text //....py
							 | 
						|||
| 
								 | 
							
									binary+l //....uasset
							 | 
						|||
| 
								 | 
							
									binary+l //....umap
							 | 
						|||
| 
								 | 
							
									binary+l //....upk
							 | 
						|||
| 
								 | 
							
									binary+l //....udk
							 | 
						|||
| 
								 | 
							
									binary+w //....exe
							 | 
						|||
| 
								 | 
							
									binary+w //....dll
							 | 
						|||
| 
								 | 
							
									binary+w //....lib
							 | 
						|||
| 
								 | 
							
									binary+w //....app
							 | 
						|||
| 
								 | 
							
									binary+w //....dylib
							 | 
						|||
| 
								 | 
							
									binary+w //....stub
							 | 
						|||
| 
								 | 
							
									binary+w //....ipa
							 | 
						|||
| 
								 | 
							
									binary //....bmp
							 | 
						|||
| 
								 | 
							
									text //....ini
							 | 
						|||
| 
								 | 
							
									text+w //....config
							 | 
						|||
| 
								 | 
							
									text //....cpp
							 | 
						|||
| 
								 | 
							
									text //....h
							 | 
						|||
| 
								 | 
							
									text //....c
							 | 
						|||
| 
								 | 
							
									text //....cs
							 | 
						|||
| 
								 | 
							
									text //....m
							 | 
						|||
| 
								 | 
							
									text //....mm
							 | 
						|||
| 
								 | 
							
									text //....py
							 | 
						|||
| 
								 | 
							
									binary+l //....uasset
							 | 
						|||
| 
								 | 
							
									binary+l //....umap
							 | 
						|||
| 
								 | 
							
									binary+l //....upk
							 | 
						|||
| 
								 | 
							
									binary+l //....udk
							 | 
						|||
| 
								 | 
							
									binary+l //....ubulk
							 | 
						|||
| 
								 | 
							
									text //....ignore
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## 相关概念
							 | 
						|||
| 
								 | 
							
								### Workspace
							 | 
						|||
| 
								 | 
							
								- 官方工作区文档:https://www.perforce.com/manuals/p4guide/Content/P4Guide/configuration.workspace.options.html
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Workspace可以理解为,depot到本地的一个映射,对应本地的一个目录,**存储了该工作区域的相关设置以及历史记录**。  
							 | 
						|||
| 
								 | 
							
								新建Workspace,在p4admin中depot查看在服务器中存放的所有Ddepot仓库  
							 | 
						|||
| 
								 | 
							
								  
							 | 
						|||
| 
								 | 
							
								开发的过程中可以有多个Workspace(例如一个用来开发,一个用来更新验证保证提交没有错误),但一般只推荐有一个Workspace。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### WorkspaceView
							 | 
						|||
| 
								 | 
							
								- 官方工作区文档:https://www.perforce.com/manuals/p4guide/Content/P4Guide/configuration.workspace_view.html
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								PS. 非流用户可以通过以下方式更新客户端工作区视图
							 | 
						|||
| 
								 | 
							
								1. 调用 **[p4 client](https://www.perforce.com/manuals/cmdref/Content/CmdRef/p4_client.html)** 命令,打开客户端规范。
							 | 
						|||
| 
								 | 
							
								2. 编辑 **View:** 客户端规范中的字段。
							 | 
						|||
| 
								 | 
							
								### AltSync
							 | 
						|||
| 
								 | 
							
								这是一种2024.1推出的新的同步技术,允许您减少从库同步到客户端工作区时的初始等待时间,从而加快工作速度。您可以节省时间、磁盘空间和网络带宽,因为您只在需要时下载所需的内容。相关文档:
							 | 
						|||
| 
								 | 
							
								- 文档:
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/manuals/p4vfs/Content/P4VFS/p4vfs-intro.html
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/manuals/p4vfs/Content/P4VFS/p4vfs-and-p4v.html
							 | 
						|||
| 
								 | 
							
								- p4vfs(需要额外安装)
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/downloads/helix-core-virtual-file-service
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### P4ExcludeList
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### .p4ignore
							 | 
						|||
| 
								 | 
							
								创建`.p4ignore`文件后,执行命令行设置ignore
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								p4 set P4IGNORE=.p4ignore
							 | 
						|||
| 
								 | 
							
								p4 ignores
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```text
							 | 
						|||
| 
								 | 
							
								# Ignore project files in the root
							 | 
						|||
| 
								 | 
							
								*.sln
							 | 
						|||
| 
								 | 
							
								!*\*.sln
							 | 
						|||
| 
								 | 
							
								.vs
							 | 
						|||
| 
								 | 
							
								*.suo
							 | 
						|||
| 
								 | 
							
								*.opensdf
							 | 
						|||
| 
								 | 
							
								*.sdf
							 | 
						|||
| 
								 | 
							
								*.pdb
							 | 
						|||
| 
								 | 
							
								*-Debug.dll
							 | 
						|||
| 
								 | 
							
								*.xcodeproj
							 | 
						|||
| 
								 | 
							
								.\Makefile
							 | 
						|||
| 
								 | 
							
								.\CMakeLists.txt
							 | 
						|||
| 
								 | 
							
								.\.ue4dependencies
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								ipch\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Packaged engine builds
							 | 
						|||
| 
								 | 
							
								LocalBuilds\*
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# DDC should never be checked in
							 | 
						|||
| 
								 | 
							
								Engine\DerivedDataCache\*
							 | 
						|||
| 
								 | 
							
								Templates\**\DerivedDataCache\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Engine intermediates & binaries
							 | 
						|||
| 
								 | 
							
								Engine\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Engine\Programs\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Engine\Binaries*
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\**\Binaries\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Feature Packs (they might get updated with langauge packs?)
							 | 
						|||
| 
								 | 
							
								FeaturePacks\*
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Samples & Templates
							 | 
						|||
| 
								 | 
							
								Templates\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Templates\**\Saved\*
							 | 
						|||
| 
								 | 
							
								Samples\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# C# Intermediate folders
							 | 
						|||
| 
								 | 
							
								Engine\Source\Programs\**\obj\*
							 | 
						|||
| 
								 | 
							
								Engine\Platforms\**\Programs\**\obj\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Saved folders for programs should not be checked in
							 | 
						|||
| 
								 | 
							
								Engine\Programs\**\Saved\*
							 | 
						|||
| 
								 | 
							
								Engine\Programs\UnrealBuildTool\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Ignore any saved local files
							 | 
						|||
| 
								 | 
							
								Engine\Saved\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Ignore any build receipts
							 | 
						|||
| 
								 | 
							
								Engine\Build\Receipts\*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Ignore Unix backup files
							 | 
						|||
| 
								 | 
							
								*~
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Ignore Mac desktop services store files
							 | 
						|||
| 
								 | 
							
								.DS_Store
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Ignore crash reports
							 | 
						|||
| 
								 | 
							
								crashinfo--*
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								# Ignore linux project files
							 | 
						|||
| 
								 | 
							
								*.user
							 | 
						|||
| 
								 | 
							
								*.pro
							 | 
						|||
| 
								 | 
							
								*.pri
							 | 
						|||
| 
								 | 
							
								*.kdev4
							 | 
						|||
| 
								 | 
							
								 
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# Setup.bat Ignores
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# There already might be some files pushed into the repo that would otherwise be
							 | 
						|||
| 
								 | 
							
								# filtered: those are from the initial commit, coming directly from UE4-GitHub.
							 | 
						|||
| 
								 | 
							
								# After running Setup.bat, the folders below will be populated with ~46GB of 
							 | 
						|||
| 
								 | 
							
								# files. Hence we'll be blanked ignoring some directories such as ThirdParty, 
							 | 
						|||
| 
								 | 
							
								# Media, Content, etc. If we want to change anything in those blanked-ignored 
							 | 
						|||
| 
								 | 
							
								# folders, we should unignore the specific thing we're adding.
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								.git\*
							 | 
						|||
| 
								 | 
							
								Samples\**\Content\*
							 | 
						|||
| 
								 | 
							
								Samples\**\Media\*
							 | 
						|||
| 
								 | 
							
								Templates\**\Content\*
							 | 
						|||
| 
								 | 
							
								Templates\**\Media\*
							 | 
						|||
| 
								 | 
							
								Templates\Media\*
							 | 
						|||
| 
								 | 
							
								Engine\Platforms\**\Content\*
							 | 
						|||
| 
								 | 
							
								Engine\Documentation\*
							 | 
						|||
| 
								 | 
							
								Engine\Extras\*
							 | 
						|||
| 
								 | 
							
								Engine\Content\*
							 | 
						|||
| 
								 | 
							
								Engine\Build\*
							 | 
						|||
| 
								 | 
							
								Engine\Source\ThirdParty\*
							 | 
						|||
| 
								 | 
							
								Engine\Source\Programs\*
							 | 
						|||
| 
								 | 
							
								Engine\Source\Developer\*
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\*
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Specific files
							 | 
						|||
| 
								 | 
							
								Engine\Config\ShaderCategories.csv
							 | 
						|||
| 
								 | 
							
								.tgitconfig
							 | 
						|||
| 
								 | 
							
								.ue4dependencies
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# After all this above, there's still a couple folders and files left that doesn't
							 | 
						|||
| 
								 | 
							
								# fit the filtering criteria above, so we handle them individually here.
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\Navmesh\RecastDemo*
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\Launch\Resources\Mac*
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\Launch\Resources\Linux*
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\Experimental\Voronoi\Private\voro++*
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\Apple\MetalRHI\Public\ue4_stdlib.metal
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\AVEncoder\Private\Microsoft\Windows\ThirdParty\NvEncoder\LicenseAgreement.pdf
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\Experimental\Chaos\.clang-format
							 | 
						|||
| 
								 | 
							
								Engine\Source\Runtime\TraceLog\Private\Trace\LZ4\Epic.patch
							 | 
						|||
| 
								 | 
							
								Templates\TemplateResources\Standard\*.FBX
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# PLUGINS
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# Plugins that come with Setup.bat are ignored above altogether, so we un-ignore
							 | 
						|||
| 
								 | 
							
								# the custom plugins we want to ship with the customized UE4.
							 | 
						|||
| 
								 | 
							
								!Engine\Plugins\Marketplace*
							 | 
						|||
| 
								 | 
							
								!Engine\Plugins\Runtime\HoudiniEngine*
							 | 
						|||
| 
								 | 
							
								# ... but keep ignoring their Build & Intermediate
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\Marketplace\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\Marketplace\**\Binaries\*
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\Runtime\**\Intermediate\*
							 | 
						|||
| 
								 | 
							
								Engine\Plugins\Runtime\**\Binaries\*
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# PackageEngine.bat Ignores
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								# Packaging the engine will generate some .ini files which are safe to ignore
							 | 
						|||
| 
								 | 
							
								#
							 | 
						|||
| 
								 | 
							
								Samples\**\Saved\*
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Job
							 | 
						|||
| 
								 | 
							
								- https://www.bilibili.com/video/BV13C4y1s73M/?spm_id_from=333.999.0.0&vd_source=d47c0bb42f9c72fd7d74562185cee290
							 | 
						|||
| 
								 | 
							
								可以关联多个Commit并且可以设置状态,以此追踪一个功能或者Bug的工作状态。比较像git的Issue以及工单系统。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 分支合并
							 | 
						|||
| 
								 | 
							
								分支切换需要修改设置以防止增加工作区:Preference - Stream - "Work in this Stream" menu behavior选项设置为Reuse current workspace。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## Helix4Git
							 | 
						|||
| 
								 | 
							
								- 官方文档
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/manuals//helix-for-git/Content/Helix4Git/install-config.install.html
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/manuals//helix-for-git/Content/Helix4Git/install-config.config.html
							 | 
						|||
| 
								 | 
							
								- 代理商知乎
							 | 
						|||
| 
								 | 
							
									- https://zhuanlan.zhihu.com/p/545765248
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								DockerFile搞起来太麻烦……
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Perforce Proxy
							 | 
						|||
| 
								 | 
							
								- 官方文档
							 | 
						|||
| 
								 | 
							
									- https://www.perforce.com/manuals/p4dist/Content/P4Dist/chapter.proxy.html
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								一种用于同步主Perforce服务器数据的远程服务器。适合远程的分布式协作。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# 其他
							 | 
						|||
| 
								 | 
							
								## 注册源码引擎到EpicGames
							 | 
						|||
| 
								 | 
							
								经过上面的步骤,源码引擎已经构建成功,但是在对项目就行选择引擎版本的时候,发现并没有这个版本 。这是因为,构建的引擎没有注册到EpicGames中,找到EpicGames安装目录下的注册器。复制到源码工程并且运行即可。
							 | 
						|||
| 
								 | 
							
								```text
							 | 
						|||
| 
								 | 
							
								Launcher\Engine\Binaries\Win64\UnrealVersionSelector.exe
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								# Perforce问题解决
							 | 
						|||
| 
								 | 
							
								## 大小写问题解决
							 | 
						|||
| 
								 | 
							
								官方的相关解释:
							 | 
						|||
| 
								 | 
							
								- [Changing the Case of a Filename](https://portal.perforce.com/s/article/3448)
							 | 
						|||
| 
								 | 
							
								- [Case Sensitivity](https://portal.perforce.com/s/article/3081)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								我想到一个解决方案,就是删除这个文件夹,之后分别以为大写与小写文件名,再拉新就可以把资产都拉下来。
							 | 
						|||
| 
								 | 
							
								1. 删除文件夹。
							 | 
						|||
| 
								 | 
							
								2. 新建 Nailin_Birthday2024_V02,拉新备份后比较效果。
							 | 
						|||
| 
								 | 
							
								3. 新建 NaiLin_Birthday2024_V02,拉新备份后比较效果。
							 | 
						|||
| 
								 | 
							
								4. 替换旧与错误资产。
							 | 
						|||
| 
								 | 
							
								5. 删除服务器上的Nailin_Birthday2024_V02与NaiLin_Birthday2024_V02文件夹。
							 | 
						|||
| 
								 | 
							
								6. 重新上传。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								## 使用Trigger进行检查
							 | 
						|||
| 
								 | 
							
								参考:[P4服务器部署、配置、备份流程详解](https://zhuanlan.zhihu.com/p/676332084)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								- 官方文档
							 | 
						|||
| 
								 | 
							
									- [trigger.table.fields](https://www.perforce.com/manuals/p4sag/Content/P4SAG/scripting.trigger.table.fields.html)
							 | 
						|||
| 
								 | 
							
									- [triggers.variables](https://www.perforce.com/manuals/p4sag/Content/P4SAG/scripting.triggers.variables.html)
							 | 
						|||
| 
								 | 
							
										- 中文解析: https://www.cnblogs.com/itech/archive/2011/08/17/2141310.html
							 | 
						|||
| 
								 | 
							
									- [triggers.command](https://www.perforce.com/manuals/p4sag/Content/P4SAG/scripting.triggers.command.html)
							 | 
						|||
| 
								 | 
							
								- 案例
							 | 
						|||
| 
								 | 
							
									1. [ ] 运行Python脚本 https://stackoverflow.com/questions/78156353/perforce-trigger-script-not-found
							 | 
						|||
| 
								 | 
							
									2. [ ] Python检查代码: https://gist.github.com/cmcginty/8d99e0eac345e06dc1ba
							 | 
						|||
| 
								 | 
							
									3. [ ] https://swarm.workshop.perforce.com/files/guest/perforce_software/sdp/dev/Unsupported/Samples/triggers/CheckCaseTrigger.py?v=%40%3D29027
							 | 
						|||
| 
								 | 
							
									4. [ ] https://swarm.workshop.perforce.com/files/guest/perforce_software/sdp/dev/Server/Unix/p4/common/bin/triggers/CheckCaseTrigger.py?v=4
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 添加一个Trigger
							 | 
						|||
| 
								 | 
							
								字段名称(例如`Triggers:`)必须左对齐(不缩进)并且必须以冒号结尾。字段值(即您添加的一组行,每个触发器一行)必须在字段名称下方的行上使用空格或制表符缩进。
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								表单`p4 triggers`如下所示: 
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								Triggers:
							 | 
						|||
| 
								 | 
							
								  relnotecheck change-submit //depot/bld/...  "/usr/bin/rcheck.pl %user%"
							 | 
						|||
| 
								 | 
							
								  verify_jobs  change-submit //depot/...      "/usr/bin/job.py %change%"
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								PS.***脚本内部的换行符需要跟换成unix的!***
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### Trigger Example
							 | 
						|||
| 
								 | 
							
								[P4服务器部署、配置、备份流程详解](https://zhuanlan.zhihu.com/p/676332084)
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								on_create_workspace.sh:创建工作区自动填写设置。
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								workspacename=$1
							 | 
						|||
| 
								 | 
							
								workspacefile=$2
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								p4="p4 -u perforce_trigger"
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								$p4 trust -fy >/dev/null 2>&1
							 | 
						|||
| 
								 | 
							
								if [ -z "$($p4 clients -e $workspacename)" ]; then
							 | 
						|||
| 
								 | 
							
								  sed -i '/Options:/{s/noallwrite/allwrite/g}' $workspacefile
							 | 
						|||
| 
								 | 
							
								  sed -i '/Options:/{s/noclobber /clobber /g}' $workspacefile
							 | 
						|||
| 
								 | 
							
								  
							 | 
						|||
| 
								 | 
							
								  if grep -q "^SubmitOptions:" $workspacefile; then
							 | 
						|||
| 
								 | 
							
								    sed -i 's/^SubmitOptions:.*/SubmitOptions: leaveunchanged/' $workspacefile
							 | 
						|||
| 
								 | 
							
								  else
							 | 
						|||
| 
								 | 
							
								    echo "SubmitOptions: leaveunchanged" >> $workspacefile
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  if grep -q "^LineEnd:" $workspacefile; then
							 | 
						|||
| 
								 | 
							
								    sed -i 's/^LineEnd:.*/LineEnd: unix/' $workspacefile
							 | 
						|||
| 
								 | 
							
								  else
							 | 
						|||
| 
								 | 
							
								    echo "LineEnd: unix" >> $workspacefile
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								fi
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								check_case_conflict.sh:大小写检查
							 | 
						|||
| 
								 | 
							
								```bash
							 | 
						|||
| 
								 | 
							
								#!/bin/bash
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								changelist=$1
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								p4="p4 -p 127.0.0.1:1666 -u perforce_trigger"
							 | 
						|||
| 
								 | 
							
								pending_files=($($p4 opened -s -c $changelist | awk '{print $1}'))
							 | 
						|||
| 
								 | 
							
								canSubmit=0
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function p4_user_login()
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  $p4 login -s ${@:2} "$1" 2>/dev/null | grep -q ^//
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								if p4_user_login; then
							 | 
						|||
| 
								 | 
							
								  echo nswl123456|$p4 -u perforce_trigger login
							 | 
						|||
| 
								 | 
							
								fi
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function p4_file_exist()
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  $p4 files -e ${@:2} "$1" 2>/dev/null | grep -q ^//
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function p4_path_exist()
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  $p4 dirs ${@:2} "$1" 2>/dev/null | grep -q ^//
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function check_changelist_file_conflict()
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  local file=$1
							 | 
						|||
| 
								 | 
							
								  local pending_list=(${@:2})
							 | 
						|||
| 
								 | 
							
								  local message=
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  for other_file in ${pending_list[@]}; do
							 | 
						|||
| 
								 | 
							
								    if [ $file != $other_file ] && [ ${file,,} == ${other_file,,} ]; then
							 | 
						|||
| 
								 | 
							
								      message="$message\n$other_file"
							 | 
						|||
| 
								 | 
							
								    fi
							 | 
						|||
| 
								 | 
							
								  done
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  if [ "$message" ]; then
							 | 
						|||
| 
								 | 
							
								    message="Changelist File Case Conflict(提交队列大小写冲突:文件):$message"
							 | 
						|||
| 
								 | 
							
								    printf "$message"
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								function check_changelist_path_conflict()
							 | 
						|||
| 
								 | 
							
								{
							 | 
						|||
| 
								 | 
							
								  local path=$(dirname $1)
							 | 
						|||
| 
								 | 
							
								  local pending_list=(${@:2})
							 | 
						|||
| 
								 | 
							
								  local message=
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  while [ $path != '/' ]; do
							 | 
						|||
| 
								 | 
							
								    for i in ${!pending_list[@]}; do
							 | 
						|||
| 
								 | 
							
								      local other_file=${pending_list[$i]}
							 | 
						|||
| 
								 | 
							
								      if [[ "$other_file" != "$path"* ]] && [[ "${other_file,,}" == "${path,,}"* ]]; then
							 | 
						|||
| 
								 | 
							
								        message="$message\n$other_file"
							 | 
						|||
| 
								 | 
							
								        unset "pending_list[$i]"
							 | 
						|||
| 
								 | 
							
								      fi
							 | 
						|||
| 
								 | 
							
								    done
							 | 
						|||
| 
								 | 
							
								    path=$(dirname $path)
							 | 
						|||
| 
								 | 
							
								  done
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  if [ "$message" ]; then
							 | 
						|||
| 
								 | 
							
								    message="Changelist Path Case Conflict(提交队列大小写冲突:路径):$message"
							 | 
						|||
| 
								 | 
							
								    printf "$message"
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								}
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								for file in ${pending_files[@]}; do
							 | 
						|||
| 
								 | 
							
								  # Check File Case Conflicted Or Not
							 | 
						|||
| 
								 | 
							
								  canSubmit=0
							 | 
						|||
| 
								 | 
							
								  message=
							 | 
						|||
| 
								 | 
							
								  if ! p4_file_exist $file && p4_file_exist $file -i; then
							 | 
						|||
| 
								 | 
							
								    #===== Output Error Message =====#
							 | 
						|||
| 
								 | 
							
								    message="$message\nDepot File Case Conflicted (仓库大小写冲突:文件):\n$($p4 files -i "$file")"
							 | 
						|||
| 
								 | 
							
								    #================================#
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  # Check Path Case Conflicted Or Not
							 | 
						|||
| 
								 | 
							
								  path=$(dirname $file)
							 | 
						|||
| 
								 | 
							
								  while [ $path != '/' ]
							 | 
						|||
| 
								 | 
							
								  do
							 | 
						|||
| 
								 | 
							
								    if ! p4_path_exist $path && p4_path_exist $path -i; then
							 | 
						|||
| 
								 | 
							
								      #===== Output Error Message =====#
							 | 
						|||
| 
								 | 
							
								      message="$message\nDepot Path Case Conflicted (仓库大小写冲突:路径):\n$($p4 dirs -i "$path")"
							 | 
						|||
| 
								 | 
							
								      #================================#
							 | 
						|||
| 
								 | 
							
								      break
							 | 
						|||
| 
								 | 
							
								    fi
							 | 
						|||
| 
								 | 
							
								    path=$(dirname $path)
							 | 
						|||
| 
								 | 
							
								  done
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  temp_message=$(check_changelist_file_conflict "$file" "${pending_files[@]}")
							 | 
						|||
| 
								 | 
							
								  if [ "$temp_message" ]; then
							 | 
						|||
| 
								 | 
							
								    message="$message\n$temp_message"
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  temp_message=$(check_changelist_path_conflict "$file" "${pending_files[@]}")
							 | 
						|||
| 
								 | 
							
								  if [ "$temp_message" ]; then
							 | 
						|||
| 
								 | 
							
								    message="$message\n$temp_message"
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								  if [ "$message" ]; then
							 | 
						|||
| 
								 | 
							
								    canSubmit=1
							 | 
						|||
| 
								 | 
							
								    message="File(文件):\n$file\n$message"
							 | 
						|||
| 
								 | 
							
								    printf "\n==============================\n$message\n==============================\n"
							 | 
						|||
| 
								 | 
							
								  fi
							 | 
						|||
| 
								 | 
							
								done
							 | 
						|||
| 
								 | 
							
								exit $canSubmit
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								```text
							 | 
						|||
| 
								 | 
							
								on_create_workspace form-out client "/p4/triggers/on_create_workspace.sh %formname% %formfile%"
							 | 
						|||
| 
								 | 
							
								check_case_conflict change-submit //... "/p4/triggers/check_case_conflict.sh %changelist%"
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 自动登录命令
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								echo password|p4 -u user login
							 | 
						|||
| 
								 | 
							
								```
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								### 工作区设置选项
							 | 
						|||
| 
								 | 
							
								https://www.perforce.com/manuals/v22.2/p4guide/Content/P4Guide/configuration.workspace.html
							 |