Featured image of post 巧妙例用Git定时任务

巧妙例用Git定时任务

使用 Git+crontab 实现自动化版本管理与备份

背景

往往有些资料对我们来说很重要,既想备份它,又想保留不同的历史版本,以便不时之需。比如我现在写作的文档,一方面怕原始文件丢失,丢了以后我怎么修改,难道把它从博客、头条号上扒下来再编辑一次;另一方面又怕搞乱了,乱了之后原始插图就乱了,还得编辑。

既然需求有了,那就需要解决办法。在这之前,我尝试了不同的办法:

  1. 直接使用git,在本地或网页上编辑。这种办法很直接,但也很弱鸡。而且由于缺少写作软件的参与,在写作上非常难受,贴图也无法实现;
  2. 使用wiki.jsWordpress。我相信不少人采用这种方式,这样版本管理有了,数据库也可以直接备份。但是网页工具毕竟是网页工具,其功能性与桌面写作软件还是无法相比的。比如图片插入,只能先上传再插入,无法直接贴图,蛋疼得很。
  3. 再就是使用桌面版写作软件,但是这些一般都没有版本管理,备份也只能靠自己手动完成。

接下来我们看看怎样使用git+crontab来实现自动化的版本管理与备份

Gitea

这一节不是必要的,可以使用本地或远程文件夹来代替git仓库。

如果你想使用GithubGitee来管理自己的资料库,也可以直接跳过这一节。

使用git来实现版本管理,我们需要一个git仓库,选择Gitea是因为它足够小巧精悍,提供的 web 端操作习惯与Github相似,没什么学习成本。

这里,我们选择使用Docker来部署Gitea

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: "3"

services:
  server:
    image: gitea/gitea:1.20.5
    container_name: gitea
    network_mode: bridge
    hostname: gitea
    restart: always
    environment:
      - USER=git
      - USER_UID=1026
      - USER_GID=100
    volumes:
      - .:/data:rw
      - /volume2/repositories:/data/git
    ports:
      - "3000:3000"
      - "9922:22"

这里需要特别提醒的是,默认一般只挂载/data,但是我们建议单独挂载/data/git,将数据与配置分离开(保持好习惯),以防万一。因为我们在配置Gitea的时候需要直接进入/data修改app.ini等文件,这给了我们犯错的机会,将数据与配置分开,可有效防止出错。

至于app.ini,这里就列出一些重要、让人容易迷糊的部分:

1
2
3
4
5
6
7
DOMAIN = git.example.com                  
HTTP_PORT = 3000
ROOT_URL = https://git.example.com:8443/
DISABLE_SSH = false
SSH_DOMAIN = 10.10.10.200
SSH_PORT = 9922
SSH_LISTEN_PORT = 22

说明:

  • DOMAIN:网页访问使用的域名,不需要端口号,主要用于 Gitea 内部判断用;
  • HTTP_PORT:容器监听的端口,因为上面配置中ports的存在,与实际访问端口没有必然联系;
  • ROOT_URL:git clone时使用的实际url
  • DISABLE_SSH:开启ssh主要为了免密,但实际上现在桌面操作系统也可以通过credential.helper实现https协议的免密操作;
  • SSH_DOMAIN:git clone使用ssh协议时的主机名或 ip;
  • SSH_PORT:git clone使用ssh协议时的端口号;
  • SSH_LISTEN_PORT:容器监听的端口号,和HTTP_PORT 情况类似;

Nignx反向代理

如果只是本地使用,这一节也不是必要的,可以直接跳过。

这里没有什么可以多说的,使用反向代理一方面方便使用,另一方面也可以提供外网访问,对于移动工作者来说是非常实用的。另外,Gitea进入后一片青青草原,我们增加proxy_pass http://127.0.0.1:3000/explore/repos;这条规则,使得用户默认进入仓库列表界面。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name <your domain>;

    # ssl设置
    ...

    location = / {
        proxy_pass      http://127.0.0.1:3000/explore/repos;
    }
    
    location / {
        proxy_pass      http://127.0.0.1:3000;
    }
    
    proxy_http_version  1.1;
    proxy_set_header    Upgrade             $http_upgrade;
    proxy_set_header    Connection          "upgrade";
    
    proxy_set_header    Host                $host:$server_port;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Real-PORT         $remote_port;
    
    proxy_set_header    X-Forwarded-Host    $http_host;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
}

我们也可以使用NginxProxyManager《好物推荐 - NginxProxyManager》)来设置反向代理,更方便快捷。

Git 仓库

由于我个人使用MWeb来编辑文章,下面就以MWeb为例。

配置好Gitea之后,我们创建一个名为MWebLibrary私人仓库作为MWeb文档库使用。当然,这里要求我们本机必须安装好git工具:

1
2
brew install git        # macOS
sudo apt install git    # Ubuntu

克隆仓库:

1
git clone https://git.example.com:8443/mtdcy/MWebLibrary.git

如果不使用Gitea,我们可以在本机或网络邻居上合适的位置初始化一个git仓库:

1
2
3
4
git init --bare MWebLibrary.git

# 会输出提示:
Initialized empty Git repository in /path/to/MWebLibrary.git/

接下来就可以像正常仓库一样进行克隆操作:

1
git clone /path/to/MWebLibrary.git 

接下来就只需要将MWeb文档库切换至刚克隆的MWebLibrary目录。这里值得一提的是,MWeb切换文档库需要目标位置含有mainlib.db这个文件。所以,我们先点击在Finder中显示,找到原有文档库,将其中所有文件拷贝到新位置,再进行文档库切换操作。

IMG_20231212_222245

手动上传更改 :

1
2
3
git add . 
git commit -m "init MWebLibrary' 
git push 

到这里,我们基本已经实现了资料库的版本管理与备份操作。

这里使用git只是实现版本管理,并不需要关心内容,更不需要关心文章中的链接是否可以正常显示,这与直接使用git来管理文章是有差别的。

定时任务

crontabLinux下的定时任务管理工具,当然macOS下同样也可以使用。在设置定时任务前,我们需要一个小脚本来帮我们上传更改:

1
vim commit.sh 

将下面的内容添加到commit.sh中:

1
2
3
4
5
6
7
#!/bin/bash 

cd $(dirname $0) &&
git add . &&
git ci -m "$(date)" &&
git pull --rebase &&
git push

接下来给commit.sh添加可执行权限:

1
chmod a+x commit.sh

最重要的部分来了,使用crontab来设置定时任务,帮助我们自动提交文档到MWebLibrary仓库:

1
2
3
4
crontab -e
# 在头部增加一行

0    */1   *    *    *      /path/to/MWebLibrary/commit.sh

我们设置的是每一小时自动提交一次。每当我们写了新的文章或做了修改,crontab都会自动帮我们提交到仓库中。如果哪一天修改了文章,发现改得还不如以前的好,我们就可以从git的历史提交中把旧版本拉出来。

关于crontab执行时间说明:

1
2
3
4
5
6
7
8
*    *    *    *    * 
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- day of week (0 - 7) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
|    |    |    +---------- month (1 - 12) OR jan,feb,mar,apr ...
|    |    +--------------- day of month (1 - 31)
|    +-------------------- hour (0 - 23)
+------------------------- minute (0 - 59)

每个部分的时间格式为A/B,其中分子A表示第几的意思,分母B表示间隔的意思,两部分不同时使用,分母B可以省略。

结束语

我们这里以MWeb为例讲述了文章的自动化版本管理与备份,自然其他软件和资料也是通用的。整个过程看起来很复杂,但其中99%的操作都只需要做一次,而且一个好的写作环境对于创作者来说真的太重要了,为此花点时间也是值得的。而且一旦设置好了,所有操作都是自动的,不再需要人为干预,因此也节省了很多的时间与精力。

其实我们写作的痛点还有一个没有解决,就是图片资源的提交。下期我们将介绍如何使用私有图床来方便我们的文章发布过程。


最后更新于 2023-12-14
小酌怡情
Built with Hugo
主题 StackJimmy 设计
访问量 -    访客数 - 人次