reference
一些编译的二进制文件,导致仓库很大,所以采用lfs管理,根据网上搜到的教程,发现配置完不能用,最终搞定后,记录一下。
大致流程:
1,Gerrit安装lfs插件;
2,Gerrit安装lfs-test-server 服务(因为用的是htpasswd生成的Gerrit账号密码,Gerrit lfs插件本身的http服务器无法使用,得再搭一个);
3,本地install git-lfs;
4,下载仓库,仓库lfs 初始化;
5,仓库配置.lfsconfig指定lfs server地址;
6,提交文件
Gerrit 安装lfs插件
使用的Gerrit版本:3.9.9
直接复制到Gerrit的部署地址目录:review_site/plugins/lfs.jar 不用修改权限,默认的即可
查看Gerrit的error_log,会显示自动加载这个插件;
修改gerrit的config:review_site/etc/gerrit.config
加上以下信息:

很多教程让再加一个etc/lfs.config,如果是另外搭的lfs服务,就不用加,只在etc/gerrit.config加上lfs.plugin=lfs即可。
重启Gerrit: review_site/bin/gerrit.sh restart
Gerrit web端,可以看到已经有了lfs插件

至此,Gerrit的配置就完成了。
lfs-test-server搭建
背景
为啥要另外搭建lfs 管理服务器,也是折腾了很久,根据gerrit lfs的插件文档,lfs默认是http协议的,用来传输文件,如果代码是通过ssh下载的,那么lfs的服务必须是http的。也找了很多将http转成ssh认证的法子,都失败,push的时候,都会出来gerrit https(我司加了ssl证书,如果没加,会出来http)的地址,让输入username和password,但是不管是htpasswd的账号密码,还是Gerrit 设置里面的http密码,都不行,查了下,说是htpasswd生成的密码实际是nginx的,Gerrit是无法直接访问的。有朋友公司是接入的ldap认证的账号密码,日常代码上传和下载也都是用的http,没有ssh,所以没有这个问题,lfs插件安装完直接可用。
但是对于只有htpasswd认证的Gerrit,就需要另外搭建lfs服务,否则文件无法推送。


https://github.com/git-lfs/git-lfs/blob/main/docs/api/authentication.md
git-lfs 也给了ssh认证的方式,试了下,也不行,按照操作会提示没有git-lfs-authenticate not found。
提交失败如下所示:


搭建
好了,交代完背景,现在开始搭建。用这个是因为是现成的小型的,对于小团队开发完全够用。如果开发人员比较多,且公司有商用版的jfrog,那更方便,直接在jfrog上创建一个gitlfs的仓库即可,权限改成匿名可读写,就不用再搭建这个lfs-test-server服务了。我司有jfrog,但是是开源版,不支持创建gitlfs类型的仓库,创建普通的,权限也不能配置匿名可读写,得商用版。。。
lfs-test-server这个试了下,得搭建在Gerrit所在的服务器上,搭建在其他的服务器上,也push不了。
源码地址:https://github.com/git-lfs/lfs-test-server
可以下载源码安装,也可以go直接安装。我是通过go直接安装的。
1, go 安装:
通过apt install安装的,默认的版本比较低,直接通过源码安装一个高点的版本。
bash
wget https://go.dev/dl/go1.22.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.22.4.linux-amd64.tar.gz
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc
go version
会显示:go version go1.22.4 linux/amd64
2, lfs-test-server安装
bash
gerrit@gerrit-server:/review_site$ go env -w GOPROXY=https://goproxy.io,direct
gerrit@gerrit-server:/review_site$ go install github.com/github/lfs-test-server@latest
go: downloading github.com/github/lfs-test-server v0.4.0
go: finding module for package github.com/gorilla/mux
go: finding module for package github.com/gorilla/context
go: finding module for package github.com/GeertJohan/go.rice/embedded
go: finding module for package github.com/GeertJohan/go.rice
go: finding module for package github.com/boltdb/bolt
go: downloading github.com/gorilla/mux v1.8.1
go: downloading github.com/gorilla/context v1.1.2
go: downloading github.com/boltdb/bolt v1.3.1
go: downloading github.com/GeertJohan/go.rice v1.0.3
go: found github.com/GeertJohan/go.rice in github.com/GeertJohan/go.rice v1.0.3
go: found github.com/GeertJohan/go.rice/embedded in github.com/GeertJohan/go.rice v1.0.3
go: found github.com/boltdb/bolt in github.com/boltdb/bolt v1.3.1
go: found github.com/gorilla/context in github.com/gorilla/context v1.1.2
go: found github.com/gorilla/mux in github.com/gorilla/mux v1.8.1
go: downloading github.com/daaku/go.zipexe v1.0.2
这个安装完,lfs-test-server这个可执行的文件,不在当前目录,在go的安装目录:/home/gerrit/go/bin/lfs-test-server
在Gerrit的review_site目录下新建lfs_server/,然后把/home/gerrit/go/bin/lfs-test-server 拷贝过来即可
进入到lfs_server/目录,vim start.sh:
bash
#!/bin/bash
set -eu
set -o pipefail
LFS_LISTEN="tcp://:9999" #端口自定义,下面HOST的跟这个保持一致,如果启动时显示被占用就换一个
LFS_HOST="gerrit-server:9999" # Gerrit域名:9999,很多教程写的127.0.0.1:9999,但直接写搭建所在的服务器更好使
LFS_CONTENTPATH="/review_site/data/lfs_test_server/" # git 文件上传到哪个目录,我直接在Gerrit底下新建了目录存放
LFS_ADMINUSER="admin" # web端管理后台的登录账号,自定义
LFS_ADMINPASS="admin" # web端管理后台的登录密码,自定义
LFS_PUBLIC=1 # HTTP访问,写成1,下面的CERT和KEY按照示例写,如果是https访问,则不用写此值,SCHME写成https
LFS_CERT="mine.crt"
LFS_KEY="mine.key"
LFS_SCHEME="http"
export LFS_LISTEN LFS_HOST LFS_CONTENTPATH LFS_ADMINUSER LFS_ADMINPASS LFS_CERT LFS_KEY LFS_SCHEME LFS_PUBLIC
./lfs-test-server
保存之后,执行bash start.sh,就会有输出,页面上管理后台访问地址:http://gerrit-server:9999/mgmt

需要放在后台一直执行,我是放在tmux里面。
lfs config仓库配置
很多教程是配置到All-Project仓库的refs/meta/config,如果是另外搭建的lfs server服务,就不用,只在需要lfs管理的仓库里面,.git的同级目录添加一个**.lfsconfig**文件即可,官方及很多教程给的是.git/config上面添加lfs.url=,也不需要这样,这样操作每次clone完仓库需要手动改一下.git/config文件,会很麻烦,否则push的目标地址还是Gerrit lfs本身的服务,然后让输入https的账号密码。

如上配置即可,加到仓库里面,后续该仓管就可以直接使用,无须再配置其他什么。
这样git lfs track等操作完毕,git push后,就会自动推送到搭建的lfs-test-server服务上,Gerrit的目录/review_site/lfs_server/ 目录下就会有目录和文件生成。
git lfs 推送之后就会推送到管理的目录,无须经过Gerrit的change审核,这是git lfs 管理机制的限制。
下载的时候,如果本地安装了git lfs(sudo apt-get install git-lfs),则git clone的时候,git 会自动将仓库里面的指针文件转成原文件下载,并显示文件名称和进度:

如果本地没有安装,则git clone的时候,下载的就是指针文件,下载完毕,进入到仓库目录,执行git lfs init & git lfs pull手动还原文件即可
git clone显示为普通下载,没有Down loading, 进到目录,该文件大小只有4K,head该文件,显示的也是指针内容


发布
lfs管理的仓库,放到manifest xml上,repo 下载时会按照lfs去下载,如果本地没有安装git-lfs,则会报错,git config也可以配置跳过lfs下载,但是下载下来的就是4k的元数据,不是原文件,不能用。
解决:拉单独分支,提交原文件,不要按照lfs提交,xml revisions改成新的分支名。
因为lfs管理的文件已经push到lfs-server服务器了,不能访问这个服务器也不能正常下载文件。