当前位置:   article > 正文

手把手教你搭建git、git-repo服务器_gitlab 建repo

gitlab 建repo

手把手教你搭建git、git-repo服务器

1.1 推荐博客

manifest.xml语法

repo服务器搭建1

repo服务器搭建2

1.2 测试Git服务器

首先搭建一个git服务器试一试,我们知道git本身是没有任何权限管理的,它依赖的是操作系统的权限管理,所以我们只要有OS某用户的权限就能访问git远程服务器并进行修改

  • 首先在一个容器里创建.git作为远程仓库

  • 这个容器的22端口被我们映射到host的6670端口

  • 远程仓库的工作目录是位于master分支,待会客户端代码是push到opt分支

    • 为什么不push到master分支

      git担心我们没有备份代码,所以不能push到远程工作目录所在的分支。如果想push到工作目录,可以将远程仓库设置成bare

      git config --bool core.bare true
      
      • 1
  • 在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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 新建一个新容器,测试一下远程git仓库

    git clone ssh://root@ip:6670/home/git-test/.git
    
    • 1

    输入remote服务器的root密码,即可clone下来

    我们可以在新容器中修改代码,push上去

  • git remote -v一下

    image-20220303131345346

    发现remote的origin url就是我们remote的地址

  • 注意到我们现在remote所有的东西都是通过root用户进行的,这样在客户端ssh的时候使用root连接远程,当然什么都能做,有最高权限。现在我们在remote创建一个git用户来完成这一切。

    sudo adduser git
    # 输入密码等
    sudo chmod u+w /etc/sudoers
    vim /etc/sudoers
    
    • 1
    • 2
    • 3
    • 4
  • 给git sudo权限

  • 保存退出

    sudo chmod u-w /etc/sudoers
    
    • 1
  • 切换到git用户,和之前一样,在远程服务器用git用户创建一个仓库

    image-20220307095456018

  • 回到客户端容器,clone一下

    # 这次是git用户连接的ssh
    git clone ssh://git@ip:6670/home/git-test/.git
    
    • 1
    • 2
  • 成功clone

    image-20220307095602017

  • 在客户端目录修改一些文件push到远程

    image-20220307100859472

1.3 搭建repo服务器

  • 注意本地开发的操作系统的版本,经测试,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
    
    • 1
    • 2
  • 首先初始化repo-demo容器的repo仓库

    image-20220303195003603

    • 如图,external文件夹下有三个git仓库:example1 example2 example3

      image-20220303195129644

      image-20220303195150674

      example2和3与1类似

    • manifest.git是一个manifest.xml的仓库,用于存储repo仓库的所有xml文件。一种项目组合一个xml文件,具体的语法请查看 官方manifest-format这篇博文

      image-20220303195653441

      • default.xml 默认配置,本例是获取project1&2的master分支
      <?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>
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • pj12.xml 获取project1&2,其中project1为opt分支
      <?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>  
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • pj23.xml获取project2&3的master分支
      <?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>  
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
  • 安装ssh服务

    apt-get update
    apt-get install openssh-server openssh-clients
    
    vim /etc/ssh/sshd_config
    
    • 1
    • 2
    • 3
    • 4

    image-20220303200834967

    /etc/init.d/ssh restart
    
    • 1

    这样就可以通过6670端口连接到此容器

  • 为client容器安装python3.8(ubuntu20.04 apt-get库中默认的是python3.8,python3.7及以上就可以支持repo,下面是安装python3.7,忽视就行)

    # 安装python3.8
    apt-get install python3
    
    • 1
    • 2
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  • 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20220302094434029

    发现其实就是安装了一个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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20220303204042046

    得到以上文件,安装了完整的repo和manifests,其中manifests是远程的manifest

  • 修改repo url

    vim .repo/repo/repo
    
    • 1

    image-20220303204357660

    这样万无一失,repo会去我们的远程服务器拉取项目

  • 链接一下此项目的repo,可以省略

    ln -f -s .repo/repo/repo ./repo
    
    • 1

    image-20220303204720088

    如果省略的话,下面的repo命令都需要指定.repo/repo/repo

  • 拉取远程项目,第一次sync是拉取代码,以后的sync可以指定xml换项目

    ./repo sync
    
    • 1

    image-20220303211453767

​ 成功拉取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
    
    • 1
    • 2

    image-20220304101550874

    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
    
    • 1
    • 2

    image-20220304102353980

  • 现在我们在client2的example1-opt分支上提交一次代码到remote

    对其中一个git库的修改可以像操作正常的git一样进行代码提交

    git add
    git commit
    git push [origin] [branch]
    
    • 1
    • 2
    • 3

    同样,远程项目所在的分支不能为当前要提交的分支,否则push不上去

1.4 设置公私钥,免密

到这里,虽然基本的git库都配置好了,但是我们每次pull clone代码以及repo sync都需要输入密码,特别是repo每个库都要输入密码,十分不方便。

这是由于我们使用的是ssh连接,接下来为ssh配置公私钥,实现免密操作。

# 查看自己的配置
git config --list
  • 1
  • 2
  • 在我们工作环境(linux、windows都适用)下输入以下命令,生成公私钥

    ssh-keygen -t rsa -C "your@email.com"
    
    • 1

    一路回车,就在/root/.ssh中得到了相应的公私钥(因为我们是使用的root用户执行的命令)

    image-20220308095701031

  • 在git服务器中,我们创建了git用户,下面就用它作为演示

  • 先把工作环境的id_rsa.pub公钥文件复制到git服务器上

    • 查看git服务器的/home/git目录

      image-20220308095908660

      有一个.ssh文件夹

    • 如果没有该文件夹则自己创建

      # 创建目录
      mkdir .ssh
      # 修改拥有者
      chown -R git:git .ssh
      cd .ssh
      # 创建keys文件
      touch authorized_keys
      # 修改文件权限
      chmod 700 authorized_keys
      # 修改文件拥有者
      chown -R git:git authorized_keys
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
    • 然后将id_rsa.pub的内容复制到authorized_keys文件中,保存退出

      image-20220308100138646

      一个用户占用一行即可

  • 此时,我们再使用工作环境clone代码

    image-20220308100242379

    就不用再输入密码了~

  • 同样测试一下我们的repo仓库

    image-20220308100446100

    repo sync终于不用再重复输入密码了,这更加印证了之所以要重复输入密码,是因为我们sync同时clone了很多git库的代码,每个git库都要输入密码,而且为了限流,经常一个库要输入几次密码

接下来还可能做一章配置gitlab或者gerrit管理repo仓库的博客,大家多多支持,谢谢

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/636784
推荐阅读
相关标签
  

闽ICP备14008679号