创建远程Git仓库

一 安装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.git

3、error: cannot open .git/FETCH_HEAD: Permission denied
git在项目目录没有写入权限---------------解决办法:修改所有者以及权限 chown -R phper:git project / chmod -R 774 project

自动同步参考于 https://www.jianshu.com/p/9eedd25b2919

猜你喜欢

转载自blog.csdn.net/weixin_41100576/article/details/81270951