鏃犺鏄釜浜哄紑鍙戣繕鏄洟闃熷紑鍙戯紝鍏绘垚濂界殑鐗堟湰绠$悊涔犳儻鍙互澶уぇ鎻愰珮寮鍙戞晥鐜囥傚父鐢ㄧ殑鐗堟湰绠$悊杞欢涓鑸敤SVN鎴栬匞it銆傚敖绠2鑰呴兘鍦ㄧ敤锛屼絾鏄洿鍔犲亸濂絊VN涓浜涖傚畨瑁匱ortoiseSVN灏卞彲浠ョ洿鎺ュ皢SVN绠$悊杞欢闆嗘垚鍒癢indows鐨凟xplorer涓簡銆傜偣鍑婚紶鏍囧彸閿氨浼氭湁SVN鐨勭浉鍏宠彍鍗曪紝鍙互闈炲父鏂逛究鍦癈heckOut椤圭洰浠ュ強Commit鍜孶pdate銆
鍦ㄤ娇鐢║nity3D寮鍙戞椂锛岀洰鍓嶄富娴佺殑浠g爜缂栬緫鍣紙IDE锛夐兘浼氶夋嫨Virsual Studio锛圴S锛夈備綔涓哄畤瀹欑涓寮哄ぇ鐨処DE锛孷S鑷劧涔熸湁SVN鎻掍欢鈥斺擵irsual SVN銆傚畨瑁呭悗灏卞彲浠ュ湪VS閲岄潰杩涜SVN鎿嶄綔浜嗐傚涓嬪浘鎵绀猴紝涓涓」鐩鏋滃凡缁忕撼鍏ヤ簡鐗堟湰绠$悊锛屽湪鏂囦欢鍓嶉潰浼氭湁鏍囪銆傜豢鑹茶〃绀哄悓姝ワ紝榛勮壊琛ㄧず涓嶅悓姝ワ紝绾㈣壊鍒欒〃绀哄啿绐併傚彲浠ヤ娇鐢ㄥ彸閿繘琛孲VN鎿嶄綔
浣嗘槸缇庝腑涓嶈冻鏄疷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 } }