在用 gitbook 部署的时候才发现的一个很不错的操作,此操作将版本库与工作区分开,实在是非常不错的东西。

初始化裸库

git init myrepo.git --bare

查看 myrepo 目录,我们可以看到,和我们不加 --bare 的不同,其直接存储的就是通常目录下的 .git 下的内容。

ls -1 myrepo.git
HEAD
branches
config
description
hooks
info
objects
refs

不过在裸仓库内我们是无法进行任何变更操作,执行任何 git 命令的,实际上其就是单纯的做一个存储作用而已了。下面我们来看看怎么样提交内容。

一般远程服务器上只需要存储这个就行了,而不用担心会有任何改动和提交。

检出版本库

现在我们需要将此版本库检出到一个工作区。

git clone myrepo.git myrepo
ll myrepo/.git

我们会看到,myrepo 目录下的 .git 目录中的内容应该是和 myrepo.git 下面的是一致的。

现在就可以和通常的情况下来进行提交修改了。

hooks

每个 .git 版本库下面都会有很多钩子,用来在某些事件的时候执行。

ls -1 myrepo.git/hooks
applypatch-msg.sample
commit-msg.sample
fsmonitor-watchman.sample
post-update.sample
pre-applypatch.sample
pre-commit.sample
pre-push.sample
pre-rebase.sample
pre-receive.sample
prepare-commit-msg.sample
update.sample

在 gitbook 的部署中,我需要在我的版本内容有提交的时候,就将其更新到我的 nginx 下面,可以设置一个 post-receive 钩子:

vim post-receive
#!/bin/bash
git --work-tree=/usr/share/nginx/html checkout -f

这样当收到提交后,就会将这个裸库检出到对应的 /usr/share/nginx/html 目录下面了。