version-control: node下的版本管理模块(svn & git)

本文介绍了作者在开发一个构建工具时,为实现对svn和git的兼容,创建了version-control模块。文章详细讨论了模块的设计思路,包括如何通过执行命令行操作版本、抽象接口以兼容不同版本控制系统,以及在实现过程中遇到的中文显示、版本不一致、文件添加效率低下和log更新延迟等问题及其解决方案。同时,文章列出了未来计划改进的方向。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在开发一个构建工具,需要操作版本管理系统,实现代码提交(如:svn add, svn commit…),GitHub上有类似的库,但存在两个问题:

  1. 长久没人维护,使用人数较少;
  2. 只支持git或svn;

基于我需要兼容git和svn,于是自己简单实现一个版本管理模块:version-control,下面将简单记录一下设计中的一些考虑和遇到的一些问题。

由于开发时间有限和本人使用场景较为简单,若你想使用version-control,请先自行评估是否能满足你的需求,当然作为开源项目,欢迎提issue,发PR。

目录

  1. 【思路】node下的版本管理模块实现;
  2. 【思路】 如何优雅兼容svn和git操作;
  3. 【问题】中文显示的问题;
  4. 【问题】svn本地版本和线上服务器版本不一致问题;
  5. 【问题】svn 如何add所有文件;
  6. 【问题】svn log没有显示刚刚commit的信息;
  7. 【TODO】

一、node下的版本管理模块实现思路

回想我们在没有GUI版本管理工具的时候是怎么进行版本操作的:敲命令行,于是自然想到实现思路:基于node执行指定命令行来实现版本操作

这里要注意的是,Windows下在命令行中不一定有git或者svn的执行环境,需要安装额外的安装包,由于Mac OS暂时没有这个问题,所以我还没有做处理。

// node执行命令
const child_process = require('child_process');

module.exports = (command, cwd) => new Promise((resolve, reject) => {
   
  child_process.exec(command, {
    cwd }, (err, stdout) => {
   
    if (err) reject(err);
    else resolve(stdout);
  });
});

二、如何优雅兼容svn和git操作

凡是说到兼容,我就会想到抽象,站在用户的角度,要完成的任务是版本管理,并不太在意具体用哪些命令。于是我从svn和git操作中跳脱出来,只关心用户需要,针对用户需要,梳理出以下几个接口:

  1. 查看当前文件修改状态:VersionControl.status
  2. 更新代码:VersionControl.update
  3. 提交代码:VersionControl.commit
  4. 版本回退:VersionControl.revert

确定了抽象接口之后,我采用动态引入的方式兼容svn和git,并在架构上进行作用域隔离,单独维护svn操作逻辑和git操作逻辑:

VersionControl在实例化的时候判断用户需要svn还是git,根据用户需要引入底层实现,最后在对外接口中调用具体的底层实现来实现svn和git兼容。

/**
 * VersionControl
 * 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值