赞
踩
首先搭建一个git服务器试一试,我们知道git本身是没有任何权限管理的,它依赖的是操作系统的权限管理,所以我们只要有OS某用户的权限就能访问git远程服务器并进行修改
首先在一个容器里创建.git作为远程仓库
这个容器的22端口被我们映射到host的6670端口
远程仓库的工作目录是位于master分支,待会客户端代码是push到opt分支
为什么不push到master分支
git担心我们没有备份代码,所以不能push到远程工作目录所在的分支。如果想push到工作目录,可以将远程仓库设置成bare
git config --bool core.bare true
在remote repo所在的容器设置好ssh服务,可以让其他服务器通过ssh连接到此容器
sudo apt-get update
sudo apt-get install openssh-client
sudo apt-get install openssh-server
# 修改配置文件
sudo vim /etc/ssh/sshd_config
# 添加以下配置
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PermitRootLogin yes
port=22
# 重启ssh服务
sudo /etc/init.d/ssh restart
新建一个新容器,测试一下远程git仓库
git clone ssh://root@ip:6670/home/git-test/.git
输入remote服务器的root密码,即可clone下来
我们可以在新容器中修改代码,push上去
git remote -v一下
发现remote的origin url就是我们remote的地址
注意到我们现在remote所有的东西都是通过root用户进行的,这样在客户端ssh的时候使用root连接远程,当然什么都能做,有最高权限。现在我们在remote创建一个git用户来完成这一切。
sudo adduser git
# 输入密码等
sudo chmod u+w /etc/sudoers
vim /etc/sudoers
给git sudo权限
保存退出
sudo chmod u-w /etc/sudoers
切换到git用户,和之前一样,在远程服务器用git用户创建一个仓库
回到客户端容器,clone一下
# 这次是git用户连接的ssh
git clone ssh://git@ip:6670/home/git-test/.git
成功clone
在客户端目录修改一些文件push到远程
注意本地开发的操作系统的版本,经测试,ubuntu16使用git-repo,因为ubuntu16默认的python3版本是python3.5,repo的一些.py脚本和python3.5不兼容,要使用python3.7,经测试的确是这样。而ubuntu16安装python3.7是极其困难的,有兴趣的小伙伴可以尝试一下。本例以ubuntu20.04版本介绍。
创建两个ubuntu20.04镜像的容器,repo-demo和client,还是将repo-demo的22端口映射到host的6670端口
# 拉取docker的ubuntu20.04镜像
docker pull ubuntu:20.04
首先初始化repo-demo容器的repo仓库
如图,external文件夹下有三个git仓库:example1 example2 example3
example2和3与1类似
manifest.git是一个manifest.xml的仓库,用于存储repo仓库的所有xml文件。一种项目组合一个xml文件,具体的语法请查看 官方manifest-format和 这篇博文
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="repo-demo" fetch="/home/repo-demo" review="review.source.android.com" />
<default revision="master" remote="repo-demo" />
<project name="external/example1" path="external/example1"/>
<project name="external/example2" path="external/example2"/>
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="repo-demo" fetch="/home/repo-demo" review="review.source.android.com" />
<default revision="master" remote="repo-demo" />
<project name="external/example1" path="external/example1" revision="opt"/>
<project name="external/example2" path="external/example2"/>
</manifest>
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="repo-demo" fetch="/home/repo-demo" review="review.source.android.com" />
<default revision="master" remote="repo-demo" />
<project name="external/example2" path="external/example2"/>
<project name="external/example3" path="external/example3"/>
</manifest>
安装ssh服务
apt-get update
apt-get install openssh-server openssh-clients
vim /etc/ssh/sshd_config
/etc/init.d/ssh restart
这样就可以通过6670端口连接到此容器
为client容器安装python3.8(ubuntu20.04 apt-get库中默认的是python3.8,python3.7及以上就可以支持repo,下面是安装python3.7,忽视就行)
# 安装python3.8
apt-get install python3
sudo apt update sudo apt upgrade -y # 安装依赖 sudo apt install build-essential -y sudo apt install libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev -y sudo apt-get install zlib1g-dev # 下载python代码 wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz tar -xzvf Python-3.7.1.tgz cd Python-3.7.1 ./configure --enable-optimizations sudo make && make install
client上安装repo
mkdir -p ~/.bin
PATH=~/.bin:$PATH
# docker下载的ubuntu20镜像没有curl命令
apt-get install curl -y
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo
chmod a+rx ~/.bin/repo
发现其实就是安装了一个python脚本。我们将用这个脚本下载官方的文件和远程的manifest到本地,然后再pull远程的代码,本例采用了 这篇博文的建议,每个开发空间维护自己的repo,不要使用~/.bin/repo来操作,这样具有针对性
所有准备工作都完成后,现在开始在client上连接远程,并下载项目
client1文件夹使用default.xml配置文件
mkdir /home/client1
cd /home/client1
# 使用谷歌源
repo init -u ssh://root@ip:6670/home/repo-demo/manifest.git/ --repo-url=https://gerrit-googlesource.proxy.ustclug.org/git-repo
得到以上文件,安装了完整的repo和manifests,其中manifests是远程的manifest
修改repo url
vim .repo/repo/repo
这样万无一失,repo会去我们的远程服务器拉取项目
链接一下此项目的repo,可以省略
ln -f -s .repo/repo/repo ./repo
如果省略的话,下面的repo命令都需要指定.repo/repo/repo
拉取远程项目,第一次sync是拉取代码,以后的sync可以指定xml换项目
./repo sync
成功拉取project1-2
重复上述,client2的结果
# 指定xml
repo init -u ssh://root@ip:6670/home/repo-demo/manifest.git/ -m pj12.xml --repo-url=https://gerrit-googlesource.proxy.ustclug.org/git-repo
example1-opt多了a.txt文件,client1中的example1-master只有一个kobe.txt
重复上述,client3的结果
# 指定xml
repo init -u ssh://root@ip:6670/home/repo-demo/manifest.git/ -m pj23.xml --repo-url=https://gerrit-googlesource.proxy.ustclug.org/git-repo
现在我们在client2的example1-opt分支上提交一次代码到remote
对其中一个git库的修改可以像操作正常的git一样进行代码提交
git add
git commit
git push [origin] [branch]
同样,远程项目所在的分支不能为当前要提交的分支,否则push不上去
到这里,虽然基本的git库都配置好了,但是我们每次pull clone代码以及repo sync都需要输入密码,特别是repo每个库都要输入密码,十分不方便。
这是由于我们使用的是ssh连接,接下来为ssh配置公私钥,实现免密操作。
# 查看自己的配置
git config --list
在我们工作环境(linux、windows都适用)下输入以下命令,生成公私钥
ssh-keygen -t rsa -C "your@email.com"
一路回车,就在/root/.ssh中得到了相应的公私钥(因为我们是使用的root用户执行的命令)
在git服务器中,我们创建了git用户,下面就用它作为演示
先把工作环境的id_rsa.pub公钥文件复制到git服务器上
查看git服务器的/home/git目录
有一个.ssh文件夹
如果没有该文件夹则自己创建
# 创建目录
mkdir .ssh
# 修改拥有者
chown -R git:git .ssh
cd .ssh
# 创建keys文件
touch authorized_keys
# 修改文件权限
chmod 700 authorized_keys
# 修改文件拥有者
chown -R git:git authorized_keys
然后将id_rsa.pub的内容复制到authorized_keys文件中,保存退出
一个用户占用一行即可
此时,我们再使用工作环境clone代码
就不用再输入密码了~
同样测试一下我们的repo仓库
repo sync终于不用再重复输入密码了,这更加印证了之所以要重复输入密码,是因为我们sync同时clone了很多git库的代码,每个git库都要输入密码,而且为了限流,经常一个库要输入几次密码
接下来还可能做一章配置gitlab或者gerrit管理repo仓库的博客,大家多多支持,谢谢
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。