【问题标题】:How to use Git for Unity3D source control?如何使用 Git 进行 Unity3D 源代码控制?
【发布时间】:2013-08-16 00:22:30
【问题描述】:

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

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

【问题讨论】:

  • "just use svn" 不考虑无意义的 git V svn 参数,git 不适合大型二进制文件。 unity 项目是电影(以及各种巨大的二进制文件 - 纹理等),只有几行代码。你会使用 git 来存储你的电影收藏吗? svn 至少是合理的。
  • 最简单的解决方案是简单地使用 gitignore 排除所有二进制文件夹,并且仅将 git 用于您的实际代码文件,也许还有您的资产文件。不需要包含所有二进制文件,因为每个团队成员都可以自己编译它们?
  • @Kokodoko 艺术家无法编译自己的可执行文件。
  • @mgear 根据docs.unity3d.com/540/Documentation/Manual/…Unity 似乎推荐PlasticSCM。与此同时,这个“协作”的东西也出现了测试版。你知道这两个选项有什么区别吗?
  • @aasu FWIW 历史上-“plasticscm”消失了。

标签: git unity3d version-control


【解决方案1】:

以下内容摘自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 扩展完美结合。阅读SourceTree tutorial here,了解在他们的应用程序中实施 Git Flow 方法。

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 及更高版本:

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

想要将现有的 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 之后,它会查看哪些文件被删除了,检查它所在的目录是否为空,如果是则删除它。

【讨论】:

  • 提及 git 工作流很好,但也许我应该在我的问题中澄清我问的是特别针对统一 3D 的工作流。您可能知道,unity 项目严重依赖二进制文件。有什么特殊的考虑来处理这个问题吗?我在研究这个主题时发现的一些建议是使用尽可能避免合并的工作流程。也许您不同意这种观点,但我的问题更具体针对 unity3d 特定问题,而不是一般工作流程偏好。
  • 我们使用git-annex 来管理我们的大型二进制内容。 Windows 支持不是awesome,但它正在变得更好。这仅在您不关心跟踪大型二进制文件中的转速时才有用。
  • 对此的更新 - 我们尝试了您的设置并且效果很好,但我们希望我们的资产能够自动同步。我们现在使用 Sugarsync 有选择地同步二进制资产文件夹。 Dropbox 只会同步 Dropbox 文件夹,但通过 Sugar 同步,您可以任意同步硬盘上任何位置的文件夹,非常有用。我们不得不稍微改变我们的 Assets 目录结构来为这些大型二进制文件定义一个子文件夹,但到目前为止它运行得非常好。我们只是 .gitignore 该文件夹并允许糖同步以使其保持同步。
  • 为什么选择Hidden Meta Files
  • 修复了我的复制粘贴错字 - 是的,它应该是可见元文件。
【解决方案2】:

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

  1. Editor → Project Settings → Editor → Version Control Mode 中切换到Visible Meta Files
  2. Editor → Project Settings → Editor → Asset Serialization Mode 中切换到Force Text
  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 项目置于源代码控制之下的更多信息,您可以在 this post 中找到。

【讨论】:

  • 如果您在顶部编辑我的答案以包含这些新选项,可能会更好。 :)
  • 为什么选择Hidden Meta Files
  • 第一点显然是错误的。没有 Unity → Preferences → Packages → Repository
  • 根据docs.unity3d.com/Manual/… 应该是可见元文件
  • 适合我的团队。非常感谢。
【解决方案3】:

什么是 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 设置

你需要做这些设置

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

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

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

来源: Using Git With 3D Games Source Control

【讨论】:

  • +1 这个答案已经写在上面了,但是@NabeelSaleem 的回答帮助了我他提供的图片和清晰的指南:) 谢谢
  • 我在 Unity 5.x Normal 中找不到Preferences > Packages? ty
  • @NabeelSaleem 是的。实际上 Unity 5.x 中的这一步不是必需的。 ty
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    我想我可以为任何感兴趣的人发布一个更简单的.gitignore

    # Ignore Everything
    /*
    
    # Except for these
    !/.gitignore
    !/Assets
    !/Packages
    !/ProjectSettings
    

    【讨论】:

    • 再一次,所有这些答案在这个页面上都已经过时了。如果由于某种原因你必须在 Unity 中使用 git,github.com/github/gitignore/blob/master/Unity.gitignore
    • 小巧、简单且与所有版本完全兼容:我发现此脚本效果最好,即使对于最近更改了项目结构的 Unity 2017 和 2018(UnityPackageManager/Packages/)也是如此。
    【解决方案6】:

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

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

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

    【讨论】:

    • 你试过了吗?
    【解决方案7】:

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

    (A)不要签入库文件夹。我过去曾多次犯过这个错误并为此受苦! 在将项目/文件添加到 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 初始化。

    (3) 复制 .​​gitignore 文件: 在 MacOS 上:cp ~/Downloads/.gitignore 在 Windows 上:复制 c:\Users[yourusername]\Downloads.gitignore 。

    (4) git add .gitignore

    (5) git add *

    希望这对您有所帮助……一切顺利!

    【讨论】:

      【解决方案8】:

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

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

      希望这会有所帮助。

      【讨论】:

        【解决方案9】:

        Edit -> Project Settings -> Editor

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

        我想这就是你想要的。

        【讨论】:

        • 那你如何设置 YAML 合并?
        【解决方案10】:

        只有 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/
        

        【讨论】:

          【解决方案11】:

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

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

          【讨论】:

            【解决方案12】:

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

            【讨论】:

              【解决方案13】:

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

              **/[Tt]emp
              **/[Ll]ibrary
              **/[Bb]uild
              

              【讨论】:

                【解决方案14】:

                我想从过去对 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,但这只是我的喜好。

                【讨论】:

                  【解决方案15】:

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

                  【讨论】:

                    【解决方案16】:

                    我和朋友在 72 小时的 Game Jam 中尝试过这种方法,请注意他们不知道 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/

                    【讨论】:

                      猜你喜欢
                      • 2016-09-30
                      • 1970-01-01
                      • 1970-01-01
                      • 2010-11-30
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多