Skip to content

Git搭建及从SVN迁移

基于CentOS 8的Git 服务搭建

服务端创建仓库

  1. 安装git
    Shell
    sudo dnf instal git
  2. 创建项目目录并进入
    Shell
    mkdir /opt/ceshi.git
    cd ceshi.git/
  3. 初始化项目
    Shell
    git init --bare --shared

分配用户

方式一:服务端分配

  1. 创建使用git的用户
    Shell
    sudo useradd --gid git --no-create-home --no-user-group --shell /usr/bin/git-shell --home-dir / xxxxlll
    若创建失误,可参考以下命令进行删除,remove参数可将home路径和邮件池等内容删除
    Shell
    sudo userdel --remove xxxxlll
  2. 修改用户密码
    Shell
    sudo passwd xxxxlll

方式二:客户端分配

  1. 在用户终端生成公私钥对
    Shell
    ssh-keygen -t rsa -f git-client-xl
    执行后生成私钥git-client-xl及公钥git-client-xl.pub两个文件
  2. 将公钥上传至GIT服务器,以用来免密登录
    Shell
    ssh-copy-id -i git-client-xl.pub git@192.168.245.128
  3. 验证免密登录
    Shell
    ssh git@192.168.245.128 [-i git-client-xl]
  4. 修改ssh配置文件
    Shell
    sudo vi /etc/ssh/ssh_config.d/99-userkey.conf
    添加如下内容
    properties
    IdentityFile ~/.ssh/git-client-xl
  5. 重启ssh服务
    Shell
    systemctl restart sshd
  6. 配置Git用户信息
    Shell
    git config --global user.name "xxxxlll"
    git config --global user.email "xxxxlll@sunxiaolong.net"

客户端使用

  1. 克隆代码库至本地
    Shell
    git clone git@192.168.245.128:/opt/ceshi.git
  2. 尝试修改及提交
    Shell
    cd ceshi
    touch testfile1
    git add testfile1
    git commit -m "提交测试"
    git push
  3. 无报错则服务正常可用

迁移SVN到Git

  1. 在SVN项目中过滤出所有用户
    Shell
    svn log --xml | grep author | sort -u |   perl -pe 's/.*>(.*?)<.*/$1 = /'
  2. 编辑用户映射关系,保存到users.mapping中
    Shell
    vi ~/users.mapping
    内容格式如下
    ini
     xxxxlll = xxxxlll <xxxxlll@sunxiaolong.net>
  3. 安装git-svn
    Shell
    sudo dnf install git-svn
  4. 拉取代码
    Shell
    git svn clone svn://10.19.208.133/ceshi --authors-file=~/users.mapping --no-metadata -s ceshi1
  5. 清理错乱的分支配置
    Shell
    cp -Rf .git/refs/remotes/origin/tags/* .git/refs/tags/
    rm -Rf .git/refs/remotes/origin/tags
  6. 设置git关联
    Shell
    git remote add origin git@my-git-server:myrepository.git
  7. 推送相关代码
    Shell
    git push origin --all

QA

Q: push代码时出现“无法推送一些引用”

Shell
[git@git ceshi]$ git push
xxxxlll@192.168.245.128's password:
Could not chdir to home directory /home/xxxxlll: No such file or directory
枚举对象: 3, 完成.
对象计数中: 100% (3/3), 完成.
写入对象中: 100% (3/3), 203 bytes | 203.00 KiB/s, 完成.
Total 3 (delta 0), reused 0 (delta 0)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: 默认禁止更新非纯仓库的当前分支,因为您推送的内容将导致索引和工作区
remote: 不一致,并且将需要执行 'git reset --hard' 将工作区匹配到 HEAD。
remote:
remote: 您可以在远程仓库中设置 'receive.denyCurrentBranch' 配置变量为
remote: 'ignore' 或 'warn' 以允许推送到当前分支。然而不推荐这么做,除非您
remote: 用某种方式将其工作区更新至您推送的状态。
remote:
remote: 若要屏蔽此信息且保持默认行为,设置 'receive.denyCurrentBranch'
remote: 配置变量为 'refuse'。
To 192.168.245.128:/opt/ceshi.git
! [remote rejected] master -> master (branch is currently checked out)
error: 无法推送一些引用到 'xxxxlll@192.168.245.128:/opt/ceshi.git'

A: 修改git服务端配置文件,以允许用户push代码

ini
[receive]
    denyCurrentBranch = ignore