如何在合并后修复Git-lfs中的Unity .prefab文件

8
我正在使用Unity 17.2.1中的Unity3D项目。
我在Windows 10上使用带有Git-LFS和SourceTree的git。
现在我的问题是:
在本地克隆时一切都很好。但是,如果我将该项目克隆到一个新文件夹(用于测试),我会遇到许多错误。它可以下载大部分由LFS跟踪的文件,但对于其中的一些文件,我会收到“Error downloading object”消息。
我可以通过从工作的本地克隆中导出整个Assets文件夹作为unitypackage来在本地恢复副本,但即使这样,git也仍然声称它“up-to-date”,因此无法再次提交/推送。
我如何修复远程存储库(github)上的这些LFS跟踪文件?
因为在我的本地克隆上一切正常,所以我想必须有某种方法来“强制” git-lfs 上传所有文件,就像我拥有它们一样。
此外,我还有两个脚本,我在合并之前将它们重命名了。 在主分支上,它是:
DebugHUDManager.cs
ConfigurationHUDManager.cs

但是我已经将类和文件重命名为

DebugHudManager.cs
ConfigurationHudManager.cs

在我的本地(工作)克隆中,我拥有较新的文件,而当我新克隆时,我得到了较旧的文件(..HUD..),因此GameObject只附加了缺失脚本。我可以通过重新命名文件来解决这个问题。但这也没有被Git跟踪。它一直说“已经是最新的”。


这是我的.gitattributes文件:

# Unity
*.cginc   text
*.cs      diff=csharp text
*.shader  text


# Unity YAML
*.anim               merge=unityyamlmerge eol=lf
*.asset              merge=unityyamlmerge eol=lf
*.controller         merge=unityyamlmerge eol=lf
*.mat                merge=unityyamlmerge eol=lf
*.meta               merge=unityyamlmerge eol=lf
*.physicsMaterial    merge=unityyamlmerge eol=lf
*.physicsMaterial2D  merge=unityyamlmerge eol=lf
*.prefab             merge=unityyamlmerge eol=lf
*.unity              merge=unityyamlmerge eol=lf


# Unity LFS
*.cubemap       filter=lfs diff=lfs merge=lfs -text
*.unitypackage  filter=lfs diff=lfs merge=lfs -text


# Image
*.ai    filter=lfs diff=lfs merge=lfs -text
*.apng  filter=lfs diff=lfs merge=lfs -text
*.astc  filter=lfs diff=lfs merge=lfs -text
*.bmp   filter=lfs diff=lfs merge=lfs -text
*.dds   filter=lfs diff=lfs merge=lfs -text
*.eps   filter=lfs diff=lfs merge=lfs -text
*.exr   filter=lfs diff=lfs merge=lfs -text
*.gif   filter=lfs diff=lfs merge=lfs -text
*.hdr   filter=lfs diff=lfs merge=lfs -text
*.jpeg  filter=lfs diff=lfs merge=lfs -text
*.jpg   filter=lfs diff=lfs merge=lfs -text
*.ktx   filter=lfs diff=lfs merge=lfs -text
*.png   filter=lfs diff=lfs merge=lfs -text
*.psd   filter=lfs diff=lfs merge=lfs -text
*.pvr   filter=lfs diff=lfs merge=lfs -text
*.svg   filter=lfs diff=lfs merge=lfs -text
*.svgz  filter=lfs diff=lfs merge=lfs -text
*.tga   filter=lfs diff=lfs merge=lfs -text
*.tif   filter=lfs diff=lfs merge=lfs -text
*.tiff  filter=lfs diff=lfs merge=lfs -text
*.webm  filter=lfs diff=lfs merge=lfs -text
*.webp  filter=lfs diff=lfs merge=lfs -text


# Audio
*.aif   filter=lfs diff=lfs merge=lfs -text
*.m4a   filter=lfs diff=lfs merge=lfs -text
*.mp3   filter=lfs diff=lfs merge=lfs -text
*.ogg   filter=lfs diff=lfs merge=lfs -text
*.wav   filter=lfs diff=lfs merge=lfs -text


# Video
*.asf   filter=lfs diff=lfs merge=lfs -text
*.avi   filter=lfs diff=lfs merge=lfs -text
*.flv   filter=lfs diff=lfs merge=lfs -text
*.mov   filter=lfs diff=lfs merge=lfs -text
*.mp4   filter=lfs diff=lfs merge=lfs -text
*.mpeg  filter=lfs diff=lfs merge=lfs -text
*.mpg   filter=lfs diff=lfs merge=lfs -text
*.ogv   filter=lfs diff=lfs merge=lfs -text
*.wmv   filter=lfs diff=lfs merge=lfs -text


# 3D Object
*.blend  filter=lfs diff=lfs merge=lfs -text
*.dxf    filter=lfs diff=lfs merge=lfs -text
*.fbx    filter=lfs diff=lfs merge=lfs -text
*.lxo    filter=lfs diff=lfs merge=lfs -text
*.ma     filter=lfs diff=lfs merge=lfs -text
*.max    filter=lfs diff=lfs merge=lfs -text
*.mb     filter=lfs diff=lfs merge=lfs -text
*.obj    filter=lfs diff=lfs merge=lfs -text


# Compressed Archive
*.7z   filter=lfs diff=lfs merge=lfs -text
*.bz2  filter=lfs diff=lfs merge=lfs -text
*.gz   filter=lfs diff=lfs merge=lfs -text
*.rar  filter=lfs diff=lfs merge=lfs -text
*.tar  filter=lfs diff=lfs merge=lfs -text
*.zip  filter=lfs diff=lfs merge=lfs -text


# Compiled Dynamic Library
*.dll  filter=lfs diff=lfs merge=lfs -text
*.pdb  filter=lfs diff=lfs merge=lfs -text
*.so   filter=lfs diff=lfs merge=lfs -text


# Compiled Static Library
*.a            filter=lfs diff=lfs merge=lfs -text
*.la           filter=lfs diff=lfs merge=lfs -text
*.lai          filter=lfs diff=lfs merge=lfs -text
*.lib          filter=lfs diff=lfs merge=lfs -text
*.llblgenproj  filter=lfs diff=lfs merge=lfs -text


# Font
*.otf  filter=lfs diff=lfs merge=lfs -text
*.ttf  filter=lfs diff=lfs merge=lfs -text


# Executable/Installer
*.apk  filter=lfs diff=lfs merge=lfs -text
*.exe  filter=lfs diff=lfs merge=lfs -text


# Documents
*.pdf  filter=lfs diff=lfs merge=lfs -text


# Other
*.reason  filter=lfs diff=lfs merge=lfs -text
*.rns filter=lfs diff=lfs merge=lfs -text

进一步说明

  • 问题出现在一次大规模合并之后。

  • 我没有激活使用 UnityYamlMerge.exe 进行 Unity 智能合并。(我现在添加了这个功能。)

  • 所有缺失的文件都是类型为 .prefab.unity 的文件。它们似乎都是在合并前我最新提交的一些文件。但其他的 .prefab 文件可以正常下载。

  • 此外,大小似乎并不重要,因为大多数文件只有 10Kb 左右,而一些成功下载的 .prefab 文件的大小为 1.9Mb。

  • 资源序列化模式 = 强制文本

  • 我刚刚又进行了一个测试提交,只包含一个新的 .prefab 文件。那个可以正常工作。唯一不能正常工作的是那些由合并添加/更改的特定的 .prefab 文件。

我该如何拯救这个项目?o.O

更新:
与此同时,我创建了一个新的存储库,并将文件(当然不包括 .git 文件夹)从我的工作本地克隆中复制了过来。但新存储库中的历史记录已经丢失了。但至少我们可以继续一起工作。


你是以哪种模式存储你的资产,文本还是二进制? - Kay
我有默认值:强制文本 - derHugo
1
关于大小写问题:尝试运行 git config --list 命令并检查 core.ignorecase 是否存在。参见 https://dev59.com/aWMm5IYBdhLWcg3wVt4s。 - Kay
@Kay 很棒,谢谢! - derHugo
1个回答

1
我知道您已经解决了合并问题,但我想记录一下我解决同样问题的方法。问题是,我试图将LFS跟踪的.prefabs合并到主分支中,但文件要么损坏,要么链接错误,在合并后Unity项目中无法加载。

在看到您上面的.gitattributes文件后,我意识到问题在于SmartMerge(UnityYAMLMerge)无法处理合并,因此这些文件当然不会合并。这是我所做的:

首先,我重置了主分支,然后确认在Unity中一切仍然正常工作。

git reset --hard origin/master

第二,我更新了我的.gitattributes文件使用类似于您的设置, 有效地将所有.prefabs从LFS中移出,以便可以由UnityYAMLMerge处理。

enter image description here

第三步,我将更改提交到主分支。

完成后,切换到要合并的分支,并再次执行相同的任务,这也将更新的 .prefabs 版本移动到由 UnityYAMLMerge 处理。

最后,在主分支中尝试合并更新的分支,所有的 .prefabs 都被成功合并(感谢 Atom 中的一些评论,我强烈推荐使用该外部工具),且没有任何错误。

编辑:将此设置添加到 .gitattributes 中并不能保证 .prefab 会移出 LFS——只有在您编辑 .prefab 后才会发生。当您尝试合并仍指向 LFS 中 .prefab 的分支时,这可能会很麻烦,因为这会破坏 Unity 中的引用。为此,我将资源的文本复制到带有 LFS 引用的原始文本上,并在 Unity 中重新链接。

atom


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接