前些日子由于原本的win服务器快到期了,于是想着迁移到另一台linux服务器上,这台服务器原本是外包弄的,我也忘了如何使用linux了,所以遇到各种各样的问题。把项目上传到服务器就想到了git跟ftp,也是为了装13就想着用git好了,然后搭建开始。
《在 Linux 下搭建 Git 服务器》这篇文章讲解非常好,可解决前期所有问题。
但是,我的项目中不能这么结束。
1,用户名跟文件夹名问题
文章中创建的是git用户跟git文件夹,但是我想用其他文件夹例如test,所以就需要test用户,当我在本地clone时,用的是
git clone git@xx.xx.xx.x:/home/test/.git // @前是git
也是可以clone下来test文件夹的,但是运行
ssh git@xx.xx.xx.xx 'cat >> .ssh/authorized_keys' < ~/.ssh/id_rsa.pub // @前是git
这个时候发现在服务端test中的.ssh没有出现authorized_keys文件,反而在git文件夹下出现了,这就不对了。
这时突发奇想把@前的 git 换成 test ,完美!!!.ssh下出现了authorized_keys。
2,hooks问题
在服务端我是用的 git init ,而不是 git init --bare , 因为加上 --bare 会是个裸仓库,也就是没有工作目录,看着不习惯,而 git init 会与你所上传的目录一致。注意的是要在 git init 后
git config receive.denyCurrentBranch ignore //设置允许远程接收文件
否则在 git push 时会报错。
当本地 git push 后,在服务端没有出现修改后的文件。只有在 git reset --hard 后才会出现,显然这不是所期待的结果。理应是本地 git push ,服务端出现提交的文件。而 .git 中的 hooks 就是解决这个问题的。于是网上找到一个 post-receive 文档在本地 notepad++ 中编辑好,然后上传到服务端中,修改文件的所有者与权限。
chown test:test post-receive
chmod +x post-receive
但是当我满心欢喜本地提交时,git push 后发现有报错
remote: error: cannot run hooks/post-receive: No such file or directory。
这就奇怪了,文件有,执行权限有,就是报错。那么肯定是文件的问题了。经过很长时间寻找,一直以为是文件内容问题,所以找了很多复制粘贴到本地,然后提交到服务端。但是都有这个问题。后来找到一个解释编辑格式的问题,也就是在win下编辑好上传,虽然肉眼格式是正确的,但是在linux下会有^M的出现,导致了上面的问题。于是在服务端手敲了一遍后,完美!!!实时提交服务端更新。如果是win下编辑好的,在linux下vim 打开在左下部会有个 (Dos),手敲之后就完全不见了,也算一个检测的条件吧。
下面粘贴下我的post-receive
#!/bin/sh
cd /home/test //目录
unset GIT_DIR //http://blog.csdn.net/richard_jason/article/details/53188200,有不同的解释,但post-receive中代表 .
git reset --hard //强制到最新版本号
希望你看到这个,可以少些坑。