在进行以下操作时 一定要注意文件的权限问题,绝大部分的问题出现是由于文件权限的问题
在服务器端创建git仓库
第一步,安装git:
$ sudo apt-get install git
第二步,创建一个git用户,用来运行git服务:
$ sudo adduser git
第三步,创建证书登录:
收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub
文件,把所有公钥导入到/home/git/.ssh/authorized_keys
文件里,一行一个。
第四步,初始化Git仓库:
先选定一个目录作为Git仓库,假定是 /web/52inlove.git
, 在 /web
目录下输入命令:
$ sudo git init --bare 52inlove.git
Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾。然后,把owner改为git:
$ sudo chown -R git:git 52inlove.git
第五步,禁用shell登录:
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
在服务器初始化一个服务器本地的 Git 仓库
这个仓库就是通过 git init
初始化出来最常见的本地仓库,它的作用是拉去远程仓库(其实就在它旁边)最新的源码到网站的根目录。
git clone /web/52inlove.git #从远程仓库 clone 出源码
为远程仓库(git服务器)设置 Hook
$ cd /web/52inlove.git/hooks
#post-receive 这个文件可能不存在 新建即可
$ vim post-receive
post-receive内容
#!/bin/sh
echo 'Hook is running'
unset GIT_DIR
DeployPath="/web/www/52inlove"
cd $DeployPath
sudo chown -R www-data:www-data $DeployPath
sudo chmod -R 775 $DeployPath
git fetch --all
git reset --hard origin/master
echo 'Hook finishes !!! :)'
exit 0
phpstorm push结果如下
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 340 bytes | 0 bytes/s, done.
Total 4 (delta 3), reused 0 (delta 0)
remote: Hook is running
remote: Fetching origin
remote: From /web/52inlove
remote: 98da1ad..cad5e4f master -> origin/master
remote: HEAD is now at cad5e4f fix title
remote: Hook finishes !!! :)
To 52inlove.com:/web/52inlove.git
98da1ad..cad5e4f master -> master
如果出现以下情况
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git@192.168.1.X:/var/git.server/.../web
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git@192.168.1.X:/var/git.server/.../web'
解决方法
这是由于git
默认拒绝了push
操作,需要进行设置,修改.git/config
文件后面添加如下代码:
[receive]
denyCurrentBranch = ignore
最后
- 本地的工作环境 git remote 地址为
git@52inlove.com:/web/52inlove.git
- 将需要操作该仓库的用户的public ssh key 复制到服务器git用户家目录下的
.ssh/authorized_keys
中
git将本地仓库上传到远程仓库
1. git init
2. git add .
3. git commit -am "###" -------以上3步只是本地提交
4. git remote add origin git@xx.xx.xx.xx:repos/xxx/xxx/xxx.git
5. git push origin 本地分支:远程分支