一 安装Git
yum install git
二 创建一个git用户并切换到git用户上
adduser git
su git
三 创建.ssh目录
mkdir .ssh
四 把开发者的 SSH 公钥添加到这个用户的 authorized_keys
文件中
cat id_rsa.pub >> /home/git/.ssh/authorized_keys
注意这里的authorized_keys文件,包括第三步它的上级目录.ssh 一定要git用户所有的
我在用的xshell上传的公钥的时候,当前用户是git但是上传的文件还是root用户下面的,所以在第四步的时候可以能要切换到root用 户 ,比如上面的命令就是我切换root用户后的,那么就需要事先在git用户下先创建好authorized_keys文件,直接使用vim命令即可
五 初始化Git仓库
先选定一个目录作为Git仓库,假定是/www/server/git/xxx.git
,在/www/server/git
目录下输入命令:
git init --bare xxx.git
这里 git init 是初始化空仓库的意思,而参数 --bare 是代表创建裸仓库,这个参数一定记得带上
当运行完上面的最后一句命令时,会有提示:Initialized empty Git repository in /www/server/git/xxx.git/
仓库貌似还是必须是git用户下的
在配置完公钥的情况后,本地在clone的时候可能还是会有输入密码的情况
解决一:
⒈ 打开ssh配置文件
vim /etc/ssh/ssh_config
2.修改配置如下
Host *
RSAAuthentication yes
PubkeyAuthentication yes
GSSAPIAuthentication yes
其中,RSAAuthentication yes
与 PubkeyAuthentication yes
是本文件的新增内容。
参数详解
#禁用root账户登录,如果是用root用户登录请开启
PermitRootLogin yes
# 是否让 sshd 去检查用户家目录或相关档案的权限数据,
# 这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。
# 例如使用者的 ~.ssh/ 权限设错时,某些特殊情况下会不许用户登入
StrictModes no
# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
# 至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
# 有了证书登录了,就禁用密码登录。
PasswordAuthentication no
3.如果在拷贝公钥过程中出现“Agent admitted failure to sign using the key”异常,客户端执行如下命令(没有遇到这个异常,未测试过)
ssh-add ~/.ssh/id_rsa
解决二:
这种是权限的问题
服务器端~.ssh/目录下执行命令:
chmod 600 authorized_keys
切换到~执行:
chmod 700 -R .ssh
如果在push的时候遇到以下报错
Counting objects: 9, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 506 bytes, done.
Total 5 (delta 2), reused 0 (delta 0)
error: insufficient permission for adding an object to repository database ./objects
fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
这句话时说,没有权限操作./object,我们首先要理解为什么没有权限,没有权限时因为自己的账户没有权限,而不是git没有权限。
所以上面在第五步初始化远程仓库的时候仓库应该属于git用户的
说一下解决方案,首先,网上都会告诉你,整个git仓库文件夹的权限的问题,因为没有配置权限为git。你需要到git的目录下,执行:
ls -al
你会看到当前你的仓库中的目录的权限如下:
total 12
drwxr-xr-x 3 root root 4096 Jul 29 12:09 .
drwxr-xr-x 13 root root 4096 Jul 29 12:02 ..
drwxr-xr-x 7 root root 4096 Jul 29 14:21 xxx.git
我上面的显示为root用户,root组,有些指导就说是因为上面的文件夹为root权限,记住修改为这个权限。操作如下:
chown -R git:git xxx.git
自动同步代码到项目目录
1. 修改刚才裸仓库的/hooks/post-receive文件
#!/bin/sh
unset GIT_DIR
DeployPath="/www/test/xxx"
LogPath="/www/server/git/xxx.git/hooks"
echo -e "\n================= `date +"%Y-%m-%d %H:%M:%S"` ===============\n" >> $LogPath/gitsync.log 2>&1
cd $DeployPath
#git stash
#先拉取再合并
git pull origin master >> $LogPath/gitsync.log 2>&1
#强制与远程服务器同步,不与本地合并,只能通过提交的客户端提交的方式修改代码。
#git fetch --all
#git reset --hard origin/master
#time=`date`
#echo "web server pull at webserver at time: $time."
echo "================================================" >> $LogPath/gitsync.log 2>&1
2.更改post-receive的所有者和权限
chmod -R 774 post-receive
chown git:git post-receive
3.创建gitsync.log日志文件
touch gitsync.log
chmod 770 gitsync.log
chown git:git gitsync.log
4.在项目根目录clone,并切换所有者权限
cd /www/test
git clone /www/server/git/xxx.git
chown -R git:git xxx
chmod -R 774 xxx
自动同步结束就ok了
如果hooks同步不起作用,打开hooks/gitsync.log查看错误日志
可能预见的错误
1、fatal: /usr/libexec/git-core/git-pull cannot be used without a working tree.
同步的项目文件夹没有建立---------------解决办法:在www下建立project项目文件夹2、fatal: Not a git repository (or any of the parent directories): .git
项目文件里没有git初始化------------------解决办法:在www路径下执行git clone /alidata/gitroot/project.git3、error: cannot open .git/FETCH_HEAD: Permission denied
git在项目目录没有写入权限---------------解决办法:修改所有者以及权限 chown -R phper:git project / chmod -R 774 project