Unityアップデートにより発生する差分を先に全部出すスクリプト

Unityってバージョンをあげても、その時点ではできるだけ差分がでないようにしてくれます。
しかし、その後作業していると「ここの値を1ついじっただけなのに関係ない差分がいっぱい出た!」ってなりがちです。
そうならないように、差分を先に全部出してしまいたい人向けスクリプト。

UnityUpgradeTools.cs
using UnityEditor;
using UnityEditor.SceneManagement;
using System.Linq;
using System.IO;

public static class UnityUpgradeTools
{
    [MenuItem("Tools/Unity Upgrade/Force Reserialize")]
    public static void Run()
    {
        var ok = EditorUtility.DisplayDialog(
            "Unity Upgrade Tools",
            "Unityバージョンアップ差分を出すための重い処理です。\n\n実行しますか?",
            "実行",
            "キャンセル"
        );
        if (!ok) return;

        ForceLoadAllProjectSettingsAssets();
        ReserializeAssets();
        SaveAllScenes();

        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();

        UnityEngine.Debug.Log("Complete!");
    }

    private static void ReserializeAssets()
    {
        AssetDatabase.StartAssetEditing();
        try
        {
            AssetDatabase.ForceReserializeAssets();
        }
        finally
        {
            AssetDatabase.StopAssetEditing();
        }
    }

    private static void SaveAllScenes()
    {
        var scenes = AssetDatabase.FindAssets("t:Scene", new[] { "Assets" }).Select(AssetDatabase.GUIDToAssetPath);

        foreach (var path in scenes)
        {
            var scene = EditorSceneManager.OpenScene(path);
            EditorSceneManager.SaveScene(scene);
        }
    }

    private static void ForceLoadAllProjectSettingsAssets()
    {
        const string root = "ProjectSettings";

        var assetPaths = Directory.GetFiles(root, "*.asset", SearchOption.AllDirectories)
            .Select(path => path.Replace('\\', '/'))
            .OrderBy(p => p)
            .ToArray();

        foreach (var path in assetPaths)
        {
            try
            {
                var objects = AssetDatabase.LoadAllAssetsAtPath(path);
                if (objects == null || objects.Length == 0)
                {
                    UnityEngine.Debug.Log("No assets loaded: " + path);
                    return;
                }

                var touchedAny = false;

                foreach (var obj in objects)
                {
                    if (obj == null)
                    {
                        continue;
                    }

                    try
                    {
                        var so = new SerializedObject(obj);

                        // 値は変えずに、ロード+Applyだけ行う
                        so.Update();
                        so.ApplyModifiedPropertiesWithoutUndo();

                        EditorUtility.SetDirty(obj);
                        touchedAny = true;
                    }
                    catch (System.Exception ex)
                    {
                        UnityEngine.Debug.LogWarning($"Skip object in {path}: {obj.name} ({obj.GetType().Name}) - {ex.Message}");
                    }
                }

                if (touchedAny)
                {
                    UnityEngine.Debug.Log($"Loaded {path}");
                }
            }
            catch (System.Exception ex)
            {
                UnityEngine.Debug.LogWarning($"Failed to load {path} - {ex.Message}");
            }
        }
    }
}