前言
最近一直想把自己的笔记放在网上,能够公网访问的那种。
用了几家类似功能的产品:
- 看云
看云提供服务器,可以绑定到自己的 http 域名上,访问速度也还可以,缺点是看云的编辑器用着难受,还有就是免费版没有「自动发布」功能,想发布就要要去网页版,而且还巨慢,发布十几分钟了网页才更新。
- 语雀
语雀提供的是一个在线文档阅读的方式,可以通过 www.yuque.com/username
这个链接直接查看自己的公开文档,相当于语雀是平台,你是平台的作者,没什么大的缺点,手机端页面显示效果不那么好。
- Gitbook
我最后选择了这个,本地版,可以自动生成静态网页(有点像 hexo),然后我把生成的网页代码 push 到服务器里。
Gitbook 本地部署
1、第一步,安装 Gitbook 的下载工具:cnpm install gitbook-cli -g
2、第二步,选择一个空文件夹并初始化 Gitbook:gitbook init
这个过程极其漫长,即使是淘宝源也很慢。
最后居然只生成两个文件……(应该是偷偷全局安装了 Gitbook 吧)
3、第三步,创建一个book.json
文件,配置自己的信息
里面有一些插件的说明,Gitbook 的插件安装需要把插件信息填在上面的文件里面,然后执行 gitbook install ./
4、安装完成
每次都执行 gitbook build
,然后生成的 _book
就是对应的网页文件夹。
下面要做的就是把这个特定的文件夹 push 到服务器指定目录里。
如何把一个特定目录 push 到服务器指定目录
这个过程我折腾了好久,中间遇到一大堆坑,我先说最终的正确操作吧!
1、第一步,在服务器里创建 git 仓库
在 /home/git
里面(任意目录都可以),执行 git init --bare book.git
,注意这个 --bare
不能省,否则:
加上 bare,/home/git/book.git
就是最终的目录,如果不加 bare,就成了/home/git/book.git/.git
是最终目录了。
2、第二步,设置 post-receive 钩子
钩子的用处:
git push 之后,服务器里 book.git 应该只保存 git 记录,没有实际的文件(在现在不会用 git 的我看来是这样……),钩子可以把 push 上去的记录变成实际的文件输出到指定目录里面。
总之就是,没它,你找不着 push 的文件。
方法:
进入 book.git/hooks
文件夹,创建一个新的文件 post-receive
,内容如下:
# DIR后面换成你想要的输出文件目录
DIR=/www/wwwroot/www.shuifengche.top/book
git --work-tree=${DIR} clean -fd
# 直接强制检出
git --work-tree=${DIR} checkout --force
然后把该文件的权限设置为 777(为了减少麻烦,我都开了最高权限,可能会不安全)
3、第三步,在本地创建 git
进入在自己想要保存在服务器上的那个文件夹里,
比如我的 Gitbook 文件夹,里面是 SUMMARY.md
、_book
、book.json
、README.md
等等
这里要注意,虽然 _book
文件夹才是真正的 Gitbook 网站文件夹,但不要只 push 这个文件夹(意思是不要在这里面生成 git),理由是:
gitbook build
的操作,会清空_book
文件夹并重新生成,如果你只上传它,那么每次 build 之后,git 没了,又要重新配置。所以干脆把整个 gitbook 文件夹全部 push 上去。
在 gitbook 文件夹里执行:
git init # 给gitbook文件夹创建一个git环境
git remote add origin ssh://root@xx.xx.xxx.xxx:abcd/home/git/book.git
# 设置远程服务器地址,root 是服务器用户名,abcd 是端口(默认22,可以不写)
# 后面是第一步里面的 git 文件夹
git add . # 注意这个点,意思是 add 文件夹内所有文件
git commit -m 'asdhgfakgf' # 随便写个 commit,最好别省这一步,我也不知道为啥
git push # 这时候提示你添加一个 --set-upstream,按照提示做就行了
Everything up-to-date!
终于搞定了……
4、我遇到的坑
在不断尝试的过程中,这里改一下,那里改一下,网上的 debug 方案各不相同,有些报错还找不到解决方法。
- 1、没有权限。各种报错提示你报错,一定要确保用户有 post-receive 文件的读写权限,一定要确保目标目录能写入。
- 2、多个本地 git 要 push 同一个服务器 git,我现在还不知道怎么实现,所以它的报错我都不管,直接删除服务器 git 重来一遍。
- 3、服务器 git 创建时没有加 bare,最终的结果是 post-receive 无效,指定目录一直没文件。
- ……
总之,有 bug,查攻略,没攻略,推倒重来。
这个把 gitbook 文件夹部署到服务器上的过程,即把本地任意一个工作目录 push 到服务器的指定目录的过程,以后应该是要经常用的,到那时我可能就会明白这么多坑的具体原因了。