引入

目前,我的博客虽然是在云服务器上进行部署,但我在本地进行调试。每次对项目进行修改后,都需要经历下面的工作流程:

  1. 执行下面的指令,重新生成博客的静态内容。
1
hexo g
  1. 如果需要将修改提交到github,则执行下面的指令。
1
2
3
4
5
6
7
8
# 将所有未追踪的文件添加到Git的暂存区
git add .

# 将暂存区中的改动提交到本地的版本库
git commit -m "提交的信息"

# 将本地版本库中的改动推送(push)到远端的版本库
git push
  1. 将本地更新后的项目推送到服务器端以应用新版本。
1
scp -r ./public/* 用户名@云服务器IP:/var/www/html

这需要我与终端进行比较多次数的交互,在博客内容需要频繁更新的情况下非常影响效率。因此我决定编写一个脚本来集成上面的工作,使用比较少的交互次数,敲击更少次键盘来完成项目的更新。这有助于提高编码效率,降低我写博客的成本。

实现

编写的脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

# 重新编译项目
echo "Building project..."
hexo g

# 提示是否提交到GitHub,因为每次更新未必值得推送到git远程库中。
read -p "Do you want to commit to GitHub? (y/n): " commit
if [ "$commit" = "y" ]; then
echo "Committing to GitHub..."
git add .
read -p "Enter commit message: " message
git commit -m "$message"
git push
fi

# 将编译后的文件复制到服务器
echo "Copying files to server..."
scp -r ./public/* 用户名@云服务器IP:/var/www/html

echo "Done."

效果

将上面的内容保存为deploy.sh文件,存放在博客的根目录下。

此后每次更新本地主机上项目的内容后,使用git bash执行上面的脚本,只需要最多两次交互即可实现项目的提交。

脚本会询问是否需要将项目提交到git远程仓库,如果输入”Y”则继续询问git commit的信息是什么,输入信息后自动实现提交到git远程库与服务器,否则直接将项目覆盖到云服务器。

这实现了我的预期,此后我只需要在更新项目时执行这个脚本即可。

背景知识补充

在这个过程中,一些背景知识我其实不够熟悉,在这里作补充。

Git的工作流程中的三个区域

Git的工作流程涉及到三个主要的区域:工作目录(Working Directory),暂存区(Staging Area/Index)和版本库(Local Repository)。另外,还有一个远端版本库(Remote Repository)的概念。

工作目录:这是我在电脑上看到的目录。它包含了所有正在工作的文件和目录。这些文件可能处于跟踪(已经被Git管理)或者未跟踪(尚未被Git管理)的状态。

暂存区:执行git add命令时,改变的文件会被放入暂存区。这个区域是一个准备区域,它保存了下次将要提交的改变。可以多次执行git add命令来添加多个文件到暂存区。

版本库:当执行git commit命令,Git会将暂存区中的文件变化保存到版本库。版本库保存了项目的所有历史记录,每次提交都会创建一个新的版本,你可以随时回退到任何一个历史版本。

远端版本库:远端版本库是存储在网络上的你的项目的版本库,比如GitHub。你可以将本地版本库的改动推送到远端版本库(git push),也可以从远端版本库拉取其他人的改动到本地(git pull)。

这四个区域配合使用,使得Git具有强大的版本控制能力。让我们可以在本地进行开发和提交,然后再将改动推送到远端,这样就可以与团队其他成员共享改动了。

使用Git Bash运行Bash脚本

Bash脚本(也常称为shell脚本)允许你使用各种Unix命令和控制结构(如if语句,for循环等)来编写程序。你可以在Bash脚本中执行任意的Bash命令、调用其他的脚本或者程序、进行文件操作等。

本次实现的脚本就是一种Bash脚本,它使用的是Bash语言,在没有Git Bash的情况下,无法直接在windows环境下执行。而Git Bash提供了一个Unix-like的环境,包括一系列常见的Unix命令,如lssshscp等,使得Windows用户可以使用类Unix的命令行体验。这满足了我们的需要,在windows系统下直接执行bash 脚本。