如何使用Git进行Unity3D源代码控制?

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

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

260443 次浏览

以下内容摘自我的个人博客.;

使用Git与3D游戏

GitHub已经发布了一个名为Git LFS的Git插件,直接处理下面的问题。您现在可以轻松有效地版本大型二进制文件!

Git可以很好地处理3D游戏。然而,这里主要的警告是,版本化大(>5 MB)的媒体文件可能是一个长期的问题,因为您的提交历史记录膨胀。我们已经在我们的项目中解决了这个潜在的问题,只有在二进制资产被认为是最终的时候才对它进行版本控制。我们的3D美工使用Dropbox来处理在制品资产,既是出于上述原因,也是因为它更快更简单(没有多少美工会积极使用Git!)

Git工作流

你的Git工作流程需要你根据自己的团队经验以及如何一起工作来决定。然而。我强烈推荐Git流方法正如原作者所描述的

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

Git GUI客户端应用程序

这真的是个人偏好,因为在Git GUI方面有很多选择,或者是否使用GUI。但是我想推荐免费的SourceTree应用程序,因为它完美地插入了Git Flow扩展。阅读源树教程在这里关于在他们的应用程序中实现Git流方法的文章。

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及以上版本跳过此步骤)在Unity → Preferences → Packages → Repository中启用External选项。
  2. 打开Edit菜单,选择Project Settings → Editor:
    1. 切换Version Control ModeVisible Meta Files
    2. 切换Asset Serialization ModeForce Text
    3. 李< / ol > < / >
    4. File菜单保存场景和项目。

    想要将现有的回购迁移到LFS?

    请查看我的博客文章中的步骤在这里怎么做

    额外的配置

    在Unity3D项目中使用Git的一个主要问题是Git不关心目录,并且在删除文件后会很高兴地留下空目录。Unity3D将生成*。当Git不断添加和删除这些元文件时,可能会导致团队成员之间的战斗。

    添加这个Git post-merge钩子/.git/hooks/文件夹中包含Unity3D项目的存储库。在任何Git拉/合并之后,它都会查看哪些文件被删除了,检查文件所在的目录是否为空,如果是,就删除它。

# EYZ0

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

我觉得这就是你想要的。

在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项目置于源代码控制之下的信息,可以在这篇文章中找到。

# EYZ0

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

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

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

GIT客户端应用程序Mac/Windows

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

GitHub是一个可以与朋友、同事、同学和完全陌生的人分享代码的地方。超过500万人使用GitHub一起创建令人惊叹的东西。

# EYZ0

你需要做这些设置

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

enter image description here

在Unity中启用外部选项→Preferences→Packages→Repository

enter image description here

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

enter image description here

< p >来源: # EYZ0 < / p >

我想我可以发布一个更简单的.gitignore给感兴趣的人:

# Ignore Everything
/*


# Except for these
!/.gitignore
!/Assets
!/Packages
!/ProjectSettings

除此之外,在Unity中使用git lfs也是很理想的。自从它问世以来,我一直在使用它,我没有遇到任何麻烦。

您需要将这个.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

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

enter image description here

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

我们现在有无缝集成到unity与Github到unity扩展… # EYZ0 < / p >

新的GitHub for Unity扩展带来了GitHub工作流和更多的Unity,提供支持大文件与Git LFS和文件锁定。

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

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

< p > # EYZ0。我在过去犯过很多次这样的错误,并为此付出了代价! 在将项目/文件添加到git之前,删除或移出库文件夹

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

(C)为Unity使用.gitignore文件-以确保正常运行,并且不会添加不必要的文件-如果在android / tizen -添加规则,排除APK和TPK文件添加到存储库。 或者使用GitHub提供的。gitignore for unity模型: # EYZ0 < / p >

在事后有很多关于为什么会发生这种情况的想法-但现在我只是复制并添加.gitignore文件作为设置存储库的第一步。

所以…为git准备一个Unity项目,执行以下步骤:

(1)进入项目文件夹

< p >(2)类型 Git init .

(3)复制。gitignore文件 MacOS系统:cp ~/Downloads/.gitignore 在Windows下:复制c:\Users[yourusername]\Downloads。gitignore . < / p >

(4) git添加。gitignore

(5) git add *

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

我更喜欢你使用BitBucket,因为它不是公开的,并且在BitBucket上有Unity的官方教程。

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

希望这能有所帮助。

你可以使用Github for Unity统一的扩展将git工作流带入Unity的UI中。

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

只是补充了Gitignore的主题。 推荐的方法只忽略Library和Temp,如果它在你的git项目的根目录内。如果你像我一样,有时需要unity项目成为回购的一部分,而不是整个回购,gitignore中的正确字符串将是:

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

我想添加一个非常简单的工作流程,它来自于曾经对git感到沮丧的人。git有几种使用方式,可能最常见的unity是GitHub Desktop, git Bash和GitHub unity

# EYZ0。

本质上它们都做同样的事情,只是用户的选择不同。你可以使用git进行大文件设置,它允许1GB的免费大文件存储,额外的存储可用在数据包中,每月4美元为50GB,这将允许你将文件>100mb推到远程存储库(它将实际文件存储在服务器上和你的repo指针中)

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

如果你不想安装lfs,不管什么原因,你可以扫描你的项目文件> 128mb在windows通过键入大小:大在你有你的项目的目录。这对于搜索大文件非常方便,尽管可能会漏掉一些100mb到128mb之间的文件。

enter image description here

git bash的一般格式是

Git添加。(添加要提交的文件)

Git commit -m 'message'(提交带有消息的文件,它们仍然在你的PC上,而不是在远程repo中,基本上它们已经被“版本化”为新的提交)

Git推送(将文件推送到存储库)

git bash对于unity项目的缺点是,如果有一个> 100mb的文件,你不会得到一个错误,直到你推送。然后,您必须通过将头部重置到上一次提交来撤销您的提交。有点麻烦,特别是如果你是git bash的新手。

GitHub桌面的优势是,在你提交100mb的文件之前,它会给你一个弹出的错误消息。然后可以收缩这些文件或将它们添加到.gitignore文件中。

要使用.gitignore文件,请在本地存储库根目录中创建一个名为.gitignore的文件。只需一次一行地添加您想要省略的文件。SharedAssets和其他非资产文件夹文件通常可以省略,并将自动在编辑器中重新填充(包可以重新导入等)。您还可以使用通配符来排除文件类型。

如果其他人正在使用你的GitHub回购,你想克隆或拉你有这些选项可供你以及在GitHub桌面或Git bash。

我没有提到太多关于Unity GitHub包,你可以在编辑器中使用GitHub,因为我个人认为界面不是很有用,我不认为总体上它会帮助任何人熟悉git,但这只是我的偏好。

我建议你制作一个.gitignore文件,包含除了资产文件夹以外的所有内容(所有原本在unity项目中的其他文件)。接下来,你应该将所有游戏项目放在一个文件夹中。接下来,在你的游戏的每个项目文件夹中复制.gitignore。这将排除项目中除了资产之外的库和不必要的文件夹。如果你有任何你不想要的项目,那么把它们放在一个新的。gitignore中,在你的游戏项目存储的地方。注意:你可以有多个.gitignore, .gitignore是基于相对路径的。我希望这对你有所帮助!

我和我的朋友在72小时的游戏jam中尝试过这种方法,请注意他们不知道GIT。

首先,我在[GitHub][1](私人回购现在是免费的)与预定义的.gitignore统一模板创建空回购,它应该与此相同:

# 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]: # EYZ0 < / p >

如果你使用源代码控制,确保你有一个git忽略无用的文件:https://github.com/github/gitignore/blob/main/Unity.gitignore

我强烈建议你切换到PlasticSCM。 这是Unity所迁移的内容,并提供了设计师和开发者工作流来管理游戏开发等复杂内容的版本控制

3个用户可以免费获得云版。它取代了Unity的协作工具。

注意:我使用Git/Bitbucket和SourceTree来管理一个简单的项目真的很困难。

https://unity.com/products/plastic-scm