Git LFS + Gerrit 配置+lfs-test-server(git lfs push总是提示输入https密码解决)

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

lfs插件下载地址:wget https://archive-ci.gerritforge.com/view/Plugins-stable-3.9/job/plugin-lfs-bazel-stable-3.9/builds/2/archive/bazel-bin/plugins/lfs/lfs.jar

直接复制到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服务器了,不能访问这个服务器也不能正常下载文件。

相关推荐
半夏微凉半夏殇5 小时前
git add . 是否会包含.o、.so、.ko文件?深度解析与避坑指南
git
牟同學5 小时前
Git 实战场景操作大全(可直接落地)
git
不做无法实现的梦~6 小时前
使用ros2跑mid360的fastlio2建图
git·单片机·嵌入式硬件·gitcode
长沙红胖子Qt8 小时前
SVN培训笔记(二):使用sourceTree通过git桥接管理svn项目
git·svn·sourcetree·sourcetree管理svn
半夏微凉半夏殇10 小时前
从多仓库到单仓库:如何高效迁移并统一管理多个Git项目
git
__万波__10 小时前
解决警告“..LF will be replaced by CRLF the next time Git touches it“
git
Software攻城狮11 小时前
git报错处理
git
明洞日记11 小时前
【软考每日一练015】计算机网络:DNS 递归查询与迭代查询解析
git·计算机网络·github
安河桥畔12 小时前
Git使用
大数据·git·elasticsearch