git版本控制系统早已成为开发世界中的事实上的标准,但是对于大多数Unity开发人员来说,与Unity功能相关联的许多障碍使它无法有效地与git配合使用已不是什么秘密。以下是常见问题的列表:- 不必要的文件进入存储库,反之亦然,没有得到正确的文件
- 许多大文件会增加存储库的大小
- 合并Yaml Unity文件的问题
- 仅文件本身或仅meta被添加到存储库
- 项目中有空文件夹
- 版本和构建的自动编号的复杂性
- 在多个项目之间使用代码的不便
在我的文章系列中,您可以阅读有关与git和Unity联合使用有关的这些问题的解决方案。本文将介绍前三个问题的解决方案。让我们尝试分步描述解决每个问题的方法。在为您的项目创建存储库后,我们要做的第一件事就是配置异常,在此我不做详细介绍,这是一个很好的示例。唯一的提示是您可能应该在末尾添加几个例外!*。Dll-因为如果您使用插件或第三方资产,则必须将dll存储在存储库中,并且在Windows上git默认情况下会忽略该dll;!*。obj-如果您使用这种格式的模型,则默认情况下,Windows中的obj文件也可以忽略我的版本是.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/
/[Uu]ser[Ss]ettings/
# MemoryCaptures can get excessive in size.
# They also could contain extremely sensitive data
/[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
# Packed Addressables
/[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
# Temporary auto-generated Android Assets
/[Aa]ssets/[Ss]treamingAssets/aa.meta
/[Aa]ssets/[Ss]treamingAssets/aa/*
# Exceptions
!*.dll
!*.obj
第二步,我们将尝试解决大文件存储库增长的问题。这个解决方案是LFS要为我们的存储库配置lfs文件类型,请.gitattributes
在项目根目录下的文件中添加几行(您可能必须创建它,而Windows可能不允许您在资源管理器中使用此文件创建文件)## git-lfs ##
#Image
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.gif filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.ai filter=lfs diff=lfs merge=lfs -text
*.tif filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.cubemap filter=lfs diff=lfs merge=lfs -text
*.svg filter=lfs diff=lfs merge=lfs -text
#Audio
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text
#Video
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.mov filter=lfs diff=lfs merge=lfs -text
*.webm filter=lfs diff=lfs merge=lfs -text
#3D Object
*.FBX filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.blend filter=lfs diff=lfs merge=lfs -text
*.obj filter=lfs diff=lfs merge=lfs -text
#ETC
*.a filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.dll filter=lfs diff=lfs merge=lfs -text
*.unitypackage filter=lfs diff=lfs merge=lfs -text
*.aif filter=lfs diff=lfs merge=lfs -text
*.ttf 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
此处列出了大多数二进制文件,并且可能很大。我会解释一下:以#开头的行是注释;filter=lfs diff=lfs merge=lfs
-这些是使git对这些类型的文件使用lfs的神奇词汇; -text表示文件是二进制文件,您不需要合并它。如果您的项目使用任何其他大的二进制文件,请稍后在此处添加它们,以更改文件存储的类型(传输至lfs或从中删除文件)非常困难。下一步是尝试通过复杂的合并稍微改善情况。Unity包含UnityYAMLMerge实用程序,该实用程序可让您有效地合并yaml文件。在文件中添加.gitattributes
几行:*.cs diff=csharp text
*.cginc text
*.shader text
*.mat merge=unityyamlmerge
*.anim merge=unityyamlmerge
*.unity merge=unityyamlmerge
*.prefab merge=unityyamlmerge
*.physicsMaterial2D merge=unityyamlmerge
*.physicsMaterial merge=unityyamlmerge
*.asset merge=unityyamlmerge
*.meta merge=unityyamlmerge
*.controller merge=unityyamlmerge
让我解释一下我们所做的事情:对于.cs文件,他们建议将文本作为C#代码。对于cginc和shader文件,他们还为大多数Unity yaml文件选择了文本表示形式,还选择了自定义合并驱动程序unityyamlmerge您还需要对其进行配置:将以下代码添加到任何.gitconfig中,最简单地将其添加到位于.git / config路径中的本地代码中。仓库根目录:[merge "unityyamlmerge"]
name = Unity SmartMerge (UnityYamlMerge)
driver = \"{ Unity}/Editor/Data/Tools/UnityYAMLMerge.exe\" merge -h -p --force --fallback none %O %B %A %A
recursive = binary
-p标志强制UnityYamlMerge更改文件的内容,即使无法完全解决冲突也是如此,并且极大地简化了手动解决的方法。例如,当使用标准git merge机制合并更改了同一场景的两个分支时,我们将看到许多更改。使用自定义驱动程序时,即使更改了相同组件的相同字段,冲突中也将只有1行。为了方便起见,我创建了一个小脚本,该脚本将允许Unity首次打开项目时自动安装unityyamlmerge。它可以放在Assets文件夹中的任何位置(它需要在系统上安装git并在PATH变量中注册,即可以通过git命令访问);这个班#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System;
namespace GitIntegration
{
[InitializeOnLoad]
public class SmartMergeRegistrator
{
const string SmartMergeRegistratorEditorPrefsKey = "smart_merge_installed";
const int Version = 1;
static string VersionKey = $"{Version}_{Application.unityVersion}";
public static string ExecuteGitWithParams(string param)
{
var processInfo = new System.Diagnostics.ProcessStartInfo("git");
processInfo.UseShellExecute = false;
processInfo.WorkingDirectory = Environment.CurrentDirectory;
processInfo.RedirectStandardOutput = true;
processInfo.RedirectStandardError = true;
processInfo.CreateNoWindow = true;
var process = new System.Diagnostics.Process();
process.StartInfo = processInfo;
process.StartInfo.FileName = "git";
process.StartInfo.Arguments = param;
process.Start();
process.WaitForExit();
if (process.ExitCode != 0)
throw new Exception(process.StandardError.ReadLine());
return process.StandardOutput.ReadLine();
}
[MenuItem("Tools/Git/SmartMerge registration")]
static void SmartMergeRegister()
{
try
{
var UnityYAMLMergePath = EditorApplication.applicationContentsPath + "/Tools" + "/UnityYAMLMerge.exe";
ExecuteGitWithParams("config merge.unityyamlmerge.name \"Unity SmartMerge (UnityYamlMerge)\"");
ExecuteGitWithParams($"config merge.unityyamlmerge.driver \"\\\"{UnityYAMLMergePath}\\\" merge -h -p --force --fallback none %O %B %A %A\"");
ExecuteGitWithParams("config merge.unityyamlmerge.recursive binary");
EditorPrefs.SetString(SmartMergeRegistratorEditorPrefsKey, VersionKey);
Debug.Log($"Succesfuly registered UnityYAMLMerge with path {UnityYAMLMergePath}");
}
catch (Exception e)
{
Debug.Log($"Fail to register UnityYAMLMerge with error: {e}");
}
}
static SmartMergeRegistrator()
{
var instaledVersionKey = EditorPrefs.GetString(SmartMergeRegistratorEditorPrefsKey);
if (instaledVersionKey != VersionKey)
SmartMergeRegister();
}
}
}
#endif
: , Unity , EditorPrefs «» , ( , Unity, ) git gitconfig .
.gitattributes的最终版本## Unity ##
*.cs diff=csharp text
*.cginc text
*.shader text
*.mat merge=unityyamlmerge
*.anim merge=unityyamlmerge
*.unity merge=unityyamlmerge
*.prefab merge=unityyamlmerge
*.physicsMaterial2D merge=unityyamlmerge
*.physicsMaterial merge=unityyamlmerge
*.asset merge=unityyamlmerge
*.meta merge=unityyamlmerge
*.controller merge=unityyamlmerge
## git-lfs ##
#Image
*.jpg filter=lfs diff=lfs merge=lfs -text
*.jpeg filter=lfs diff=lfs merge=lfs -text
*.png filter=lfs diff=lfs merge=lfs -text
*.gif filter=lfs diff=lfs merge=lfs -text
*.psd filter=lfs diff=lfs merge=lfs -text
*.ai filter=lfs diff=lfs merge=lfs -text
*.tif filter=lfs diff=lfs merge=lfs -text
*.tga filter=lfs diff=lfs merge=lfs -text
*.cubemap filter=lfs diff=lfs merge=lfs -text
*.svg filter=lfs diff=lfs merge=lfs -text
#Audio
*.mp3 filter=lfs diff=lfs merge=lfs -text
*.wav filter=lfs diff=lfs merge=lfs -text
*.ogg filter=lfs diff=lfs merge=lfs -text
#Video
*.mp4 filter=lfs diff=lfs merge=lfs -text
*.mov filter=lfs diff=lfs merge=lfs -text
*.webm filter=lfs diff=lfs merge=lfs -text
#3D Object
*.FBX filter=lfs diff=lfs merge=lfs -text
*.fbx filter=lfs diff=lfs merge=lfs -text
*.blend filter=lfs diff=lfs merge=lfs -text
*.obj filter=lfs diff=lfs merge=lfs -text
#ETC
*.a filter=lfs diff=lfs merge=lfs -text
*.exr filter=lfs diff=lfs merge=lfs -text
*.pdf filter=lfs diff=lfs merge=lfs -text
*.zip filter=lfs diff=lfs merge=lfs -text
*.dll filter=lfs diff=lfs merge=lfs -text
*.unitypackage filter=lfs diff=lfs merge=lfs -text
*.aif filter=lfs diff=lfs merge=lfs -text
*.ttf 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
完成这些步骤后,我强烈建议提交存储库的当前状态。准备好项目https://github.com/newnon/UnityGitHabr1再次提醒您正确工作,必须将git安装在系统中,并且可以通过git命令访问。如果你想实验github test1 test2 test3
merge test1 test2 test3
test2 test1 test3 m_LocalPosition
E Unity Tools/Git/