552

将Git源代码控制与 Unity 3D 结合使用的最佳实践是什么,尤其是在处理 Unity 3D 项目的二进制性质时?请描述工作流程,.gitignore 中将包含哪些路径,应在 Unity 和/或项目中设置哪些设置,以及任何其他应注意的特殊事项。

注意:我意识到使用 Asset Server 是 Unity 推荐的方式,但出于各种原因我想使用 Git。请不要回答说明或争论我应该只使用资产服务器。资产服务器真的不是我的选择。

4

16 回答 16

585

以下是我个人博客的摘录。

在 3D 游戏中使用 Git

2015 年 10 月更新: GitHub 已经发布了一个名为Git LFS的 Git 插件,它直接处理以下问题。您现在可以轻松高效地对大型二进制文件进行版本控制!

Git 可以开箱即用地处理 3D 游戏。然而这里的主要警告是,随着您的提交历史膨胀,对大型(> 5 MB)媒体文件进行版本控制从长远来看可能是一个问题。我们已经解决了我们项目中的这个潜在问题,方法是只在二进制资产被认为是最终版本时对其进行版本控制。我们的 3D 艺术家使用Dropbox来处理 WIP 资产,这既是出于上述原因,也是因为它更快、更简单(没有多少艺术家会积极使用 Git!)。

Git 工作流程

您的 Git 工作流程在很大程度上是您需要自己决定的,因为您有自己的团队经验以及如何一起工作。然而。我强烈推荐原作者在此处描述的适当命名的Git Flow方法。

我不会在这里深入探讨该方法的工作原理,因为作者完美地描述了它,而且用很少的话也很容易理解。我已经和我的团队一起使用了一段时间,这是迄今为止我们尝试过的最好的工作流程。

Git GUI 客户端应用程序

这实际上是个人偏好,因为在 Git GUI 或是否使用 GUI 方面有很多选择。但我想推荐免费的SourceTree 应用程序,因为它可以完美地与 Git Flow 扩展插件相结合。阅读此处的 SourceTree 教程,了解在其应用程序中实施 Git Flow 方法。

Unity3D忽略文件夹

要获取最新版本,请查看 Github 维护的 Unity.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

Unity3D 设置

对于 Unity 3D v4.3 及更高版本:

  1. (在 v4.5 及更高版本中跳过此步骤)ExternalUnity → Preferences → Packages → Repository.
  2. 打开Edit菜单并选择Project Settings → Editor
    1. 切换Version Control ModeVisible Meta Files
    2. 切换Asset Serialization ModeForce Text
  3. File从菜单中保存场景和项目。

想要将现有的 repo 迁移到 LFS 吗?

查看我的博客文章,了解如何在此处执行此操作的步骤。

附加配置

在 Unity3D 项目中使用 Git 时遇到的几个主要烦恼之一是 Git 不关心目录,并且在从目录中删除文件后会很高兴地留下空目录。Unity3D 将为这些目录生成 *.meta 文件,当 Git 提交不断添加和删除这些元文件时,可能会导致团队成员之间发生争执。

将此 Git 合并后挂钩添加/.git/hooks/包含 Unity3D 项目的存储库的文件夹中。在任何 Git pull/merge 之后,它会查看哪些文件已被删除,检查它所在的目录是否为空,如果是则删除它。

于 2013-08-14T07:17:40.417 回答
64

在 Unity 4.3 中,您还必须从首选项中启用 External 选项,但由于 Unity 4.5 他们放弃了该选项,因此完整的设置过程如下所示:

  1. 切换Visible Meta FilesEditor → Project Settings → Editor → Version Control Mode
  2. 切换Force TextEditor → Project Settings → Editor → Asset Serialization Mode
  3. File从菜单中保存场景和项目

此外,我们的团队正在使用更多扩展.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

请注意,您需要保留在源代码管理下的唯一文件夹是AssetsProjectSettings.

有关将 Unity 项目置于源代码控制之下的更多信息,您可以在这篇文章中找到。

于 2014-02-12T10:27:00.573 回答
36

什么是 GIT?

Git 是由 Linus Torvalds(Linux OS 创始人)于 2005 年开发的免费开源分布式版本控制系统(SCM)。它的创建是为了以速度和效率控制从小型到大型项目的一切。谷歌、Facebook、微软等领先公司每天都在使用 GIT。

如果您想了解有关 GIT 的更多信息,请查看此快速教程

首先确保你已经设置了 Git 环境。你需要设置本地环境和 Git 存储库(我更喜欢 Github.com)。

GIT 客户端应用程序 Mac/Windows

对于 GIT gui 客户端应用程序,我建议您使用 Github.com,

GitHub 是与朋友、同事、同学和完全陌生的人共享代码的地方。超过 500 万人使用 GitHub 共同构建令人惊叹的事物。

Unity3d 设置

你需要做这些设置

在编辑 → 项目设置 → 编辑器 → 版本控制模式中切换到可见元文件。

在此处输入图像描述

在 Unity → Preferences → Packages → Repository 中启用 External 选项

在此处输入图像描述

在编辑 → 项目设置 → 编辑器 → 资产序列化模式中切换到强制文本。

在此处输入图像描述

来源: 将 Git 与 3D 游戏源代码控制一起使用

于 2014-07-25T14:50:07.163 回答
29

为了补充上述所有内容,将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

于 2016-02-02T17:42:17.197 回答
16

我想我可能会.gitignore为任何感兴趣的人发布一个更简单的内容:

# Ignore Everything
/*

# Except for these
!/.gitignore
!/Assets
!/Packages
!/ProjectSettings
于 2015-06-25T20:11:40.907 回答
14

我们现在可以无缝集成到统一与 Github 到 Unity 扩展... https://unity.github.com/

新的 GitHub for Unity 扩展为 Unity 带来了 GitHub 工作流程等,通过 Git LFS 和文件锁定提供对大文件的支持。

在撰写本文时,该项目处于 alpha 阶段,但仍可用于个人项目。

于 2017-09-26T15:11:04.950 回答
10

使用 git 进行 unity-3d 源代码版本控制时要记住的主要事项:

(A)不要签入 Library 文件夹。我过去曾多次犯过这个错误并为此受苦!在将项目/文件添加到 git 之前删除或移出库文件夹。

(B) 使用“可见元文件” - 对于最新的统一版本 - 5.3.4 及更高版本默认情况下会发生这种情况。对于某些早期版本,您需要更改以下设置:编辑-> 项目设置-> 版本控制

(C) 为 Unity 使用 .gitignore 文件 - 以确保保持健全性并且不会不必要地添加文件- 如果在 android / tizen 上 - 添加规则以排除 APK 和 TPK 文件被添加到存储库。谷歌周围的 .gitignore 文件统一或使用这个模型 .gitignore 由 GitHub 提供的统一: 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) 混帐添加 *

希望这会有所帮助......一切顺利!

于 2017-10-10T02:52:25.257 回答
8

我宁愿你使用 BitBucket,因为它不是公开的,而且 Unity 有一个关于 Bitbucket 的官方教程。

https://unity3d.com/learn/tutorials/topics/cloud-build/creating-your-first-source-control-repository

希望这可以帮助。

于 2018-03-29T09:05:15.980 回答
7

Edit -> Project Settings -> Editor

将版本控制设置为元文件。设置资产序列化以强制文本。

我想这就是你想要的。

于 2013-08-16T06:09:48.780 回答
7

您可以使用Github for Unity,这是一个将 git 工作流程引入 Unity 用户界面的Unity 扩展。

Github for Unity刚刚发布了 1.0 版的扩展。

于 2018-06-22T12:36:25.190 回答
7

只有AssetsProjectSettings文件夹需要受 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/
于 2017-07-03T08:39:56.897 回答
5

Unity 也提供了自己的 Source 版本控制。在 unity5 之前它是 unityAsset Server,但现在已经贬值了。并推出了一个新的SVN控制系统,称为unity协作。但是使用unity和任何SVN的主要问题是提交和合并场景。但是非 svn 给了我们解决这种冲突或合并场景的方法。所以取决于你熟悉哪个 SVN。我在 Mac 上使用 SmartSVN 工具。和乌龟在窗户上。

在此处输入图像描述

于 2017-05-23T10:25:10.173 回答
2

只需添加 Gitignore 的主题即可。推荐的方法只忽略库和临时,如果它在你的 git 项目的根目录中。如果您像我一样,有时需要统一项目作为回购的一部分,而不是整个回购,那么 gitignore 中的正确字符串将是:

**/[Tt]emp
**/[Ll]ibrary
**/[Bb]uild
于 2018-07-28T18:47:13.170 回答
0

我和我的朋友在 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/

于 2021-06-08T16:29:30.983 回答
0

我建议您制作一个 .gitignore 文件,其中包含资产文件夹以外的所有内容(最初位于统一项目中的所有其他文件)。接下来,您应该将所有游戏项目放在一个文件夹中。接下来,为您的游戏复制每个项目文件夹中的 .gitignore。这将排除项目中除资产之外的库和不必要的文件夹。如果您有任何不想要的项目,请将它们放在存储游戏项目的新 .g​​itignore 中。注意:您可以拥有多个 .gitignore,并且 .gitignore 基于相对路径。我希望这有帮助!

于 2020-06-17T23:20:22.723 回答
0

我想从过去对 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 的文件推送到远程存储库(它将实际文件存储在服务器和你的回购中的一个指针)

https://git-lfs.github.com/

如果您出于某种原因不想设置 lfs,您可以通过在您的项目所在的目录中键入 size:large 来在 Windows 中扫描您的项目中大于 128 mb 的文件。这对于搜索大文件很方便,尽管可能会丢失一些介于 100mb 和 128mb 之间的文件。

在此处输入图像描述

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,但这只是我的偏爱。

于 2020-05-15T04:04:22.423 回答