# Git服务

# Flag

Git与SVN区别

  • git是分布式,svn是集中式;
  • svn只有一个中央版本库,而git有无限个;
  • svn有全局的版本号,git没有;
  • git不必联网就可以看到所有的log,svn必须联网;
  • git保存的是元数据,svn是复制整个文档;
  • git强调分支,svn只是不同的文件目录,就是copy

其他版本控制系统软件

其他版本控制服务

Gogs

Gitea

# GitLab

root用户登录,右上角头像,Settings -> Preferences -> Localization -> Language,选择“简体中文”即可。 高版本的GitLab自带了中文语言包,可以通过上述方式直接切换。如果找不到该选项,表示你的版本还不支持。只能通过安装中文插件进行汉化。

version: '2'
services:
    gitlab:
      image: 'twang2218/gitlab-ce-zh:11.1.4'
      restart: unless-stopped
      hostname: 'git.woetu.com'
      environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
          external_url 'http://git.woetu.com'
          gitlab_rails['time_zone'] = 'Asia/Shanghai'
          # 需要配置到 gitlab.rb 中的配置可以在这里配置,每个配置一行,注意缩进。
          # 比如下面的电子邮件的配置:
          # gitlab_rails['smtp_enable'] = true
          # gitlab_rails['smtp_address'] = "smtp.exmail.qq.com"
          # gitlab_rails['smtp_port'] = 465
          # gitlab_rails['smtp_user_name'] = "xxxx@xx.com"
          # gitlab_rails['smtp_password'] = "password"
          # gitlab_rails['smtp_authentication'] = "login"
          # gitlab_rails['smtp_enable_starttls_auto'] = true
          # gitlab_rails['smtp_tls'] = true
          # gitlab_rails['gitlab_email_from'] = 'xxxx@xx.com'
      ports:
        - '8099:80'
        - '442:443'
        - '22:22'
      volumes:
        # - /home/gitlab/config:/home/gitlab/config
        # - /home/gitlab/data:/home/gitlab/data
        # - /home/gitlab/logs:/home/gitlab/logs
        - config:/etc/gitlab
        - data:/var/opt/gitlab
        - logs:/var/log/gitlab
volumes:
    config:
    data:
    logs:

# GitHub

统计

# 访问速度过慢

可以使用git config --global url."github.com".insteadOf hub.fastgit.org来替换url

Git Clone SSH 加速

  • git@git.zhlh6.cn 中国北京
  • git@hub.fastgit.org 中国香港

Raw 文件加速

刷新DNS缓存

# macOS
killall -HUP mDNSResponder
dscacheutil -flushcache
# Windows
ipconfig /flushdns
# Linux
service nscd restart
# Ubuntu
sudo /etc/init.d/dns-clean start

克隆代理地址

  • 替换github.com
    • github.com.cnpmjs.org
    • jlytgs.com/github_
    • github.dyf62976.workers.dev
    • github.wuyanzheshui.workers.dev
    • github.hsmw.workers.dev
    • github.reycn.workers.dev
    • github.itzmx.com

# Actions

生成公钥和私钥ssh-keygen -t rsa -b 4096 -C "yourname@example.com" -f 文件名称 -N ""(ACTION_DEPLOY_KEY), 或者生成新的个人访问令牌(PERSONAL_TOKEN)https://github.com/settings/tokens/new (opens new window)

第三方CI

# GitWebHook

  • 手动部署: Vue项目完成后,执行npm run build,然后将生成的dist目录下的文件放到web目录下

WebHooks自动化部署,流程如下:

  • 配置GiteaWebHook通知(也可以用码云GithubGitLabgogs,带WebHook功能就行)
  • 当我们push到仓库时,Gitea会主动发送一个通知到我们的服务器,然后服务器接到通知执行我们部署的脚本,开始自动化构建。

# 配置接收通知

必备环境

  • 以下命令视自己的环境而执行
# git
yum install -y git
# node 由于nodejs自带npm所以就不需要手动安装了
yum install -y nodejs
# vue-cli
npm install -g @vue/cli

# 宝塔面板

  • 设置宝塔WebHook插件

  • 宝塔WebHook获取url

  • param参数需要和脚本里对应起来,我这里写的是pull

http://服务器ip:8888/hook?access_key=5C84B7A5UeXYalfNL6WEpi3jdmmxhFlk3jpvEw02BMo84Ak3&param=pull

# netcat命令

  • 实现监听端口->响应请求->执行脚本部署

  • 一直监听 9999 端口,有请求就响应echo的内容,并执行指定脚本

echo -e "HTTP/1.1 200 ok,glass\r\nConnection: close\r\n\r" |  nc -l 0.0.0.0 9999 ; sh /home/update.sh >> /home/logs/webhook.log 2>&1

通过 systemd,可以将这个脚本管理起来,让它永远重启,这样一次部署之后,马上就可以重新监听,等待下一次部署命令。注意要添加 StartLimitInterval ,限制一下执行的频率。

  • 最终的systemd service如下
[Unit]
Description=Autopull through webhook
After=network.target
 
[Service]
User=admin
Type=simple
ExecStart=/bin/bash -xc 'echo -e "HTTP/1.1 200 ok,glass\r\nConnection: close\r\n\r" |  nc -l 0.0.0.0 9999 ; sh /home/deploy/update.sh >> /home/logs/webhook.log 2>&1'
Restart=always
StartLimitInterval=1min
StartLimitBurst=60
 
[Install]
WantedBy=multi-user.target

这样就可以实现每次向 master push 代码,自动测试成功并且马上推送到测试环境中。 update.sh 脚本的最后可以加一个 Curl 命令向钉钉或者 slack 发送提醒。

# 配置WebHook

# 添加接收通知url

# 测试推送

# 安装最新版

  • 方式一
yum install -y http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
# 或者
wget http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
rpm -ivh wandisco-git-release-7-2.noarch.rpm
curl https://setup.ius.io | sh
# 或者
yum install -y epel-release  
rpm -ivh https://centos7.iuscommunity.org/ius-release.rpm
# 查看git包版本
yum list git2u
# 安装
yum -y install git2u

# 常见问题处理

# 项目过大clone报错

  • 由于提交了比较大的文件,在服务端一直无法拉下来,错误如下
Cloning into 'E:\soft'...
POST git-upload-pack (175 bytes)
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
fatal: early EOF
fatal: the remote end hung up unexpectedly
fatal: index-pack failed
  • 执行命令
# 修改压缩的程度
git config --global core.compression 0

# 解决内存不够问题
git config --global pack.deltaCacheSize 2047m
git config --global pack.packSizeLimit 2047m
git config --global pack.windowMemory 2047m
git config --global core.packedGitWindowSize 512m
git config --global core.packedGitLimit 512m

# 调整缓存大小(单位为字节)为1G
git config --global http.postBuffer 1073741824

# 最低速度限制
git config --global http.lowSpeedLimit 0
# 最低速度时间
git config --global http.lowSpeedTime 999999

compression 是压缩的意思,从 clone 的终端输出就知道,服务器会压缩目标文件,然后传输到客户端,客户端再解压。 取值为 [-1, 9],-1 以 zlib 为默认压缩库,0 表示不进行压缩,1..9 是压缩速度与最终获得文件大小的不同程度的权衡, 数字越大,压缩越慢,当然得到的文件会越小。

# 提交本地文件失败

在github远程创建仓库后, 利用gitbash进行提交本地文件的时候出现如下错误

[root@foundation38 demo]# git push -u origin master
Username for 'https://github.com': bajins
Password for 'https://bajins@github.com': 
To https://github.com/bajins/test.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://github.com/bajins/test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
  • 第一种:进行push前先将远程仓库pull到本地仓库
# git pull --rebase origin master
git pull origin master
git push -u origin master

  • 第二种:强制push本地仓库到远程
git push -u origin master -f
  • 第三种:避开解决冲突, 将本地文件暂时提交到远程新建的分支中
git branch [name]
# 创建完branch后, 再进行push
git push -u origin [name] 

# 远端与本地代码冲突

  • 先将本地修改存储起来
# 暂存修改,这样本地的所有修改就都被暂时存储起来
git stash
# 看到保存的信息,其中stash@{0}就是刚才保存的标记。
git stash list
  • 暂存了本地修改之后,pull内容

  • 还原暂存的内容

git stash popstash@{0}
  • 系统提示如下类似的信息
Auto-mergingc/environ.c
CONFLICT(content): Merge conflict in c/environ.c

意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。

  • 解决文件中冲突的的部分

打开冲突的文件,其中Updatedupstream=====之间的内容就是pull下来的内容,====stashed changes之间的 内容就是本地修改的内容。碰到这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容。

# SSL验证错误

报错 unable to access 'https://github.com/': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443

  • 关闭SSL验证
env GIT_SSL_NO_VERIFY=true
# 或者
git config --global http.sslVerify false
  • 去掉代理
git config --global --unset http.proxy

# push错误

The following untracked working tree files would be overwritten by merge/checkout

  • git clean -d -fx
    • -n 显示将要删除的文件和目录;
    • -x 删除忽略文件已经对git来说不识别的文件
    • -d 删除未被添加到git的路径中的文件
    • -f 强制运行

fatal: refusing to merge unrelated histories

  • git pull origin master --allow-unrelated-histories 可以允许不相关历史提,强制合并