当前位置: 首页 > news >正文

在java程序中使用protobuf

文章目录

  • 简介
  • 为什么使用protobuf
  • 定义.proto文件
  • 编译协议文件
  • 详解生成的文件
  • Builders 和 Messages
  • 序列化和反序列化
  • 协议扩展
  • 总结

简介

Protocol Buffer是google出品的一种对象序列化的方式,它的体积小传输快,深得大家的喜爱。protobuf是一种平台无关和语言无关的协议,通过protobuf的定义文件,可以轻松的将其转换成多种语言的实现,非常方便。

今天将会给大家介绍一下,protobuf的基本使用和同java结合的具体案例。

为什么使用protobuf

我们知道数据在网络传输中是以二进制进行的,一般我们使用字节byte来表示, 一个byte是8bits,如果要在网络上中传输对象,一般需要将对象序列化,序列化的目的就是将对象转换成byte数组在网络中传输,当接收方接收到byte数组之后,再对byte数组进行反序列化,最终转换成java中的对象。

那么将java对象序列化可能会有如下几种方法:

  1. 使用JDK自带的对象序列化,但是JDK自带的序列化本身存在一些问题,并且这种序列化手段只适合在java程序之间进行传输,如果是非java程序,比如PHP或者GO,那么序列化就不通用了。

  2. 你还可以自定义序列化协议,这种方式的灵活程度比较高,但是不够通用,并且实现起来也比较复杂,很可能出现意想不到的问题。

  3. 将数据转换成为XML或者JSON进行传输。XML和JSON的好处在于他们都有可以区分对象的起始符号,通过判断这些符号的位置就可以读取到完整的对象。但是不管是XML还是JSON的缺点都是转换成的数据比较大。在反序列化的时候对资源的消耗也比较多。

所以我们需要一种新的序列化的方法,这就是protobuf,它是一种灵活、高效、自动化的解决方案。

通过编写一个.proto的数据结构定义文件,然后调用protobuf的编译器,就会生成对应的类,该类以高效的二进制格式实现protobuf数据的自动编码和解析。 生成的类为定义文件中的数据字段提供了getter和setter方法,并提供了读写的处理细节。 重要的是,protobuf可以向前兼容,也就是说老的二进制代码也可以使用最新的协议进行读取。

定义.proto文件

.proto文件中定义的是你将要序列化的消息对象。我们来一个最基本的student.proto文件,这个文件定义了student这个对象中最基本的属性。

先看一个比较简单的.proto文件:

syntax = "proto3";package com.flydean;option java_multiple_files = true;
option java_package = "com.flydean.tutorial.protos";
option java_outer_classname = "StudentListProtos";message Student {optional string name = 1;optional int32 id = 2;optional string email = 3;enum PhoneType {MOBILE = 0;HOME = 1;}message PhoneNumber {optional string number = 1;optional PhoneType type = 2;}repeated PhoneNumber phones = 4;
}message StudentList {repeated Student student = 1;
}

第一行定义的是protobuf中使用的syntax协议,默认情况下是proto2,因为目前最新的协议是proto3,所以这里我们使用proto3作为例子。

然后我们定义了所在的package,这个package是指编译的时候生成文件的包。这是一个命名空间,虽然我们在后面定义了java_package,但是为了和非java语言中的协议相冲突,所以定义package还是非常有必要的。

然后是三个专门给java程序使用的option。java_multiple_files, java_package, 和 java_outer_classname.

其中java_multiple_files指编译过后java文件的个数,如果是true,那么将会一个java对象一个类,如果是false,那么定义的java对象将会被包含在同一个文件中。

java_package指定生成的类应该使用的Java包名称。 如果没有明确的指定,则会使用之前定义的package的值。

java_outer_classname选项定义将表示此文件的包装类的类名。 如果没有给java_outer_classname赋值,它将通过将文件名转换为大写驼峰来生成。 例如,默认情况下,“student.proto”将使用"Student"作为包装类名称。

接下来的部分是消息的定义,对于简单类型来说可以使用bool, int32, float, double, 和 string来定义字段的类型。

上例中我们还使用了复杂的组合属性,和嵌套类型。还定义了一个枚举类。

上面我们为每个属性值分配了ID,这个ID是二进制编码中使用的唯一“标签”。因为在protobuf中标记数字1-15比16以上的标记数字占用的字节空间要更少,因此作为一种优化,通常将1-15这些标记用于常用或重复的元素,而将标记16和更高的标记用于不太常用的可选元素。

然后再来看看字段的修饰符,有三个修饰符分别是optional,repeated和required。

optional表示该字段是可选的,可以设置也可以不设置,如果没有设置,则会使使用默认值,对于简单类型来说,我们可以自定义默认值,如果不自定义,就会使用系统的默认值。对于系统的默认值来说,数字为0,字符串为空字符串,布尔值为false。

repeated表示该字段是可以重复的,这种重复实际上就是一种数组的结构。

required表示该字段是必须的,如果该字段没有值,那么该字段将会被认为是没有初始化,尝试构建未初始化的消息将抛出 RuntimeException,解析未初始化的消息将抛出 IOException。

注意,在Proto3中不支持required字段。

编译协议文件

定义好proto文件之后,就可以使用protoc命令对其进行编译了。

protoc是protobuf提供的编译器,一般情况下,可以从github的release库中直接下载即可。如果你不想直接下载,或者官方提供的库中并没有你需要的版本,则可以使用源代码直接进行编译。

protoc的使用的命令如下:

protoc --experimental_allow_proto3_optional -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/student.proto

如果编译proto3,则需要添加–experimental_allow_proto3_optional选项。

我们运行一下上面的代码。会发现在com.flydean.tutorial.protos包里面生成了5个文件。分别是:

Student.java              
StudentList.java          
StudentListOrBuilder.java 
StudentListProtos.java    
StudentOrBuilder.java

其中StudentListOrBuilder和StudentOrBuilder是两个接口,Student和StudentList是这两个类的实现。

详解生成的文件

在proto文件中,我们主要定义了两个类Student和StudentList, 他们中定义了一个内部类Builder,以Student为例,看下这个两个类的定义:

public final class Student extendscom.google.protobuf.GeneratedMessageV3 implementsStudentOrBuilderpublic static final class Builder extendscom.google.protobuf.GeneratedMessageV3.Builder<Builder> implementscom.flydean.tutorial.protos.StudentOrBuilder

可以看到他们实现的接口都是一样的,表示他们可能提供了相同的功能。实际上Builder是对消息的一个封装器,所有对Student的操作都可以由Builder来完成。

对于Student中的字段来说,Student类只有这些字段的get方法,而Builder中同时有get和set方法。

对于Student来说,对于字段的方法有:

// required string name = 1;
public boolean hasName();
public String getName();// required int32 id = 2;
public boolean hasId();
public int getId();// optional string email = 3;
public boolean hasEmail();
public String getEmail();// repeated .tutorial.Person.PhoneNumber phones = 4;
public List<PhoneNumber> getPhonesList();
public int getPhonesCount();
public PhoneNumber getPhones(int index);

对于Builder来说,每个属性多了两个方法:

// required string name = 1;
public boolean hasName();
public java.lang.String getName();
public Builder setName(String value);
public Builder clearName();// required int32 id = 2;
public boolean hasId();
public int getId();
public Builder setId(int value);
public Builder clearId();// optional string email = 3;
public boolean hasEmail();
public String getEmail();
public Builder setEmail(String value);
public Builder clearEmail();// repeated .tutorial.Person.PhoneNumber phones = 4;
public List<PhoneNumber> getPhonesList();
public int getPhonesCount();
public PhoneNumber getPhones(int index);
public Builder setPhones(int index, PhoneNumber value);
public Builder addPhones(PhoneNumber value);
public Builder addAllPhones(Iterable<PhoneNumber> value);
public Builder clearPhones();

多出的两个方法是set和clear方法。clear是清空字段的内容,让其变回初始状态。

我们还定义了一个枚举类PhoneType:

  public enum PhoneTypeimplements com.google.protobuf.ProtocolMessageEnum

这个类的实现和普通的枚举类没太大区别。

Builders 和 Messages

如上一节所示,Message对应的类只有get和has方法,所以它是不可以变的,消息对象一旦被构造,就不能被修改。要构建消息,必须首先构建一个构建器,将要设置的任何字段设置为你选择的值,然后调用构建器的 build()方法。

每次调用Builder的方法都会返回一个新的Builder,当然这个返回的Builder和原来的Builder是同一个,返回Builder只是为了方便进行代码的连写。

下面的代码是如何创建一个Student实例:

        Student xiaoming =Student.newBuilder().setId(1234).setName("小明").setEmail("flydean@163.com").addPhones(Student.PhoneNumber.newBuilder().setNumber("010-1234567").setType(Student.PhoneType.HOME)).build();

Student中提供了一些常用的方法,如isInitialized()检测是否所有必须的字段都设置完毕。toString()将对象转换成为字符串。使用它的Builder还可以调用clear()用来清除已设置的状态,mergeFrom(Message other)用来对对象进行合并。

序列化和反序列化

生成的对象中提供了序列化和反序列化方法,我们只需要在需要的时候对其进行调用即可:

  • byte[] toByteArray();: 序列化消息并返回一个包含其原始字节的字节数组。
  • static Person parseFrom(byte[] data);: 从给定的字节数组中解析一条消息。
  • void writeTo(OutputStream output);: 序列化消息并将其写入 OutputStream.
  • static Person parseFrom(InputStream input);: 从一个消息中读取并解析消息 InputStream.

通过使用上面的方法,可以很方便的将对象进行序列化和反序列化。

协议扩展

我们在定义好proto之后,假如后续还希望对其进行修改,那么我们希望新的协议对历史数据是兼容的。那么我们需要考虑下面几点:

  1. 不能更改现有字段的ID编号。
  2. 不能添加和删除任何必填字段。
  3. 可以 删除可选或重复的字段。
  4. 可以 添加新的可选字段或重复字段,但您必须使用新的ID编号。

总结

好了,protocol buf的基本用法就介绍到这里,下一篇文章我们会更加详细的介绍proto协议的具体内容,敬请期待。

本文的例子可以参考:learn-java-base-9-to-20

本文已收录于 http://www.flydean.com/01-protocolbuf-guide/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

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

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

看完99%的人都学会了!java多态简单例子_ser

认识HTTP 什么是超文本什么是传输什么是协议 HTTP相关组件 网络模型OSI 模型浏览器Web服务器CDNWAFWebServiceHTMLWeb页面构成 与 HTTP 有关的协议 TCP/IPDNSURI / URLHTTPS 详解 HTTP 报文 HTTP请求方法HTTP请求URLHTTP版本HTTP 请求响应过程HTTP 请求特征 HTTP 标头 通用…...

shell 的关联数组

shell 的关联数组 引言 shell也有Map的数据结构&#xff0c;哈哈哈&#xff0c;是挺高大上的。万能的shell。。。。 万恶的mac&#xff0c;sed和linux不一样&#xff0c;关联数组和linux也不要一样。要你干啥&#xff01;&#xff01;&#xff01; 一个需求的处理 感谢这个…...

Cookie对象的使用

Cookie对象是做什么的&#xff1f; 在我的理解里&#xff0c;Cookie是客户端用来和客户端保持通讯信息的一个对象。 怎样使用Cookie 使用一个对象&#xff0c;很显然我们要先创建他 Cookie cookie new Cookie(name, value); 然后用res对象将Cookie发送给客户端 res.addCookie…...

12013.ADC779x采集芯片

文章目录1 AD7997 特征2 管脚描述3 I2C地址确定3 内部寄存器结构3.1 内部结存器结构3.2 配置寄存器3.3 转换结果寄存器3.4 数据寄存器3.5 Hysteresis Register (CH1/CH2/CH3/CH4) 迟滞寄存器3.6 CYCLE TIMER REGISTER 循环计时寄存器3.7 SAMPLE DELAY AND BIT TRIAL DELAY 样本…...

实训项目-白金手册(个人信息管理系统)

实训项目-个人信息管理系统 文章目录实训项目-个人信息管理系统前言一、前期相关准备1、 编译软件安装2、 基本技术掌握2.1、 信息存储2.1.1、 临时存储2.1.2、 长期存储2.2、 查找排序2.3、 线性表操作2.4、 文件操作2.5、 代码书写规范二、需求分析三、难点疑点分析1、实现读…...

C++ ---仅仅翻转字符

仅仅翻转字符 题目描述&#xff1a; 给定一个字符串 S&#xff0c;返回 “反转后的” 字符串&#xff0c;其中不是字母的字符都保留在原地&#xff0c;而所有字母的位置发生反转。 题目来源&#xff1a;力扣 class Solution { public:bool IsLetter(char ch){if((ch >a&a…...

线性封闭区域2D刀路讲解

在学习UG教程的过程中往往要学习UG编程&#xff0c;想尽快速成&#xff0c;可以按照下面UG编程学习步骤&#xff1a; 步骤1、装上编程软件-UG&#xff0c;我们尽量装NX10.0版本&#xff0c;因为它是一个很稳定的一个版本&#xff0c; 步骤2、装上UG的最佳伙伴-优品外挂&#…...

TCP/IP网络协议以及Android网络优化方案

引用文章地址&#xff1a;TCP/IP网络协议 文章目录TCP/IPTCP/IP 模型TCP 和 UDPTCP怎么保证传输过程的可靠性&#xff1f;TCP 为什么要三次握手/四次挥手网页请求一个 URL 的流程DNS 工作原理HTTPS 加密原理移动端如何优化一个网络请求呢&#xff1f;DNS 优化CacheControlQ&…...

webSocket服务端与客户端消息通讯

一、WebSocket是HTML5出的东西&#xff08;协议&#xff09;&#xff0c;也就是说HTTP协议没有变化&#xff0c;或者说没关系&#xff0c;但HTTP是不支持持久连接的&#xff08;长连接&#xff0c;循环连接的不算&#xff09; 首先HTTP有1.1和1.0之说&#xff0c;也就是所谓的k…...

Vue 虚拟列表,纵享丝滑

转载文章&#xff1a;https://juejin.cn/post/6937939870018961439...

文华财经指标软件指标博易大师软件指标公式

CDJZ:ABS(MA(C,N3)-MA(C,120))/MA(C,120) < 0.5; 阶段卖出: 3.2,COLORLICYAN; 清仓卖出: 3.5,COLOR0088FF,DOTLINE; STICKLINE(动力线 > REF(动力线,1) ,动力线 ,REF(动力线,1),3 ,1),COLORRED; STICKLINE(动力线 <REF(动力线,1) ,动力线 ,REF(动力线,1),3 ,1),CO…...

redis数据结构

redis的使用 http://c.biancheng.net/view/4506.html 以下内容均来自该网站 http://c.biancheng.net/view/4540.html 1 字符串数据结构 上面是Redis字符串数据结构 哈希数据结构 一个key对应着一个hash结构&#xff0c;这个hash结构里面也是有很多键值对&#xff0c;key-va…...

简单的出入库管理软件一体化管理

关于库房管理软件&#xff0c;很多人都会问到这样的问题&#xff1a;有免费仓库出入库管理软件推荐吗&#xff1f;有没有简单上手&#xff0c;不收费的管理软件&#xff1f;找一款只需要看到库存的软件&#xff1f;等等&#xff0c;其实现在市面上很多出入库管理软件&#xff0…...

【Servlet】servlet中文显示问题

通过servlet类的doGet、doPost、service方法的HttpServletRequest request获取的参数中&#xff0c;如果有中文会出现乱码问题。 同样&#xff0c;通过HttpServletResponse response返回浏览器的html字符串中&#xff0c;也会出现中文乱码问题。 public class LoginServlet ex…...

2021年婴儿监护器行业最新趋势报告——附下载链接

来源 | 凯度&天猫 婴儿监护器在全球范围快速增长&#xff0c;目前北美市场仍占主导地位。但是中国婴儿监护器市场占有率增长迅速&#xff0c;预计到2021年&#xff0c;婴儿监护器市场全球市场中&#xff0c;中国份额将达9.09%。天猫上&#xff0c;婴儿监护器销售增长尤为迅…...

从零开始学习C语言之联合体(参考结构体类比着看)

还没想好怎么写&#xff0c;先鸽着&#xff0c;抽空补上...

进出境快件如何报关

&#xff08;一&#xff09;快件的报关  1.快件的报关和查验应当在运营人所在地海关办公时间和专门监管场所内进行。如需在海关办公时间以外或专门监管场所以外进行&#xff0c;需事先商得海关同意&#xff0c;并向海关无偿提供必需的办公场所及必备的设施。 2.进境的快件…...

深度学习常用数据集

常用数据集Iris数据集&#xff08;鸢尾花数据集&#xff09;MushRoom数据集&#xff08;蘑菇数据集&#xff09;Bostom Housing数据集&#xff08;波士顿房价数据集&#xff09;Linnerrud 数据集MINST数据集Caltech101数据集Caltech256数据集CIFAR-10数据集CIFAR-100数据集SVHN…...

HTTP-2做错了什么?刚刚辉煌2年就要被弃用了!?

最近一段时间以来&#xff0c;关于HTTP/3的新闻有很多&#xff0c;越来越多的国际大公司已经开始使用HTTP/3了。 所以&#xff0c;HTTP/3已经是箭在弦上了&#xff0c;全面使用只是个时间问题&#xff0c;那么&#xff0c;作为一线开发者&#xff0c;我们也是时候了解下到底什么…...

JVM篇-知识点梳理

导致OutOfMemoryError异常的常见原因&#xff1a; 1内存中加载的数据量过于庞大&#xff0c;如一次从数据库取出过多数据&#xff1b; 2集合类中有对对象的引用&#xff0c;使用完后未清空&#xff0c;使得JVM不能回收&#xff1b; 3代码中存在死循环或循环产生过多重复的对…...

Anime+Vue<svg画线动画>从安装到入门使用

1.安装Anime并全局使用 npm install animejs --saveimport anime from "animejs";2.在阿里巴巴矢量图标库复制&#xff08;或者下载&#xff09;svg到页面中,注意&#xff1a;画线动画svg图标stroke属性必须有颜色值。不然看到个毛线! <template> <div> …...

分享:关于 JVM 内存的 N 个问题和定位工具

JVM的内存区域是怎么划分的? JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;有些区域会抛出OOM异常,有些则不会,了解JVM的内存区域划分以及特征,是定位线上内存问题的基础。那么JVM内存区域是怎么划分的呢? 首先是程序计数器(Program Counter Re…...

以太坊基础入门

以太坊特点 • 以太坊是“世界计算机”&#xff0c;这代表它是一个开源的、全球分布的计算 基础设施 • 执行称为智能合约&#xff08;smart contract&#xff09;的程序 • 使用区块链来同步和存储系统状态以及名为以太币&#xff08;ether&#xff09;的加密 货币&#xff0…...

Centos8.0系统升级到最新版本

一 &#xff0c;Centos8.0更换国内源&#xff08;阿里源&#xff09; 1&#xff0c; 备份旧的配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2&#xff0c;进入cd /etc/yum.repos.d cd /etc/yum.repos.d3&#xff0c;下载新的 Ce…...

政产学研各界推动软件和信息技术服务业增速发展

​日前&#xff0c;工业和信息化部发布的最新数据显示&#xff0c;上半年&#xff0c;我国软件和信息技术服务业业务收入呈加快增长态势&#xff0c;完成软件业务收入44198亿元&#xff0c;同比增长23.2%&#xff0c;近两年复合增长率为14.7%。 从利润水平来看&#xff0c;上半…...

代理和负载均衡的详细说明是什么

对客户端提供的代理服务&#xff0c;在客户端无法直接访问服务端的情况下&#xff0c;星池StarPool通过配置代理服务器的方式访问服务端。在整个过程中&#xff0c;客户端请求首先发送到代理服务器&#xff0c;代理服务器再将请求发送到服务端后将结果返回给客户端。从服务端角…...

假期学习之HTML

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、HTML是什么&#xff1f; 二、HTML标签 1、<head></head>中标签介绍 2、<body></body>中标签介绍 3、语义化标签 4、列表标签…...

Unity学习笔记3-8.23-8.29

摄像机属性...

js面向对象 —— 继承

二、继承 ES6之前并没有给我们提供extends继承。我们可以通过 构造函数原型对象 模拟实现继承,被称为组合继承。 2.1 、call() 调用这个函数并且修改函数运行时的this指向 ● thisArg :当前调用函数this的指向对象 ● arg1 , arg2 :传递的其他参数 2.2、借用构造函数继承父…...

axios跨域问题

项目配置 vue-cli3vue2element-ui-2.15.3 在网上找了很多方案&#xff0c;但是都没有生效&#xff0c;最后是前端添加了一段代码&#xff0c;后台添加了一段代码 解决了 添加了headers的配置 const instance axios.create({// baseURL: http://mall.huolida.com/,// baseUR…...

解决STM32虚拟U盘枚举过慢的问题

1、最近在一个项目中使用STM32虚拟U盘功能&#xff0c;外接SPI flash,连接到电脑上面后虚拟出一个U盘出来&#xff0c;软件使用RT thread的usb device, mass storte大容量存储设备。代码移植很简单&#xff0c;使用menuconfig打开设置一下。 2、这个代码在测试过程中发现U盘枚举…...

【基础】Linux 进阶

Linux 进阶组管理与权限管理Linux 组管理查看文件所属用户与所属组创建、修改用户以及组Linux 文件权限管理查看文件权限rwx 权限说明chmod 修改权限chown 修改所有者chgrp 修改所有组定时任务调度crond 定时任务调度at 定时任务调度Linux 进程管理ps 命令查看系统正在进行的进…...

计算机培训类型选哪个好,计算机培训,我选择什么方向的好啊?

一、招生专业开设了计算机应用、应用电子技术、电脑工艺美术、电脑商业管理、电脑文秘等多个热门专业。二、学校简介广丰计算机学校创办于1998年&#xff0c;是经市、县教育主管部门批准(省教育厅备案)成立的一所全日制中等职业学校。它位于美丽的丰溪河畔&#xff0c;与详和的…...

svn彻底删除版本记录

https://blog.csdn.net/johnlaoxing/article/details/76000691 参考原文&#xff1a;http://blog.csdn.net/netwalk/article/details/14122419...

Mac IDEA彻底删除项目详解

删除项目 方法一&#xff1a; 1.打开需要删除的项目&#xff0c;点击如图所示标签。 2.选中文件进行删除⌦。 3.清空回收站。 方法二&#xff1a; 1.打开访达&#xff0c;找到文件所在地址。 2.删除所要删除的文件。 3.清空回收站。 所有方法的最后一步&#xff1a; 删除…...

删除SSMS的历史登录记录

早期版本的历史记录存储在SqlStudio.bin文件中&#xff0c;新的版本修改了存储位置&#xff0c;一般在 C:\Users\用户名\AppData\Roaming\Microsoft\SQL Server Management Studio\版本下面 文件中记录了管理器的界面等配置信息&#xff0c;也包含了历史连接记录&#xff0c;…...

Git彻底删除历史提交记录的方法

1、查看Git提交记录 # git log2、找到需要回滚到的提交点&#xff0c;复制它的hash值 # git reset --hard 你复制的hash值3、将当前指向的head推到git # git push --force...

Goland Mac版本彻底删除及清空记录

之前瞎折腾破解Goland注册码&#xff0c;之后Goland代码补全消失了&#xff0c;而且打开新项目软件空白没反应。删除软件重新安装也不行。经过下面的操作终于是恢复正常了。 下面是我的 GoLand2019.2 删除操作步骤&#xff0c;希望对你有用&#xff1a; 1、先把Goland删除&am…...

Github彻底删除历史提交记录的方法

有时候我们不小心会将本地敏感的信息提交到github上&#xff0c;即使删除后在历史记录中任然能够查看到&#xff0c;这让人很很不淡定&#xff0c;那有什么办法能够彻底的删除这些历史记录吗&#xff1f;方法总是有的&#xff0c;如下操作。 1.查看git提交历史记录 git log2.找…...

git彻底删除某个文件及其提交历史

Removing sensitive data from a repository https://help.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository git filter-branch --force --index-filter git rm --cached --ignore-unmatch *.tgz --prune-empty --tag-name-filte...

Mac删除彻底idea

Mac删除彻底idea1、 idea移除废纸篓2、命令删除残留文件夹&#xff08;macOS 12.3&#xff09;1、 idea移除废纸篓 2、命令删除残留文件夹&#xff08;macOS 12.3&#xff09; rm -rf /Users/xxx/Library/Preferences/jetbrains.jetprofile.asset.plistrm -rf /Users/xxx/Libr…...

LINUX彻底清除历史记录命令

&#xfeff;&#xfeff;目的很简单&#xff0c;就是清除linux下的历史命令 linux 下输入history 命令显示历史敲过的命令 输入history -c 清除掉了&#xff0c;但是系统重启&#xff0c;敲history发现又出现了&#xff0c;怎么办呢 用VI编辑器&#xff0c;编辑下profile文…...

如何彻底删除git上的内容

如何彻底删除git上的内容 当不小心把一些不需要的文件加入了项目&#xff08;例如node_modules这种体积特别大的文件夹、或者密码这类不适合放到github的文件&#xff09;。虽然我们可以后面把文件删除&#xff0c;然后再提交一次达到在项目中看不到的目的。但是仍然可以通过g…...

Github Git彻底删除历史提交记录的方法

Github Git彻底删除历史提交记录的方法 git reset --hard HEAD^ git push --force...

Git如何彻底删除文件或文件夹(包括历史记录)

Git如何彻底删除文件或文件夹(包括历史记录) 一 确定要删除的文件名或文件夹名 1.1 删除文件 git filter-branch --force --index-filter git rm --cached --ignore-unmatch pom.xml --prune-empty --tag-name-filter cat -- --all1.2 删除文件夹 git filter-branch --forc…...

macOS彻底删除idea

老版本&#xff1a; IntelliJIdea2018.3 新版本&#xff1a;JetBrains rm -rf /Users/liuyang/Library/Preferences/IntelliJIdea2018.3 rm -rf /Users/liuyang/Library/Caches/IntelliJIdea2018.3 rm -rf /Users/liuyang/Library/Application Support/IntelliJIdea2018.3 rm…...

.如何彻底删除oracle,彻底的删除本机的Oracle软件

卸载Oracle数据库并不像删除其他的软件一样那么简单&#xff0c;尤其是对于新员工而言&#xff0c;在删除了数据库重新安装的时候&#xff0c;经常会出现再次安装卸载Oracle数据库并不像删除其他的软件一样那么简单&#xff0c;尤其是对于新员工而言&#xff0c;在删除了数据库…...

从 git 的历史记录中彻底删除文件或文件夹

如果你对外开源的代码中出现了敏感信息&#xff08;例如你将私钥上传到了仓库中&#xff09;&#xff0c;你可能需要考虑将这个文件从 git 的历史记录中完全删除掉。 本文介绍如何从 git 的历史记录中彻底删除文件或文件夹。 第一步&#xff1a;修改本地历史记录 彻底删除文件…...

Git彻底删除历史记录中大文件

在使用Git时偶尔会有小伙伴提交一些错误的大文件到版本控制&#xff0c;等到发现用git rm 删除掉那个文件。但这样做是不够的&#xff0c;这些文件之后并没有真正在项目中被用到&#xff0c;与此同时这些大文件的存在会导致整个 git 仓库的容量暴增&#xff0c;影响每次 clone …...

彻底删除VMware !!!

关闭已经开启的虚拟机 移除已经创建的虚拟机 关闭VMware 打开应用和功能界面&#xff0c;搜索VMware&#xff0c;点击 “修改” 按钮 在弹出的对话框中点击 “删除” 按钮 去掉“产品配置”和“产品许可证”信息后&#xff0c;点击 “下一步” 点击 “完成” 按钮&#xff0c;完…...