之前使用Github,感觉国内速度很慢,就想国内的Git服务器,推荐了使用oschina
1. 安装 git 工具 git bash 点击这里下载
具体安装步骤不说了 ,安装的时候选择 git bash
1.1安装好后, 在开始菜单中启动 git bash
1.2 使用ssh-keygen 工具生成公钥(public key)
ssh-kengen -t rsa -C "公钥key" 这里的key就是 注册oschina的邮箱. 执行时 3个回车
生成公钥在 当前路径的 .ssh文件夹中
公钥的(value) 就是 id_rsa.pub 里面的内容
查看生成的公钥,并将公钥内容拷贝添加到 http://git.oschina.net/keys 公钥管理里面
1.3 查看配置是否成功
ssh -T git@gitee.com
Enter passphrase for key '/Users/hualongwu/.ssh/id_rsa':
Hi starx(@cnstarxs)! You've successfully authenticated, but GITEE.COM does not provide shell access.
1.4 配置本地用户和邮箱
用户名邮箱作用 : 我们需要设置一个用户名 和 邮箱, 这是用来上传本地仓库到GitHub中, 在GitHub中显示代码上传者;
使用命令 :
git config --global user.name "finder" //设置用户名
git config --global user.email "xx@163.com" //设置邮箱
至此 git客户端已经安装和配置完成了,可以从gitee上传下载了。
2. 使用 TortoiseGit GUI工具上传下载代码
1. 在 oschina 上新建项目 prj01
2. 把本地的项目导入prj01
右键项目文件夹 =》Git create repository here => Git add => git commit => git push (会先提示git pull)
在进行pull 出现错误: fatal: refusing to merge unrelated histories
这时 打开 git bash 进入到 此 repo中
执行 $ git pull origin master --allow-unrelated-histories
注意 要加 --allow-unrelated-histories 参数
因为 我是把之前的本地仓库导入到 oschina上新建的仓库 ,所以2个仓库不同 需要先 pull ,把亮哥不同项目合并
3. 下载OSCHINA上项目 本地存在此项目非空目录 关联项目问题
解决的办法是:
1. 进入非空目录,假设是 /workdir/proj1
2. git clone --no-checkout https://git.oschina.net/NextApp/platform.git tmp
3. mv tmp/.git . #将 tmp 目录下的 .git 目录移到当前目录
4. rmdir tmp
5. git reset --hard HEAD
就可以了
项目中使用私有库
1. git 公钥加入到 git 服务器
1.1 将 ssh 转化 http 请求
git config --global url.git@gitee.com:.insteadOf https://gitee.com/
2. 支持代理,和直接拉代码
go env -w GOPROXY=https://goproxy.io,direct
3. 通过 GOPRIVATE 控制私有库不走代理
go env -w GOPRIVATE=*.gitlab.com,gitee.com,git.xingkonglian.com
go env #查看所有变了
4. 其他
如果在运行go mod vendor时,提示Get https://sum.golang.org/lookup/xxxxxx: dial tcp 216.58.200.49:443: i/o timeout,则是因为Go 1.13设置了默认的GOSUMDB=sum.golang.org,这个网站是被墙了的,用于验证包的有效性,可以通过如下命令关闭:
goenv-w GOSUMDB=off
私有仓库自动忽略验证
可以设置 GOSUMDB="sum.golang.google.cn", 这个是专门为国内提供的sum 验证服务。
goenv-w GOSUMDB="sum.golang.google.cn"goenv-w GOSUMDB="sum.golang.org"
-w 标记 要求一个或多个形式为 NAME=VALUE 的参数, 并且覆盖默认的设置
苹果电脑需要加一步:
$ ssh-keygen -p. 设置密码 第一次输入 ,其他直接回车 就可以正常拉代码了
私有库解决方案3 TOKEN
第一步,你需要获取到私有的 token,它位于:
https://gitlab.mycompany.com/profile/account
第二步,配置你的 git,加入你的私有 token:
$ git config --global http.extraheader "PRIVATE-TOKEN: YOUR_PRIVATE_TOKEN
第三步,将 ssh 转化 http 请求,如下:
$ git config --global url."git@gitlab.mycompany.com:".insteadOf "https://gitlab.mycompany.com/"
````
最后,使用你的 go get 吧!
才找到真正的原因,公司网络比较缓慢情况下,就断开了
git config --global http.lowSpeedLimit 0
git config --global http.lowSpeedTime 999999
增加最低速度时间,总算把代码克隆下来了。
ecs+NFS
不行: 至少2H4G
go加载依赖私有库20250306
meta tag 192.168.61.10/starxs/alipay did not match import path git.xingkonglian.com/starxs/alipay
个问题是因为 Go Get 在解析
git.xingkonglian.com/starxs/alipay
时,实际上是被转发到192.168.61.10/starxs/alipay
,但是 Go Get 并不知道这个转发关系,所以它会认为git.xingkonglian.com/starxs/alipay
和192.168.61.10/starxs/alipay
是两个不同的仓库。
为了解决这个问题,您可以在 Nginx 的反向代理配置中添加一个
go-get
头部,指定 Go Get 的仓库地址
有2中协议方式, http|https或者ssh
https 更方便一些
https
对于 gitee.com
go env -w GOPRIVATE=gitee.com
go env -w GOINSECURE=
以上即可ok
低于 内网的gitlab
go env -w GOPRIVATE=*.gitlab.com,gitee.com,git.xingkonglian.com,192.168.61.10
go env -w GOINSECURE=git.xingkonglian.com,192.168.61.10
go env -w GOPROXY=https://git.xingkonglian.com,http://192.168.61.10:80,https://goproxy.cn
# 以上3个命令后还是不行
add_header go-get /starxs/alipay https://git.xingkonglian.com/starxs/alipay;
ssh
ssh 必须要把 public添加到gitlab; 同一个 ssh public 可以用于多个git服务器上.
创建ssh密钥
ssh-keygen -t rsa -b 4096 -C "1717216@example.com"
测试到服务器是否通
ssh -T git@gitee.com
Enter passphrase for key '/Users/hualongwu/.ssh/id_rsa':
Hi starx(@cnstarxs)! You've successfully authenticated, but GITEE.COM does not provide shell access.
Ip 可以拉的env配置
这个 可以拉: go get -v 192.168.61.10/starxs/alipay
go env
GO111MODULE='on'
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/hualongwu/Library/Caches/go-build'
GOENV='/Users/hualongwu/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE='git.xingkonglian.com,192.168.61.10'
GOMODCACHE='/Users/hualongwu/disk/install/GoPath/pkg/mod'
GONOPROXY='*.gitlab.com,gitee.com,git.xingkonglian.com,192.168.61.10'
GONOSUMDB='*.gitlab.com,gitee.com,git.xingkonglian.com,192.168.61.10'
GOOS='darwin'
GOPATH='/Users/hualongwu/disk/install/GoPath'
GOPRIVATE='*.gitlab.com,gitee.com,git.xingkonglian.com,192.168.61.10'
GOPROXY='https://git.xingkonglian.com,https://goproxy.cn,http://192.168.61.10:80'
GOROOT='/usr/local/go'
GOSUMDB='off'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.21.0'
GCCGO='gccgo'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/hualongwu/disk/study/ws/gows/law/law-api/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/zb/0rf30z5x3gj201njj08qh3g80000gn/T/go-build991485461=/tmp/go-build -gno-record-gcc-switches -fno-common'
docker中accessTokens拉取私有git仓库
背景
当需要git clone拉取私有库时,传统的做法为将本机的ssh配置到gitlab中。但在docker中执行程序时需要拉取私有库,此时无法为每个docker容器配置ssh。网上的一种方案为,将配置好的ssh同步到docker容器中,覆盖其中的ssh秘钥等,但在尝试过程中,发现了问题,ssh秘钥需要验证是否被盗用(可能有解决办法),因此我尝试换种方案。
解决办法
使用gitlab中的accessTokens。
1、登录到GitLab.
2、点击右上角的头像,然后选择设置 .
3、在" 用户设置"菜单上,选择" 访问令牌" .
4、选择令牌的名称和可选的到期日期.
5、选择所需的范围 .
6、单击创建个人访问令牌按钮.
7、将个人访问令牌保存在安全的地方. 离开或刷新页面后,将无法再次访问它.
从而在docker容器中可以通过如下方式使用:
使用 username + accessToken 的方式克隆项目 但是 这个方式 拉取不下来
git clone https://$accessUserName:$accessToken@gitlab.com/.../xxx.git
https://starxs:1f93bf90070e2f1d5b31eb3f02d16@gitee.com/starxs/cps-data-api.git
accessToken拉取仓库时通常使用的是https协议,但我们的脚本程序中有较多的拉取使用的git协议,为了统一处理,使用git config --global --add url."".insteadOf“”方式处理,如下所示:
export accessUserName="......."
export accessToken="........"
git config --global --add url."https://$accessUserName:$accessToken@gitlab.com/".insteadOf "git@gitlab.com/"
git config --global --add url."https://$accessUserName:$accessToken@gitlab.com/".insteadOf "git@gitlab.com:"
git config --global --add url."https://$accessUserName:$accessToken@gitlab.com/".insteadOf "https://gitlab.com/"
git config --global --add url."https://$accessUserName:$accessToken@gitlab.com/".insteadOf "https://gitlab.com:"
可以使用 oauth2 + accessToken 的方式克隆项目.
gitee oauth2方式拉取成功
https://oauth2:1f93bf90070e2f1d5b31eb3f0@gitee.com/starxs/cps-data-api.git
在开发中,通常会保持两个分支master分支和develop分支,但是如果因为develop上面迭代太多而没有及时维护master,最后想丢弃master而直接将测试确认过的develop强推到master,该怎么操作呢?
1.切换到develop分支下,并保证本地已经同步了远端develop的最新代码
-
git checkout develop
-
git pull
2.把本地的develop分支强制(-f)推送到远端master。
git push origin develop:master -f
3.切换到旧分支master
git checkout master
4.下载远程仓库最新内容,不做合并。
git fetch --all
5.把HEAD指向master最新版本。
git reset --hard origin/master