将 Git 源代码控制与 Unity 3D 结合使用的最佳做法是什么,尤其是在处理 Unity 3D 项目的二进制性质时?请描述工作流程,.gitignore 中将包含哪些路径,应在 Unity 和/或项目中设置哪些设置,以及任何其他应注意的特殊事项。
注意:我意识到使用 Asset Server 是 Unity 推荐的方式,但出于各种原因我想使用 Git。请不要回答说明或争论我应该只使用资产服务器。资产服务器真的不是我的选择。
以下是 my personal blog 的摘录。
在 3D 游戏中使用 Git
2015 年 10 月更新: GitHub 此后发布了一个名为 Git LFS 的 Git 插件,可直接处理以下问题。您现在可以轻松高效地对大型二进制文件进行版本控制!
Git 可以开箱即用地处理 3D 游戏。然而,这里的主要警告是,随着您的提交历史膨胀,从长远来看,对大型(> 5 MB)媒体文件进行版本控制可能是一个问题。我们已经解决了我们项目中的这个潜在问题,方法是只在二进制资产被认为是最终版本时对其进行版本控制。我们的 3D 艺术家使用 Dropbox 来处理 WIP 资产,这既是出于上述原因,也是因为它大大更快、更简单(没有多少艺术家会积极使用 Git!)。
Git 工作流程
您的 Git 工作流程在很大程度上是您需要自己决定的,因为您有自己的团队经验以及如何一起工作。然而。我强烈推荐适当命名的 Git Flow 方法as described by the original author here。
我不会在这里深入探讨该方法的工作原理,因为作者完美地描述了它,而且用很少的话也很容易理解。我已经和我的团队一起使用了一段时间,这是迄今为止我们尝试过的最好的工作流程。
Git GUI 客户端应用程序
这实际上是个人偏好,因为在 Git GUI 或是否使用 GUI 方面有很多选择。但我想推荐免费的 SourceTree application,因为它与 Git Flow 扩展完美结合。阅读有关在其应用程序中实施 Git Flow 方法的 SourceTree tutorial here。
Unity3D忽略文件夹
对于没有操作系统细节的最新版本检查 Github maintained Unity.gitignore file。
# =============== #
# Unity generated #
# =============== #
Temp/
Library/
# ===================================== #
# Visual Studio / MonoDevelop generated #
# ===================================== #
ExportedObj/
obj/
*.svd
*.userprefs
/*.csproj
*.pidb
*.suo
/*.sln
*.user
*.unityproj
*.booproj
# ============ #
# OS generated #
# ============ #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
Unity3D 设置
对于 Unity 3D v4.3 及更高版本:
(在 v4.5 及更高版本中跳过此步骤)在 Unity → Preferences → Packages → Repository 中启用 External 选项。打开 Edit 菜单并选择 Project Settings → Editor: Switch Version Control Mode to Visible Meta Files。将资产序列化模式切换为强制文本。从文件菜单中保存场景和项目。
想要将现有的 repo 迁移到 LFS 吗?
查看我的博文了解步骤 on how to do it here。
附加配置
在 Unity3D 项目中使用 Git 时遇到的几个主要烦恼之一是 Git 不关心目录,并且在从目录中删除文件后会很高兴地留下空目录。 Unity3D 将为这些目录生成 *.meta 文件,当 Git 提交不断添加和删除这些元文件时,可能会导致团队成员之间发生争执。
Add this Git post-merge hook 到 /.git/hooks/
文件夹,以获取其中包含 Unity3D 项目的存储库。在任何 Git pull/merge 之后,它会查看哪些文件已被删除,检查它所在的目录是否为空,如果是则删除它。
在 Unity 4.3 中,您还必须从首选项中启用 External 选项,但由于 Unity 4.5 他们放弃了该选项,因此完整的设置过程如下所示:
在编辑器中切换到可见元文件 → 项目设置 → 编辑器 → 版本控制模式 在编辑器中切换到强制文本 → 项目设置 → 编辑器 → 资产序列化模式 从文件菜单保存场景和项目
此外,我们的团队正在使用更多扩展的 .gitignore
文件:
# =============== #
# Unity generated #
# =============== #
Temp/
Library/
# ===================================== #
# Visual Studio / MonoDevelop generated #
# ===================================== #
ExportedObj/
obj/
*.svd
*.userprefs
/*.csproj
*.pidb
*.suo
/*.sln
*.user
*.unityproj
*.booproj
# ============ #
# OS generated #
# ============ #
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
请注意,您需要保留在源代码管理下的唯一文件夹是 Assets
和 ProjectSettings
。
您可以在 this post 中找到有关将 Unity Project 置于源代码控制之下的更多信息。
Hidden Meta Files
?
什么是 GIT?
Git 是由 Linus Torvalds(Linux OS 创始人)于 2005 年开发的免费开源分布式版本控制系统(SCM)。它的创建是为了以速度和效率控制从小型到大型项目的一切。谷歌、Facebook、微软等领先公司每天都在使用 GIT。
如果您想了解有关 GIT 的更多信息,请查看此Quick tutorial,
首先确保你已经设置了 Git 环境。你需要设置本地环境和 Git 存储库(我更喜欢 Github.com)。
GIT 客户端应用程序 Mac/Windows
对于 GIT gui 客户端应用程序,我建议您使用 Github.com,
GitHub 是与朋友、同事、同学和完全陌生的人共享代码的地方。超过 500 万人使用 GitHub 共同构建令人惊叹的事物。
Unity3d 设置
你需要做这些设置
在编辑 → 项目设置 → 编辑器 → 版本控制模式中切换到可见元文件。
https://i.stack.imgur.com/FsMxC.png
在 Unity → Preferences → Packages → Repository 中启用 External 选项
https://i.stack.imgur.com/GCuxW.png
在编辑 → 项目设置 → 编辑器 → 资产序列化模式中切换到强制文本。
https://i.stack.imgur.com/luaOL.png
来源:Using Git With 3D Games Source Control
Preferences > Packages
?泰
为了补充说明的所有内容,将 git lfs 与 Unity 一起使用也是理想的选择。自从它问世以来我一直在使用它,我没有遇到任何问题。
您需要将此 .gitattributes
添加到您的 .gitignore
文件旁边
*.cs diff=csharp text
*.cginc text
*.shader text
*.mat merge=unityyamlmerge eol=lf
*.anim merge=unityyamlmerge eol=lf
*.unity merge=unityyamlmerge eol=lf
*.prefab merge=unityyamlmerge eol=lf
*.physicsMaterial2D merge=unityyamlmerge eol=lf
*.physicsMaterial merge=unityyamlmerge eol=lf
*.asset merge=unityyamlmerge eol=lf
*.meta merge=unityyamlmerge eol=lf
*.controller merge=unityyamlmerge eol=lf
*.a filter=lfs diff=lfs merge=lfs -text
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.aif filter=lfs diff=lfs merge=lfs -text
*.ttf filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.jpg filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.FBX filter=lfs diff=lfs merge=lfs -text
*.rns filter=lfs diff=lfs merge=lfs -text
*.reason filter=lfs diff=lfs merge=lfs -text
*.lxo filter=lfs diff=lfs merge=lfs -text
那是我的滚动文件列表。如果您使用未列出的其他二进制文件,请添加它们。
我也有配置为使用 yamlmerge 的文件,您需要进行设置。您可以在此处阅读:http://docs.unity3d.com/Manual/SmartMerge.html
我想我可以为感兴趣的人发布一个更简单的 .gitignore
:
# Ignore Everything
/*
# Except for these
!/.gitignore
!/Assets
!/Packages
!/ProjectSettings
UnityPackageManager/
和 Packages/
)的 Unity 2017 和 2018 也是如此。
我们现在可以无缝集成到 Unity 与 Github 到 Unity 的扩展...https://unity.github.com/
新的 GitHub for Unity 扩展为 Unity 带来了 GitHub 工作流程等,通过 Git LFS 和文件锁定提供对大文件的支持。
在撰写本文时,该项目处于 alpha 阶段,但仍可用于个人项目。
使用 git 进行 unity-3d 源代码版本控制时要记住的主要事项:
(A) 不要签入 Library 文件夹。我过去曾多次犯过这个错误并为此受苦!在将项目/文件添加到 git 之前删除或移出库文件夹。
(B) 使用“可见元文件” - 对于最新的统一版本 - 5.3.4 及更高版本默认情况下会发生这种情况。对于某些早期版本,您需要更改以下设置:编辑-> 项目设置-> 版本控制
(C) 为 Unity 使用 .gitignore 文件 - 确保保持健全性并且不会不必要地添加文件- 如果在 android / tizen 上 - 添加规则以排除 APK 和 TPK 文件被添加到存储库. Google 四处寻找 .gitignore 文件以实现统一,或者使用 GitHub 提供的此模型 .gitignore for Unity:https://github.com/github/gitignore/blob/master/Unity.gitignore
(D) 确保 .gitignore 文件作为添加的第一个文件添加到存储库 - 因为过去我个人错过了添加 .gitignore 文件。事后对为什么会发生这种情况有很多想法 - 但现在我只是复制并添加 .gitignore 文件作为设置存储库的第一步。
所以...要让 Unity 项目为 git 做好准备,请执行以下操作:
(1) 进入项目文件夹
(2) 键入 git init 。
(3) 复制 .gitignore 文件: 在 MacOS 上: cp ~/Downloads/.gitignore 在 Windows 上: 复制 c:\Users[yourusername]\Downloads.gitignore 。
(4) git add .gitignore
(5) 混帐添加 *
希望这会有所帮助......一切顺利!
我宁愿你使用 BitBucket,因为它不是公开的,而且 Unity 有一个关于 Bitbucket 的官方教程。
https://unity3d.com/learn/tutorials/topics/cloud-build/creating-your-first-source-control-repository
希望这可以帮助。
Edit -> Project Settings -> Editor
将版本控制设置为元文件。设置资产序列化以强制文本。
我想这就是你想要的。
只有 Assets 和 ProjectSettings 文件夹需要受 git 版本控制。
你可以像这样制作一个 gitignore。
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
# Autogenerated VS/MD solution and project files
*.csproj
*.unityproj
*.sln
*.suo
*.userprefs
# Mac
.DS_Store
*.swp
*.swo
Thumbs.db
Thumbs.db.meta
.vs/
您可以使用 Github for Unity,这是一个将 git 工作流带入 Unity UI 的 Unity 扩展。
Github for Unity 刚刚发布了扩展的 1.0 版。
它使用 git-lfs(git 大文件支持)来正确存储大资产
文件锁定,以便没有其他人覆盖您的资产提交
向/从任何远程存储库推送和拉取
您也可以在 Unity 资源商店中下载它:https://assetstore.unity.com/packages/tools/version-control/github-for-unity-118069
Unity 也提供了自己的 Source 版本控制。在 unity5 之前它是 unityAsset Server,但现在已经贬值了。并推出了一个新的SVN控制系统,称为unity协作。但是使用unity和任何SVN的主要问题是提交和合并场景。但是非 svn 给了我们解决这种冲突或合并场景的方法。所以取决于你熟悉哪个 SVN。我在 Mac 上使用 SmartSVN 工具。和乌龟在窗户上。
https://i.stack.imgur.com/D79fI.png
只需添加 Gitignore 的主题即可。推荐的方法只忽略库和临时,如果它在你的 git 项目的根目录中。如果您像我一样,有时需要统一项目成为回购的一部分,而不是整个回购,那么 gitignore 中的正确字符串将是:
**/[Tt]emp
**/[Ll]ibrary
**/[Bb]uild
我强烈建议您切换到 PlasticSCM。这是 Unity 迁移到的东西,并提供了设计人员兼开发人员工作流程来管理游戏开发等复杂事物的版本控制。
您可以免费获得 3 位用户的云版。这取代了 Unity 的协作工具。
注意:我真的很难使用 Git/Bitbucket 和 SourceTree 来管理一个简单的项目。
https://unity.com/products/plastic-scm
我想从过去对 git 感到沮丧的人那里添加一个非常简单的工作流程。有几种使用 git 的方法,可能最常见的 unity 是 GitHub Desktop、Git Bash 和 GitHub Unity
https://assetstore.unity.com/packages/tools/version-control/github-for-unity-118069。
本质上,他们都做同样的事情,但它的用户选择。您可以使用 git 进行大文件设置,它允许 1GB 的免费大文件存储以及额外的存储在数据包中,50GB 的价格为 4 美元/月,这将允许您将大于 100mb 的文件推送到远程存储库(它将实际文件存储在服务器和你的回购中的一个指针)
如果您出于某种原因不想设置 lfs,您可以通过在您的项目所在的目录中键入 size:large 来在 Windows 中扫描您的项目中大于 128 mb 的文件。这对于搜索大文件很方便,尽管可能会丢失一些介于 100mb 和 128mb 之间的文件。
https://i.stack.imgur.com/iI7Nv.png
git bash 的一般格式是
混帐添加。 (添加要提交的文件)
git commit -m 'message' (提交带有消息的文件,它们仍在您的电脑上而不是远程仓库中,基本上它们已被“版本化”为新提交)
git push(将文件推送到存储库)
git bash 对于unity 项目的缺点是,如果有文件> 100mb,直到你push 才会报错。然后,您必须通过将您的头部重置为上一个提交来撤消您的提交。有点麻烦,尤其是如果您是 git bash 新手。
GitHub Desktop 的优势在于,在您提交 100mb 的文件之前,它会给您一个弹出错误消息。然后,您可以缩小这些文件或将它们添加到 .gitignore 文件中。
要使用 .gitignore 文件,请在本地存储库根目录中创建一个名为 .gitignore 的文件。只需一次添加一行您想省略的文件。 SharedAssets 和其他非资产文件夹文件通常可以省略,并且会在编辑器中自动重新填充(可以重新导入包等)。您还可以使用通配符排除文件类型。
如果其他人正在使用您的 GitHub 存储库,并且您想要克隆或拉取,那么您也可以在 GitHub 桌面或 Git bash 上使用这些选项。
我没有过多提及 Unity GitHub 包,您可以在编辑器中使用 GitHub,因为我个人认为该界面不是很有用,而且我认为总体上它不会帮助任何人熟悉 git,但这只是我的偏爱。
我建议您制作一个 .gitignore 文件,其中包含资产文件夹以外的所有内容(最初位于统一项目中的所有其他文件)。接下来,您应该将所有游戏项目放在一个文件夹中。接下来,为您的游戏复制每个项目文件夹中的 .gitignore。这将排除项目中除资产之外的库和不必要的文件夹。如果您有任何不想要的项目,请将它们放在存储游戏项目的新 .gitignore 中。注意:您可以拥有多个 .gitignore,并且 .gitignore 基于相对路径。我希望这有帮助!
我和我的朋友在 72 小时的比赛中尝试了这种方法,请注意他们不知道 GIT。
首先,我使用预定义的 .gitignore 统一模板在 [GitHub][1] 中创建空仓库(私人仓库现在是免费的),它应该与此相同:
# This .gitignore file should be placed at the root of your Unity project directory
#
# Get latest from https://github.com/github/gitignore/blob/master/Unity.gitignore
#
[Ll]ibrary/
[Tt]emp/
[Oo]bj/
[Bb]uild/
[Bb]uilds/
[Ll]ogs/
[Mm]emoryCaptures/
# Asset meta data should only be ignored when the corresponding asset is also ignored
!/[Aa]ssets/**/*.meta
# Uncomment this line if you wish to ignore the asset store tools plugin
# /[Aa]ssets/AssetStoreTools*
# Autogenerated Jetbrains Rider plugin
[Aa]ssets/Plugins/Editor/JetBrains*
# Visual Studio cache directory
.vs/
# Gradle cache directory
.gradle/
# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb
*.mdb
*.opendb
*.VC.db
# Unity3D generated meta files
*.pidb.meta
*.pdb.meta
*.mdb.meta
# Unity3D generated file on crash reports
sysinfo.txt
# Builds
*.apk
*.unitypackage
# Crashlytics generated file
crashlytics-build.properties
然后我创建了一个主场景,这个场景在开发过程中不应该被任何人修改,它应该是团队中所有开发人员和艺术家测试游戏最新功能的演示场景。首先,任何新功能都应该位于与 main 不同的分支中,而且每个团队成员都有自己的场景,他将其用于测试和开发。一旦一切顺利,他/她就进行了其他成员审查的 PR。如果合并的特征是完整的,那么我们将它添加到主场景中,以便所有其他成员看到影响和进度。
关于艺术文件,最好通过使用不同的精灵文件来避免冲突,并用来自 PR 的全新调整的精灵替换主要精灵。 [1]:https://github.com/
如果您使用源代码控制,请确保您对无用文件有一个 git ignore:https://github.com/github/gitignore/blob/main/Unity.gitignore
Hidden Meta Files
?