最近在学OpenGL,有时候需要看不同系统渲染结果是否一致。而且我喜欢用vim来敲代码,用原生的总比插件好。

用CMake来构建项目,可以在Visual Studio 和在linux中编辑同一个项目,方便地编译运行查看结果。

但是每次代码更改后都要点一下ftp工具来同步两台电脑,有点麻烦。WinSCP可实现本地实时同步到远程,但是反过来虽然有扩展可以实现,却不能实时,和排除目录。

本文前提条件是能够在win端使用WinSCP连接到linux。只在局域网内测试过。

1 下载安装WinSCP

在win10中安装WinSCP,这是一个免费的ftp、sftp的客户端软件。与某基金会没有关系

官网下载:

https://winscp.net/eng/download.php

安装时可以选择添加到环境变量,方便命令行调用。

2 使用WinSCP同步目录

2.1 新建会话,连接到linux

打开WinSCP,在登录窗口中输入你要同步的主机名(或ip)、端口号、用户名。

在这里插入图片描述

2.2 浏览目录,同步一次

浏览远程项目目录,记下地址

在这里插入图片描述

点击同步,输入本地项目目录

点击确认即可同步
在这里插入图片描述

2.3 使用文件掩码排除目录

点传输设置-文件掩码-编辑
在这里插入图片描述
在这里插入图片描述

写要排除的文件或目录,比如.开头的目录、build目录等,记录下掩码。这个就像.gitignore,可以选择不同步编译的目录。以后想排除什么目录,在这个界面配好,让他给你生成就行了。

掩码是类似这样的:

| .*/; build/; vs-build/

2.4 命令行同步目录

脚本需要在命令行中启动一个会话,也就是登录到远程。不过代码WinSCP已经帮你生成好了。

点击会话-生成会话URL/代码

脚本-格式选择脚本文件,复制所示代码
image-20220330032135476

打开命令行,输入WinSCP安装路径\WinSCP.com,如果设置了环境变量,则可直接输winscp.com

将复制的代码粘贴过来,打开会话,即可进入远程目录

image-20220330032413093

建议先备份项目。

输入同步命令如下,将掩码和目录补上

synchronize both 本地目录 远程目录 -filemask="掩码"

例如

synchronize both J:\code\gl\test1 /home/pde/code/gl/test1 -filemask="| .*/; build/; vs-build/"

看看同步效果合不合预期,如果不合,检查代码,也可看官网文档

https://winscp.net/eng/docs/scriptcommand_synchronize

3 编写脚本,自动同步

WinSCP同样帮你生成了批处理代码,不过需要改一下。

点击会话-生成会话URL/代码
image-20220330025616245

点击脚本-格式为批处理文件,复制所示代码

image-20220330031748134

新建批处理文件,粘贴代码,将“你的命令”替换成刚才那行同步命令,注意要将嵌套引号"写成两个""。写个循环,隔几秒执行一次

我的脚本如下

sync.bat

:s

"J:\WinSCP\WinSCP.com" ^
  /log=".cache/WinSCP.log" /ini=nul ^
  /command ^
    "open sftp://root:password@192.168.1.3/ -hostkey=""ssh-ed25519 255 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=""" ^
    "synchronize both J:\code\gl\test1 /home/pde/code/gl/test1 -filemask=""| .*/; build/; vs-build/"" " ^
    "exit"

timeout 3
goto s

其中timeout 3表示3秒执行一次,命令行中执行脚本就会给你3秒同步一次,要停止就按Ctrl+C。

这个脚本可以方便地修改目录和掩码,同步其他目录。

效果如下
在这里插入图片描述

3 其他

不足之处

此脚本的缺点:不能删除文件,你删了一边他又给你从另一边同步回来了,得停止脚本,然后两边都删了才行,希望有大佬帮忙解决下。而且每次同步都打开一个会话,可能会造成资源浪费,应该在同一个会话中不断同步,看官网发现应该能用.NET实现,不过我不会。

vim设置自动读取

如果你使用vim的话,得在.vimrc中加上自动保存、自动读取

set autowriteall
set autoread
augroup AutoRW_Insert
    au!
    au insertenter,insertchange,insertleave * silent execute '!checktime'
augroup END

才能方便地同步,不过是切换编辑时同步

4 类似软件

  • rsync

  • FreeFileSync

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐