15
2017
04

Unity3D闆嗘垚TortoiseSVN

        鏃犺鏄釜浜哄紑鍙戣繕鏄洟闃熷紑鍙戯紝鍏绘垚濂界殑鐗堟湰绠$悊涔犳儻鍙互澶уぇ鎻愰珮寮鍙戞晥鐜囥傚父鐢ㄧ殑鐗堟湰绠$悊杞欢涓鑸敤SVN鎴栬匞it銆傚敖绠2鑰呴兘鍦ㄧ敤锛屼絾鏄洿鍔犲亸濂絊VN涓浜涖傚畨瑁匱ortoiseSVN灏卞彲浠ョ洿鎺ュ皢SVN绠$悊杞欢闆嗘垚鍒癢indows鐨凟xplorer涓簡銆傜偣鍑婚紶鏍囧彸閿氨浼氭湁SVN鐨勭浉鍏宠彍鍗曪紝鍙互闈炲父鏂逛究鍦癈heckOut椤圭洰浠ュ強Commit鍜孶pdate銆

20140415001_thumb3

        鍦ㄤ娇鐢║nity3D寮鍙戞椂锛岀洰鍓嶄富娴佺殑浠g爜缂栬緫鍣紙IDE锛夐兘浼氶夋嫨Virsual Studio锛圴S锛夈備綔涓哄畤瀹欑涓寮哄ぇ鐨処DE锛孷S鑷劧涔熸湁SVN鎻掍欢鈥斺擵irsual SVN銆傚畨瑁呭悗灏卞彲浠ュ湪VS閲岄潰杩涜SVN鎿嶄綔浜嗐傚涓嬪浘鎵绀猴紝涓涓」鐩鏋滃凡缁忕撼鍏ヤ簡鐗堟湰绠$悊锛屽湪鏂囦欢鍓嶉潰浼氭湁鏍囪銆傜豢鑹茶〃绀哄悓姝ワ紝榛勮壊琛ㄧず涓嶅悓姝ワ紝绾㈣壊鍒欒〃绀哄啿绐併傚彲浠ヤ娇鐢ㄥ彸閿繘琛孲VN鎿嶄綔

20170415091803_thumb3

image_thumb5

        浣嗘槸缇庝腑涓嶈冻鏄疷nity3D閲岄潰娌℃硶蹇熷湴杩涜SVN鎿嶄綔銆備竴鑸兘鏄洖鍒癊xplorer涓劧鍚庤繘琛屾彁浜わ紝涓嶅渚挎嵎銆傛煡鐪嬩簡Unity Asset Store涓婄殑SVN鎻掍欢锛屽彂鐜板ぇ澶氳繃浜庡鏉傦紝鎴栬呬竴浜涙搷浣滀笉绗﹀悎鍘熸湁鐨勬搷浣滀範鎯傛墍浠ュ浜庝互鏋佺畝楂樻晥涓哄師鍒欑殑鎴戞潵璇达紝杩樹笉濡傝嚜宸卞啓涓涓冻澶熺敤鐨勫皬宸ュ叿銆

        鍦unity鎻掍欢寮鍙戔斺斾竴涓緥瀛愶細绠鍗曠殑svn闆嗘垚涓紝宸茬粡璇存槑浜嗙浉鍏虫柟娉曟槸锛岄氳繃Process.Start鏂规硶寮鍚竴涓猅ortoiseProc.exe杩涚▼锛屽苟灏嗗弬鏁帮紙鐐瑰嚮TortoiseSVN 鎿嶄綔鏌ョ湅鎵鏈夊弬鏁帮級浼犵粰TortoiseProc锛屼娇涔嬫墽琛岀浉鍏崇殑鍛戒护銆

using System;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEngine;

public class SvnEditor : EditorWindow
{
    #region Setup

    private const string Svnkey = "key_svnroot";
    private const string SvnName = "TortoiseProc.exe";
    private static string s_svnpath = SvnName;

    [MenuItem("SVN/Setup", priority = 0)]
    public static void Setup()
    {
        GetWindow<SvnEditor>();
    }

    #endregion

    #region Log
    [MenuItem("Assets/SVN/", priority = 10)]
    [MenuItem("Assets/SVN/LogAll", priority = 11)]
    [MenuItem("SVN/", priority = 10)]
    [MenuItem("SVN/LogAll", priority = 11)]
    public static void SVNLogAll()
    {
        SvnCmdProject(EmSVNCmd.Log);
    }

    [MenuItem("Assets/SVN/Log", priority = 1)]
    public static void SVNLog()
    {
        SvnCmdSelect(EmSVNCmd.Log);
    }

    #endregion

    #region Update

    [MenuItem("Assets/SVN/Update", priority = 2)]
    public static void SVNUpdate()
    {
        SvnCmdSelect(EmSVNCmd.Update);
    }


    [MenuItem("Assets/SVN/UpdateAll", priority = 12)]
    [MenuItem("SVN/UpdateAll", priority = 12)]
    public static void SVNUpdateAll()
    {
        SvnCmdProject(EmSVNCmd.Update);
    }

    #endregion

    #region Commit

    [MenuItem("Assets/SVN/CommitAll", priority = 13)]
    [MenuItem("SVN/CommitAll", priority = 13)]
    public static void SVNCommitAll()
    {
        SvnCmdProject(EmSVNCmd.Commit);
    }

    [MenuItem("Assets/SVN/Commit", priority = 3)]
    public static void SVNCommit()
    {
        SvnCmdSelect(EmSVNCmd.Commit);
    }

    #endregion

    #region Revert

    [MenuItem("Assets/SVN/Revert", priority = 4)]
    public static void SVNRevert()
    {
        SvnCmdSelect(EmSVNCmd.Revert);
    }

    #endregion

    #region Clearup

    [MenuItem("Assets/SVN/ClearUpAll", priority = 15)]
    [MenuItem("SVN/ClearUpAll", priority = 15)]
    public static void SVNClearUpAll()
    {
        SvnCmdProject(EmSVNCmd.Clearup);
    }

    #endregion

    #region core

    private static void SvnCmdProject(EmSVNCmd cmd)
    {
        var path = Application.dataPath;
        var project = Directory.GetParent(path);
        ProcessStart(cmd, project.FullName);
    }

    private static void SvnCmdSelect(EmSVNCmd cmd)
    {
        var select = Selection.activeObject;
        var path = AssetDatabase.GetAssetPath(select);
        ProcessStart(cmd, path);
    }

    private static void ProcessStart(EmSVNCmd cmd, string path)
    {
#if UNITY_STANDALONE_WIN||UNITY_EDITOR_WIN
        try
        {
            var info = new ProcessStartInfo(s_svnpath)
            {
                Arguments = string.Format("/command:{0} /path:{1} /closeonend:0", cmd.ToString().ToLower(), path)
            };
            Process.Start(info);
        }
        catch (Exception)
        {
            Setup();
        }
#endif
    }

    #endregion

    internal void OnEnable()
    {
        s_svnpath = EditorPrefs.GetString(Svnkey);
    }

    internal void OnGUI()
    {
        EditorGUILayout.LabelField("璁剧疆SVN");
        EditorGUILayout.Space();

        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("SVN绋嬪簭", GUILayout.Width(50));
        EditorGUILayout.SelectableLabel(s_svnpath, GUILayout.Width(200));
        if (GUILayout.Button("select"))
        {
            var path = EditorUtility.OpenFilePanel("璇烽夋嫨TortoiseProc.exe瀛樺偍浣嶇疆", "", "exe");
            if (string.IsNullOrEmpty(path))
                return;
            s_svnpath = path;
            EditorPrefs.SetString(Svnkey, s_svnpath);
        }
        if (GUILayout.Button("Clear"))
        {
            s_svnpath = SvnName;
            EditorPrefs.SetString(Svnkey, s_svnpath);
        }

        EditorGUILayout.EndHorizontal();
    }

    private enum EmSVNCmd
    {
        Log,
        Update,
        Commit,
        Revert,
        Clearup
    }
}
芦 涓婁竴绡 涓嬩竴绡 禄