背景
写论文时经常会对网络结构反复魔改比较实验结果,这个时候就需要对每一次修改的版本以及相关信息进行记录.最常用的方法就是使用git来记录每一次版本变动,这个时候如果有个小工具来帮忙简化一些操作就好了.正好最近在复习git操作,不过毕竟不是任何环境都能使用魔法在github上同步,不如直接就写个工具在本地用git记录一下历史.
大致目标:
- 工具体积应该足够小,且开销小
- 能提交每次改动,并有日志记录历史操作
- 能查看每次的提交信息
- 能切换不同历史版本
- 能将某一版本在本地复现,创建临时文件夹方便比较
那基于这些目标,我选择使用Rust的egui作为gui界面.它是一个immediate mode 的框架,也就是说需要每帧进行渲染,增大了cpu的压力.听起来不是很好,为什么选择它呢?我前端太菜,不想费精力写组件和界面所以排除掉了一些需要前后端交互的框架比如Tauri,然后对于其他一些框架比如iced虽然可能性能更好功能更强大,但是我放张图大家体会一下
对于一个官网给出文档居然全是TODO的框架,阁下又该如何面对?当然可以选择对着官方给出的example一点点模仿,但是我选择文档更全面并且更稳定的egui.
开始
其实从上面的目标出发,只需要将各种需求转换成git命令,再用Command
去实现就好.由于是个人记录实验信息,因此也不用开辟新分支直接全部在主分支上记录,整体的结构还是一个单链这就更加简化了代码逻辑.
至于一些git的基础命令,比如add
,commit
,reset
...这里就不过多介绍,有需要可以去看看相关的书籍或者博客.
关于日志的记录,这里我使用的是ftlog.不过貌似有点bug,这里暂时还没处理好(等着看看issue回复,不知道是我代码的逻辑问题还是本身库的bug).
因为大致的功能代码几乎类似,因此展示git add作为demo
scss
pub fn git_add(init_path:&String)->String{
let output=Command::new("git").arg("add").arg(".").current_dir(init_path).output();
return match output {
Ok(o) if o.status.success() => {
let res = String::from_utf8(o.stdout).unwrap() + &*String::from("git add success!");
info!("{}",format!("git add result:{}",res));
res
}
Ok(o) => {
info!("git add status {}",o.status);
o.status.to_string()
}
Err(err) => {
error!("git add error {}",err);
err.to_string()
}
};
}
其实后期可以将所有功能函数整合,通过传入的命令参数去匹配不同的操作,简化了代码结构也减少了很多冗余代码,不过作为最初版本还是怎么简单怎么来了.
测试
简单实现以后,我们来试着用一下这个小工具
创建了一个文件夹,使用工具选择该文件夹,之后会自动进行日志创建以及git init
等操作.为了避免提交不必要信息,所以我将log日志文件设置为ignore.
然后随便新建一个py文件并提交
这里如果没有填写commit信息是无法提交的,所以记得点击add之后填写好commit信息再点击commit提交.
完成提交之后,我们再添加一个文件,再次进行提交
点击git log查看一下提交的日志
然后如果想本地切换某个版本,可以在git change中输入对应的hash值
这个时候就变成了上一个版本的内容,如果想恢复到最新版本就查看一下reflog,同样输入之前的hash值进行change切换
这样就恢复了目前最新的版本,如果还想找到某个版本直接在本地复现方便我们进行某些代码的复制粘贴,就可以点击compare输入某个版本的hash,这个时候就会在文件夹中生成一个tmp文件夹,里面就是选择的历史版本
最后
貌似基本的功能都已经实现了,但是这个版本还是不满意.对于这个工具还有很多的地方需要改进:
- 整合一些分散的功能(add和commit合并);
- 将功能键改名毕竟目标是即使不了解git的人也能轻松上手;
- 将change和compare改为滑动选择,就不用每次去点击log查看hash还要再进行输入操作;
- 添加一些功能,比如删除某一个HEAD只保留需要的版本;
- 虽然每次compare不会影响最新版本,但是还是可以添加一个删除tmp文件夹的操作.
一开始想过可以利用tag来作为标志,不过在开发的时候还是选择依靠hash值来操作减少一些潜在的错误.等准备完面试有空闲的时候会慢慢把功能优化,更易于大家上手.