Unity扩展SVN命令

news2024/9/20 22:28:02

可以直接在unity里右键文件提交和查看提交记录
在这里插入图片描述
顶部菜单栏上回退和更新整个unity工程
在这里插入图片描述
SvnForUnity.CS
记得要放在Editor文件夹下

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using UnityEditor;
using UnityEngine;
using Debug = UnityEngine.Debug;

public class SvnForUnity
{
    static string SVN_BASE = Application.dataPath.Replace("/", "\\").Remove(Application.dataPath.Replace("/", "\\").Length - 6, 6);
    
    /// <summary>
    /// 调用cmd命令
    /// </summary>
    /// <param name="command">cmd命令</param>
    /// <param name="argument">命令参数</param>
    private static void ProcessCommand(string command, string argument)
    {
        ProcessStartInfo start = new ProcessStartInfo(command)
        {
            Arguments = argument,
            CreateNoWindow = false,
            ErrorDialog = true,
            UseShellExecute = true//明确传入的执行文件类型
        };

        if (start.UseShellExecute)
        {
            start.RedirectStandardOutput = false;
            start.RedirectStandardError = false;
            start.RedirectStandardInput = false;
        }
        else
        {
            start.RedirectStandardOutput = true;
            start.RedirectStandardError = true;
            start.RedirectStandardInput = true;
            start.StandardOutputEncoding = System.Text.Encoding.UTF8;
            start.StandardErrorEncoding = System.Text.Encoding.UTF8;
        }

        Process p = Process.Start(start);
        
        p.WaitForExit();
        p.Close();
    }
    
    static string MetaFile(string str)
    {
        return str + ".meta";
    }

    static string GetSelectFilePath()
    {
        var selectAssets = Selection.GetFiltered<Object>(SelectionMode.Assets);
        if (selectAssets.Length > 0)
        {
            string selectionPath = string.Empty;
            for (int i = 0; i < selectAssets.Length; i++)
            {
                // Debug.Log(AssetDatabase.GetAssetPath(selectAssets[i]));
                if (AssetDatabase.GetAssetPath(selectAssets[i]) == "Assets")
                {
                    return SVN_BASE + "Assets" + "\"";
                }
                if (i > 0)
                {
                    selectionPath = selectionPath + "*" + SVN_BASE + AssetDatabase.GetAssetPath(selectAssets[i]).Replace("/", "\\");
                    selectionPath = selectionPath + "*" + SVN_BASE + MetaFile(AssetDatabase.GetAssetPath(selectAssets[i])).Replace("/", "\\");
                }
                else
                {
                    selectionPath = SVN_BASE + AssetDatabase.GetAssetPath(selectAssets[i]).Replace("/", "\\");
                    selectionPath = selectionPath + "*" + SVN_BASE + MetaFile(AssetDatabase.GetAssetPath(selectAssets[i])).Replace("/", "\\");
                }
            }

            return selectionPath  + "\"";
        }

        return SVN_BASE + "Assets" + "\"";
    }
    
    /// <summary>
    /// SVN更新
    /// </summary>
    [MenuItem("SVN/Update", false, 1)]
    public static void SvnUpdate()
    {
        ProcessCommand("TortoiseProc.exe", "/command:update /path:\"" + SVN_BASE + "Assets" + "\"");
    }
    
    /// <summary>
    /// SVN提交
    /// </summary>
    [MenuItem("Assets/SVN/Commit", false, 2)]
    public static void SvnCommit()
    {
        var selectPath = GetSelectFilePath();
        ProcessCommand("TortoiseProc.exe", "/command:commit /path:\"" + selectPath);
    }
    
    /// <summary>
    /// SVN回退
    /// </summary>
    [MenuItem("SVN/Revert", false, 3)]
    public static void SvnRevert()
    {
        ProcessCommand("TortoiseProc.exe", "/command:revert /path:\"" + SVN_BASE + "Assets" + "\"");
    }
    
    /// <summary>
    /// SVN显示信息
    /// </summary>
    [MenuItem("Assets/SVN/ShowLog", false, 4)]
    public static void SvnLog()
    {
        var selectPath = GetSelectFilePath();
        ProcessCommand("TortoiseProc.exe", "/command:log /path:\"" + selectPath);
    }
}

参考
https://blog.csdn.net/egostudio/article/details/51074814

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端pc和小程序接入快递100(跳转方式和api方式)====实时查询接口

文章目录 跳转方式微信小程序&#xff08;我以uniapp为例&#xff09;pc api接入说明关于签名计算成功示例 跳转方式 没有任何开发成本&#xff0c;直接一键接入 可以直接看官方文档 https://www.kuaidi100.com/openapi/api_wxmp.shtml 微信小程序&#xff08;我以uniapp为例…

算法日记day 11(KMP算法)

一、KMP算法 基本原理&#xff1a; KMP算法&#xff08;Knuth-Morris-Pratt算法&#xff09;是一种用于在一个文本串&#xff08;字符串&#xff09;中查找一个模式串&#xff08;子串&#xff09;的高效算法。它的主要优点是在匹配过程中避免了回溯&#xff08;backtracking…

【QT】label中添加QImage图片并旋转(水平翻转、垂直翻转、顺时针旋转、逆时针旋转)

目录 0.简介 1.详细代码及解释 1&#xff09;原label显示在界面上 2&#xff09;水平翻转 3&#xff09;垂直翻转 4&#xff09;顺时针旋转45度 5&#xff09;逆时针旋转 0.简介 环境&#xff1a;windows11 QtCreator 背景&#xff1a;demo&#xff0c;父类为QWidget&a…

盒须图boxplot 展示第6条线

正常情况下&#xff0c;盒须图是有5条线的&#xff0c;但是实际产品场景是需要6条线&#xff0c;看了下echarts官网&#xff0c;没看到可配置的地方&#xff0c;只能自己骚操作了&#xff0c;效果图如下&#xff1a; 重点&#xff1a;用两条x轴&#xff0c;第6条线挂在第二条x…

【flink】之如何快速搭建一个flink项目

1.通过命令快速生成一个flink项目 curl https://flink.apache.org/q/quickstart.sh | bash -s 1.19.1 生成文件目录&#xff1a; 其中pom文件包好我们所需要的基础flink相关依赖 2.测试 public class DataStreamJob {public static void main(String[] args) throws Except…

GitHub 令牌泄漏, Python 核心资源库面临潜在攻击

TheHackerNews网站消息&#xff0c;软件供应链安全公司 JFrog 的网络安全研究人员称&#xff0c;他们发现了一个意外泄露的 GitHub 令牌&#xff0c;可授予 Python 语言 GitHub 存储库、Python 软件包索引&#xff08;PyPI&#xff09;和 Python 软件基金会&#xff08;PSF&…

《昇思25天学习打卡营第25天|onereal》

初学入门/初学教程/08-模型训练.ipynb 模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 构建数据集 首先从数…

国内AI算力芯片厂商群雄逐鹿,创新产品引领边缘计算新风尚

近年来&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI算力芯片作为支撑这一技术的关键基础设施&#xff0c;受到了前所未有的关注。国内厂商纷纷加入竞争&#xff0c;四川万物纵横科技就是其中争流涌进的一员&#xff0c;公司不仅在技术上追求创新&#xff0c;还在市场…

FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息

前面我们发送的大多数都是text类型的消息&#xff0c;对于text消息来说&#xff0c;后端处理出来要麻烦的多&#xff0c;那么我们可以不可以传递json格式的数据&#xff0c;对于前后端来说都比较友好&#xff0c;答案是肯定的&#xff0c;我们需要做下处理。 首先&#xff0c;…

LNMP环境配置问题整理

首先是一键安装直接报错&#xff1a; 换教程&#xff1a;搭建LNMP&#xff0c;步骤最详细&#xff0c;附源码&#xff0c;学不会打我-CSDN博客 mysql安装成功之后&#xff1a; MySQL 启动报错&#xff1a;Job for mysqld.service failed because the control process exited …

Java 在PDF中替换文字(详解)

目录 使用工具 Java在PDF中替换特定文字的所有实例 Java在PDF中替换特定文字的第一个实例 Java在PDF中使用正则表达式替换特定文字 其他替换条件设置 可能出现的问题及解决方案 PDF文档中的信息随时间的推移可能会发生变化&#xff0c;比如产品价格、联系方式等。为了确保…

迭代学习笔记

一、迭代学习定义和分类 1、直观理解 迭代学习一般应用于重复性的场景。比如控制一个单自由度的小车以特定的速度曲线移动到指定位置&#xff0c;整个时间是10s&#xff0c;控制频率是0.01&#xff0c;那么整个控制序列就会有1000个点。这1000个点在10s内依次发出&#xff0c…

网络编程-TCP 协议的三次握手和四次挥手做了什么

TCP 协议概述 1. TCP 协议简介 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 协议提供可靠的通信服务&#xff0c;通过校验和、序列号、确认应答、重传等机制保证数据传输…

Pytorch学习笔记day4——训练mnist数据集和初步研读

该来的还是来了hhhhhhhhhh&#xff0c;基本上机器学习的初学者都躲不开这个例子。开源&#xff0c;数据质量高&#xff0c;数据尺寸整齐&#xff0c;问题简单&#xff0c;实在太适合初学者食用了。 今天把代码跑通&#xff0c;趁着周末好好的琢磨一下里面的各种细节。 代码实…

C++内存管理(区别C语言)深度对比

欢迎来到我的Blog&#xff0c;点击关注哦&#x1f495; 前言 前面已经介绍了类和对象&#xff0c;对C面向对象编程已经有了全面认识&#xff0c;接下来要学习对语言学习比较重要的是对内存的管理。 一、内存的分区 代码区&#xff1a;存放程序的机器指令&#xff0c;通常是可…

js实现数组的下标为n的对象后面新增一条对象

前言&#xff1a; js实现数组的下标为n的对象后面新增一条对象 实现方法&#xff1a; arr.splice(1, 0, obj); splice 参数1: 数组里面的第几个元素&#xff0c;你希望在第几个对象后面新增参数2: 0 表示不删除任何元素参数3: 插入的新对象 let arr [{},{},{},{}] let obj…

vue使用echarts开发大屏可视化(附echarts案例资源)

近年来&#xff0c;可视化在前端领域是越来越多。最近投入的一个项目就是关于大屏可视化&#xff0c;基本就是用到了echarts&#xff0c;所以项目结束后&#xff0c;我也来总结一下如何在Vue中去引入echarts并使用。 文章目录 一、echarts案例网站可视化社区(https://www.makea…

Zoho Mail企业邮箱好用吗?

企业在选择企业邮箱时需要考虑三大因素&#xff0c;一是安全隐私&#xff0c;二是功能易用&#xff0c;三是产品价格。作为国际排行前五的企业邮箱&#xff0c;Zoho邮箱好用吗&#xff1f;本文将为您详细介绍Zoho邮箱的功能、安全性和产品价格。 一、安全隐私 1、数据加密与安…

MySQL----初始数据类型

前言 一、tinyint 范围&#xff1a;-128-----127 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。如果我们向mysqlt特定的类型中插入不合法的数据&#xff0c;Mysq一般会直接拦截&#xff0c…

【HarmonyOS学习】定位相关知识(Locationkit)

简介 LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。 可以实现点击获取用户位置信息、持续获取位置信息和区域进出监控等多项功能。 需要注意&#xff0c;需要确定用户已经开启定位信息&#xff0c;一下的代码没有做这一步的操作&#xff0c;默…