Vim 版本升级(Vim8)

安装步骤

第一步,下载源码

到Vim官方Github仓库下载目前最新的Vim Release版本

wget https://codeload.github.com/vim/vim/tar.gz/v8.2.1258

第二步,解压

$ mv v8.2.1258  vim-v8.2.1258.tar.gz
$ tar -xvzf vim-v8.2.1258.tar.gz

第三步,编译安装

$ cd vim-8.2.1258/
$ ./configure --prefix=$HOME/.local --enable-python3interp=yes && make && make install
  • 这里注意一下我们需要用configure配置一下安装的路径,将Vim8安装到自己账户的目录下,避免干扰到系统上的其他用户
  • --enable-python3interp=yes 添加 python3 支持

在这里可能会遇到 no terminal library found 错误:

no terminal library found
checking for tgetent()… configure: error: NOT FOUND!
      You need to install a terminal library; for example ncurses.
      Or specify the name of the library with –with-tlib.

解决方法:

# Ubuntu下解决方法:
$ sudo apt install libncurses5-dev

# CentOS 下
$ yum install ncurses-devel.x86_64

# 完成后重新进行这一步,建议删除

第四步,链接

利用alias将vim指令定向到刚刚安装的vim8,同时修改.bashrc确保之后一直能生效

alias vim='~/.local/bin/vim'
echo "alias vim='~/.local/bin/vim'" >> ~/.bashrc

第五步,检查

vim --version

参考文献

Windows 开机自启VMware虚拟机

由于进行Linux下软件开发,需要频繁使用 VMware 虚拟机,为提高效率找到一种开机启动启动 VMware 虚拟机的方法,可以大大提升效率。

第一步,编写脚本

首先编写 自启 脚本 vm_start.bat ,内容如下:

"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" start "E:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位.vmx" nogui

其中前面部分替换为自己 VMware 安装目录下的 vmrun.exe 文件所在路径,后部分替换为自己虚拟机的 *.vmx 文件路径。不要丢掉了双引号。

如果像我一样路径里面包含中文,记得将编码转化为 ANSI 编码即可正常使用,否则运行会乱码。

https://imagehost-cdn.frytea.com/20200722085533.png

如果需要关机自动关闭脚本 vm_stop.bat ,内容如下:

"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" stop "E:\Virtual Machines\CentOS 7 64 位\CentOS 7 64 位.vmx" soft

第二步,加入启动策略

这里有两种方法:

  • 将脚本加入开机启动策略
  • 将脚本拷入 启动 文件夹

首先第一种,运行 gpedit.msc > 用户配置 > windows设置 > 脚本(登录/注销) > 添加

第二种比较简单,将脚本拷入启动文件夹:

`X:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp(注:X为Win10系统盘盘符)`

比如,我的启动文件夹就是 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

第三步,enjoy it!

参考文献

VIM 创建程序文件自动添加头部注释

修改 /etc/vimrc ,在文件最后添加以下内容:

" 当新建 .h .c .hpp .cpp .mk .sh等文件时自动调用SetTitle 函数
autocmd BufNewFile *.[ch],*.hpp,*.cpp,Makefile,*.mk,*.sh exec ":call SetTitle()"
" 加入注释 
func SetComment()
        call setline(1,"/*================================================================")
        call append(line("."),   "*   Copyright (C) ".strftime("%Y")." IEucd Inc. All rights reserved.")
        call append(line(".")+1, "*   ")
        call append(line(".")+2, "*   文件名称:".expand("%:t"))
        call append(line(".")+3, "*   创 建 者:SongTL, songtianlun@comleader.com.cn")
        call append(line(".")+4, "*   创建日期:".strftime("%Y年%m月%d日"))
        call append(line(".")+5, "*   描    述:")
        call append(line(".")+6, "*")
        call append(line(".")+7, "================================================================*/")
        call append(line(".")+8, "")
        call append(line(".")+9, "")
endfunc
" 加入shell,Makefile注释
func SetComment_sh()
        call setline(3, "#================================================================")
        call setline(4, "#   Copyright (C) ".strftime("%Y")." IEucd Inc. All rights reserved.")
        call setline(5, "#   ")
        call setline(6, "#   文件名称:".expand("%:t"))
        call setline(7, "#   创 建 者:SongTL, songtianlun@comleader.com.cn")
        call setline(8, "#   创建日期:".strftime("%Y年%m月%d日"))
        call setline(9, "#   描    述:")
        call setline(10, "#")
        call setline(11, "#================================================================")
        call setline(12, "")
        call setline(13, "")
endfunc
" 定义函数SetTitle,自动插入文件头 
func SetTitle()
        if &filetype == 'make'
                call setline(1,"")
                call setline(2,"")
                call SetComment_sh()

        elseif &filetype == 'sh'
                call setline(1,"#!/system/bin/sh")
                call setline(2,"")
                call SetComment_sh()

        else
             call SetComment()
             if expand("%:e") == 'hpp'
                  call append(line(".")+10, "#ifndef _".toupper(expand("%:t:r"))."_H")
                  call append(line(".")+11, "#define _".toupper(expand("%:t:r"))."_H")
                  call append(line(".")+12, "#ifdef __cplusplus")
                  call append(line(".")+13, "extern \"C\"")
                  call append(line(".")+14, "{")
                  call append(line(".")+15, "#endif")
                  call append(line(".")+16, "")
                  call append(line(".")+17, "#ifdef __cplusplus")
                  call append(line(".")+18, "}")
                  call append(line(".")+19, "#endif")
                  call append(line(".")+20, "#endif //".toupper(expand("%:t:r"))."_H")

             elseif expand("%:e") == 'h'
                call append(line(".")+10, "#pragma once")
             elseif &filetype == 'c'
                call append(line(".")+10,"#include \"".expand("%:t:r").".h\"")
             elseif &filetype == 'cpp'
                call append(line(".")+10, "#include \"".expand("%:t:r").".h\"")
             endif
        endif
endfun

使用效果:

https://imagehost-cdn.frytea.com/20200720192515.png

参考文献

【简记】Linux 计划任务 Crontab

cron 简介

cron 是 UNIX, SOLARIS,LINUX 下的一个十分有用的工具。通过 cron 脚本能使计划任务定期地在系统后台自动运行。

cron 命令

crontab -e  – 编辑该用户的 crontab,当指定 crontab 不存在时新建。 crontab -l – 列出该用户的 crontab。 crontab -r – 删除该用户的 crontab。 crontab -u<用户名称> – 指定要设定 crontab 的用户名称。

重启命令:

/etc/init.d/crond restart // 以路径方式重启
service crond restart // 以服务的方式重启

Linux Crontab 格式

Crontab 字段与允许的值 (Linux Crontab)

cron 实例

1、特定时间执行

cron 的基本用法是在特定的时间执行一项任务,如下是 6 月 10 上午 8:30 执行 Full backup shell script。 要注意的是时间字段采用的是 24 小时制,如果是下午 8 点,则改写为 20 点

30 08 10 06 * /home/ramesh/full-backup

30 – 第 30 分钟 08 – 早上 8 点 10 – 10 号 06 – 第 6 个月 (6 月) * – 一周的任何一天

2、 安排多个实例(比如一天执行两次)

下面的增量备份脚本每天执行两次。

每天于 11:00, 16:00 执行,逗号两侧的时间都会执行。

00 11,16 * * * /home/ramesh/bin/incremental-backup 00 – 第 0 分钟 (每小时开时) 11,16 – 早上 11 点与下午 4 点  – 每天  – 每个月 * – 一周的任何一天

3、让任务只在特定时间执行(比如仅当工作日时执行)

下面这个例子是每天 9:00-16:00 检查数据库状态(包括周六)

00 09-18 * * * /home/ramesh/bin/check-db-status 00 – 第 0 分钟 (每小时开时) 09-18 – 9 点, 10 点, 11 点, 12 点, 下午 1 点, 下午 2 点, 下午 3 点, 下午 4 点, 下午 5 点, 下午 6 点  – 每天  – 每个月 * – 一周的任何一天 如果只想工作日执行此操作

00 09-18 * * 1-5 /home/ramesh/bin/check-db-status 00 – 第 0 分钟 (每小时开时) 09-18 – 9 点, 10 点, 11 点, 12 点, 下午 1 点, 下午 2 点, 下午 3 点, 下午 4 点, 下午 5 点, 下午 6 点  – 每天  – 每个月 1-5 – 周一, 周二, 周三, 周四和周五 (工作日)

4、 安排每分钟都执行定时任务

理论情况下,没有每分钟都要执行的 shell,但下面这个例子,让我们更好的了解 crontab

* * * * * 命令
  • * 代表着所有可能取到的值,除了直接用 * 外,下面的几个例子也较为常用
  • 当指定 */5 在分钟字段,代表每五分钟。
  • 当指定 0-10/2 在分钟字段,代表在前十分钟的每两分钟

上面的例子对于其它四个字段同样试用

5、安排后台每十分钟执行定时任务

*/10 * * * * /home/ramesh/check-disk-space

有一些特殊的例子,可以用关键字替代上述五个字段 – reboot, midnight, yearly, hourly

Table: Cron special keywords and its meaning

6、每一年的第一分钟执行定时任务(@yearly)

下面的例子将在每一年的 1 月 1 日 0:00 执行

@yearly /home/ramesh/red-hat/bin/annual-maintenance

7、每月执行定时任务(@mothly)

下面的例子将在每月 1 日 0:00 执行

@monthly /home/ramesh/suse/bin/tape-backup

8、每天执行定时任务(@daily)

下面的例子将在每天 0:00 执行

@daily /home/ramesh/arch-linux/bin/cleanup-logs "day started"

9、每次重启时执行定时任务(@reboot)

@reboot CMD

10、如何用 mail 关键字禁止/重定向 cron 的邮件

默认情况下,crontab 将向布置定时任务的管理员发送邮件,如果想重定向此用户,添加并更新 MAIL

ramesh@dev-db$ crontab -l
MAIL="ramesh"

@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space

如果不想任何人接收,则直接将 MAIL 置空

11、如何系秒每执行一个定时任务

无法安排每秒执行,因为最小处理单元是分钟,另一方面,没有什么理由让我们每秒都执行一任务

12、cron 中的 PATH 变量

上面的例子都是用绝对的路径

如果你想用相对的路径,设置环境变量可以在 crontab 增加

ramesh@dev-db$ crontab -l

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/home/ramesh

@yearly annual-maintenance
*/10 * * * * check-disk-space

13、从 cron 文件中定义 cron 任务

除了直接编辑外,你也可以先在一个文件中编辑好任务,再导入

ramesh@dev-db$ crontab -l
no crontab for ramesh

$ cat cron-file.txt
@yearly /home/ramesh/annual-maintenance
*/10 * * * * /home/ramesh/check-disk-space

ramesh@dev-db$ crontab cron-file.txt

ramesh@dev-db$ crontab -l
@yearly /home/ramesh/annual-maintenance

*/10 * * * * /home/ramesh/check-disk-space

应用时要注意,此操作会删除原有的cron任务

14、查看所有用户 cron 任务

$ cat /etc/passwd | cut -f 1 -d : |xargs -I {} crontab -l -u {}
30 08 10 06 * sar 1 10 > /root/sysstat/data.txt
30 6 */10 * * ls
no crontab for bin
no crontab for daemon
no crontab for adm
no crontab for lp
no crontab for sync
no crontab for shutdown
no crontab for halt
no crontab for mail
no crontab for operator
no crontab for games
no crontab for ftp
no crontab for nobody
no crontab for systemd-network
no crontab for dbus
no crontab for polkitd
no crontab for sshd
no crontab for postfix
no crontab for chrony
no crontab for ntp
no crontab for tcpdump
no crontab for nscd

参考文献

VS Code 免密登录Linux服务器

使用 VS Code 中提供的 Remote Development 可以实现连接远程服务器,管理文件、远程调试、远程管理等功能,实现远程开发。今天主要介绍如何通过配置SSH公钥实现 VC Code 免密登录 Linux 服务器。

前提条件

  • 安装 VS Code
  • 安装了 Remote Development 插件

部署步骤

第一步,服务器端部署公钥

参考:Linux部署私钥实现免密登录

第二步,找到 VS Code 配置文件

https://imagehost-cdn.frytea.com/20200720093404.png

第三步,修改 VS Code 配置文件

Host Ali-Dev-Test
  HostName *.*.*.*
  User root
  IdentityFile "H:\我的云端硬盘\Security\ssh-key\aliyun-frytea-edu-t5.pem"

按照上面的格式,指定主机名称、地址、用户以及密钥路径。

第四步,Enjoy it!

参考文献

Linux部署私钥实现免密登录

第一步,生成密钥对(windows或linux均可):

ssh-keygen

之后一路回车,默认不设密码,默认目录为 ~/.ssh

第二步,部署公钥至服务器端(Linux),并赋权限

cat id_rsa.pub >> authorized_keys
sudo chmod 600 authorized_keys
sudo chmod 700 ~/.ssh
  • 将 id_rsa.pub 替换为你的公钥路径即可,如果是在本地生成需上传至服务器端。
  • 这项操作可以部署多个公钥,命令会在 authorized_keys 后面追加,而 Linux 公钥验证检测 authorized_keys 文件中的公钥
  • 一个萝卜一个坑,一个公钥只运行一个用户使用登录

第三步,检查密钥登陆功能是否开启

1、打开SSH配置文件

sudo vim /etc/ssh/sshd_config

2、查看确认下面两项配置

RSAAuthentication yes
PubkeyAuthentication yes
  • 当你完成全部设置,并以密钥方式登录成功后,再禁用密码登录(可选)
PasswordAuthentication no

3、重启SSH

sudo service sshd restart

第四步,检查本地私钥部署

如果客户端为windows,您的私钥应存在于 C:\Users\your name\.ssh\ 目录下,或是在登陆时指定私钥地址:

$ ssh -i id_rsa remote-username@remote-ip

如果是使用 VS Code 远程连接则需要在配置中指定私钥地址:

Host Ali-Dev-Test
  HostName *.*.*.*
  User root
  IdentityFile "H:\我的云端硬盘\Security\ssh-key\aliyun-frytea-edu-t5.pem"

第五步,enjoy it!

参考文献

《断舍离》十句感触

作者: 山下英子 出版社: 广西科学技术出版社 原作名: 新・片づけ術「断捨離」 译者: 吴倩 出版年: 2013-7-30 页数: 192 定价: CNY 32.00 装帧: 平装 丛书: 山下英子 断舍离 ISBN: 9787807639817

阅读完《断舍离》,脑中产生19个想法,对于我这样一个涉事未深之人确也产生了一些影响,至少在当下的生活中,已经在践行着这一切,做到了在“入”口践行“断舍离”,一件物品如果三次遇见都有强烈的需求感,且在日常生活中产生多次需求感,就可以“入”。而一件物品,如果长时间搁置,就必须要考虑“出”。福尔摩斯说,人的头脑就像一个阁楼,里面堆放着物品,如果阁楼里堆满了不需要的杂物,那寻找有用物品就会很困难,因此他会“定时清理”(《爱情公寓》中的吕子乔貌似也有同样的本领?)。

https://imagehost-cdn.frytea.com/20200719170005.png

人的居住空间不也是如此,如果被无用的东西堆满,而且还天天都要看着,心情不会好,反之影响的就是工作学习效率和生活质量。如此,在【断舍离的奥义不只是“扔东西”】一章中,作者写下这样一句话:

斩“断”物欲 “舍”弃废物 脱“离”执念

何谓之断舍离,这句话从意义层面扩充了每一个字的含义,这就是断舍离。斩欲望,舍废物,脱执念。其实许多时候的欲望,只是脑中产生的化学反应,静下来思考思考,其实没有这么需要。

https://imagehost-cdn.frytea.com/20200719165839.png

正是这样的欲望被不断满足,生活中出现了许许多多的废物,而后就会很容易产生执念。其实断舍离更注重空间上的。在【◆ 断舍离注重的不是物品,而是空间】一章中,作者写下这句话:

为确保空间的干净整洁,而将物品量尽可能地缩减成最适合的量。

时常在想,我真的需要这么多的物品吗?其实仔细看看,生活中使用率很高的物品,也许只有20%,其实断舍离的目的,更多的是为了整体的感受。如果物品的量超多一个较为舒适的量,就会严重影响人们的情绪,作者在【◆ 家里家外·情绪反差的痛苦】一章中,写下这样一句话:

扔掉不需要的杂物,建立舒适的生活空间,才有可能改变人生

时常谈及“人生”也许不那么好,但想想可能这人生就是每一天去积累起来的。时常做出的努力,常常也是为了改变人生。人生呀,是多有意思的一件事情呢。正如作者在【◆ 人有“获得的自由”,也有“放手的自由”】一章中写道:

那时候起我明白了一个道理:想要的东西得不到,人会难过。但是想扔的东西扔不得,会更痛苦。

有时为了求之不得而痛苦,又有人为了舍而不弃感到痛苦。这件事情在爱情和婚姻之上时常出现。感情的世界微妙而复杂,五十多岁的老大叔谈及爱情也不得不承认“缘分”的奇妙。随着人类寿命的延长,在择偶这件事情上需越发慎重,试想如果你要跟身边的这个人共同度过60年甚至更久的时间,你还会和ta在一起吗。

https://imagehost-cdn.frytea.com/20200719170250.png

说回本书,断舍离究竟如何去实践呢,在【◆ 断舍离,就是扔东西】一章中,作者总结了思维上的和物品上的断舍离,一种是精神层面,一种是物理层面。最后给出几种收纳的方法。方法具体是如何描述,可以去书里寻找答案。

观念上的断舍离 1. 认识现状 2. 停止自我否定 3. 描绘家的具体构想 杂物上的断舍离 1.拿出杂物,俯瞰 2.扔掉“怎么看都是垃圾·废品”的东西 3.以自我·时间为判断基准,考虑自身与物品的“关联度”,再进行取舍 4.以“必要·合适·愉快”为标准进行取舍5.收纳在杂物最适化之后进行 收纳指南 1.“三分法” 2.“7·5·1法” 3.“1 out 1 in法” 4.“one touch法” 5.“自立·自由·自在法”

章节的名字虽然是“断舍离就是扔东西”,但在我看完全书的感受,作者想表达的,其实并不仅仅是“扔东西”这么简单,正如作者在本章还写下了“打扫”的程序:

最正确的“打扫”程序是首先清除那些垃圾、废品,以及不需要·不合适·不愉快的杂物,之后再转而进行杂物收纳,进行“清扫·擦拭·磨刷”。

不难看出,打扫、清除、收纳的前提都是以自身感受为基础的,换言之其实“断舍离”的目的并不仅仅是扔东西让周遭环境更加干净整洁,更重要的是让自己感觉更好,精神世界感受到舒畅,从而改变人生。

https://imagehost-cdn.frytea.com/20200719170339.png

“断舍离”对人生的重塑作用,在【◆ “身体、心灵、生命”机制的回归】一章中有所描述:

断舍离最核心的思想就是“新陈代谢”。我们的居住空间处于代谢(交换)的状态是最理想的,因此,不断地进行“使用所有物,清除无用之物”的循环,才能让居所充满流动感和活力。

人的一天就是在不断“新陈代谢”,正如人们总是“喜新厌旧”。比如就算上等的小龙虾,天天吃也容易不适一样,人们需要一些“新鲜感”,而这“新鲜感”就是在不断地“新旧更替”中不断刷新。

https://imagehost-cdn.frytea.com/20200719170200.png

说了这么多,其实断舍离最根本的目的还是在于帮助一些人重塑人生,在【◆ 遵守三大原则,收获怡然人生】一章中写道:

● 活在当下 ● 结果反馈到自身 ● 给予

作者梳理出可以帮助人们收获更好人生的三大原则,其实在我看来也是一个“从心出发”的过程。有时候我太过为他人着想,反而丢失了本心。其实一切“给予”的前提,都是要从自身出发,先找到自己,活在当下,之后自然而然会有些改变,当我内心变得强大,再去给予。强大的人时常给予,脆弱的人总想拥有。

https://imagehost-cdn.frytea.com/20200719170426.png

断舍离,还有其他妙处,作者在【◆ 断舍离,让人生处处自在怡然】一章中提到了几种婚姻:

● 精神性的结婚 ● 动物性的结婚 ● 社会性的结婚

光看字面,就能窥见一二,精神性婚姻,即使没有结婚证,二人已是“灵魂伴侣”,动物性结婚为了满足繁衍需求,而社会性需求,为了获取社会地位而结婚。当前时代,更多的属于哪一种呢?希望未来的婚姻更多的都是第一种。为爱情而结婚,其实婚姻也许不久,查查历史会发现婚姻的认定方式都有过几次重大的更替,唯爱可以永存。

https://imagehost-cdn.frytea.com/20200719170454.png

最后说到死亡:

癌症,从某种意义上来说是幸福的死亡方式。并不是像心脏病或脑中风这种突然死亡的病症。在死亡来临之前,还有力气来做想做的事情。还能在死亡来临之前,全身心地用力生活。

癌症,不同的类型存活率也不同,世界上也有一种癌症是可以预防的。以胆囊癌为例,胆囊癌的5年生存率不到5%。提起癌症,总令人感觉那么远,又那么近。远到触不可及,近到近在眼前。但比起其他中致死率极高的病症,也许还是幸福的吧。

这一点我与作者观点不一,虽说还有力气可以做事情,但等待死亡的滋味总是不好受的。我想如果有一天自己面对死亡,我会选择坦然面对,独自离开,不惊扰任何人。

https://imagehost-cdn.frytea.com/20200719170625.png

结语:《断舍离》这本书据说在很多国家都卖的很火,作者八年如一日在各地宣传此书。读完之后收益颇多。也许只有读书才是令人增长智慧的直接途径,也是调整生活基调的最佳方式。更多的答案还是去书中寻找,以书为友,愿与您交流更多。

解决git不小心提交大文件导致无法提交问题

在一次不小心向GitHub提交了一个1GB文件后,出现一个令人崩溃的错误:

remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: a22b6b202ddb6da3e2795ca71663de19
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File system_status/test_26457 is 1024.00 MB; this exceeds GitHub's file size limit of 100.00 MB

更崩溃的是,在此之后又进行了几次提交,可不能因为这次手误丢掉几次提交成果呀。
在网上浏览一圈后找到解决方法:

git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch system_status/test_26457'

大概原理是,删除大文件,重新生成commit,但运行后又出现问题:

Cannot rewrite branches: You have unstaged changes.

之后找到一种较为暴力的解决方法:

git stash

在网上找到关于这段命令(git 储藏)的使用场景:

  • 发现有一个类是多余的,想删掉它又担心以后需要查看它的代码,想保存它但又不想增加一个脏的提交。这时就可以考虑git stash。
  • 使用git的时候,我们往往使用分支(branch)解决任务切换问题,例如,我们往往会建一个自己的分支去修改和调试代码, 如果别人或者自己发现原有的分支上有个不得不修改的bug,我们往往会把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录。其实如果我们不想提交完成一半或者不完善的代码,但是却不得不去修改一个紧急Bug,那么使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修Bug,等到修完Bug,提交到服务器上后,再使用git stash apply将以前一半的工作应用回来。
  • 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。解决这个问题的办法就是git stash命令。储藏(stash)可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

解决后,再次修复,重新提交,完成!

$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch system_status/test_26457'
Rewrite 11983344a8934d6e9a7a1e225e6d0f6daf3923a4 (15/21)rm 'system_status/test_26457'
Rewrite 49ac22cd47b0504350d3643ff77b09b14f01ed03 (16/21)rm 'system_status/test_26457'
Rewrite 8a721565399d929514e3ed4661ea7c938074eb32 (17/21)rm 'system_status/test_26457'
Rewrite 6e9e291690bdd9923daef62a18d08229dc30a320 (21/21)
Ref 'refs/heads/master' was rewritten
$ git push

参考文献