现象描述
可以用ssh方式拉项目,也可以pull代码,到push代码时,报错:
很明显,看报错行ERROR:commit缺少change-Id。这是我们push代码时由于commit-msg hook有问题
解决过程
前置条件:
-
你git的config配置的email和name跟代码仓库绑定的email和name是一样的。如果不是,可以通过以下命令配置一下
git config --global user.name "Your Name" git config --global user.email "Your email" -
如果你只想对当前项目做特殊的设置,可以执行下面两行代码
git config user.name "Your Name" git config user.email "fengyd@cloudglab.com"
报错原因:项目git 脚本中 commit-msg的这个脚本有问题,而这第一行命令的意思就是 下载commit-msg hook
按照报错之后的建议,依次执行这三行代码:
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 xxxxx@gerrit.cloudexplor.cn:hooks/commit-msg ${gitdir}/hooks/
chmod +x .git/hooks/commit-msg (给hook加上可执行权限)
git commit --amend
解释:
- xxxxx@gerrit.cloudexplor.cn:表示连接的代码仓库
- git commit --amend:表示修改一下commit,直接保存退出,hook会自动给commit加上change-Id
步骤1
执行第一个命令
一般正常是直接下载成功,但是我执行之后,不出意外的话,报错了hhhh:
没关系,接下来我们继续解决报错。如果大家这步很顺利,直接到步骤2
步骤 1.1
分析一下原因:我们下载这个hook,首先要先连接上git,但是连接失败了,所以报错。想到我这个仓库是Gerrit仓库,试试Gerrit推荐的下载命令
curl -o .git/hooks/commit-msg <https://gerrit.cloudexplor.cn/tools/hooks/commit-msg>
然后又报这个错:
如果HTTPS不支持,试试HTTP的命令
curl -I gerrit.cloudexplor.cn
步骤 1.2
我们的连接还是被拒绝了。那我们换个思路,我们先单独连接一下,看下是什么原因拒绝我们的连接,执行以下命令
ssh -p 29418 fengyd@gerrit.cloudexplor.cn
报错:我的新电脑不支持Gerrit服务端要求的老旧加密算法
Unable to negotiate with 172.20.20.240 port 29418: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
步骤 1.3
知道原因是算法不兼容的原因,那我们就配置一下让它兼容:修改git config配置
怎么找到这个配置?
cat ~/.ssh/config
把以下配置复制到你自己的config中,不要一股脑cv哦,对于清楚自己的host\hostName\User\IdentityFile
Host gerrit.cloudexplor.cn
HostName xxxxx
Port 29418
User xxxx
IdentityFile ~/.ssh/id_rsa
KexAlgorithms +diffie-hellman-group1-sha1
HostKeyAlgorithms +ssh-rsa
也可以cv最后两行,在你自己的配置末尾加上
步骤 1.4
再次测试连接后,发现需要输入私钥的密码。当然我肯定忘记了,最后最粗暴有效的做法就是重新在生成一个公钥,在上传到Gerrit
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
再提示设置passphrase,如果怕忘记,可以不设置,直接按回车就行了
生成之后,查看公钥
cat ~/.ssh/id_rsa.pub
接着把公钥复制到Gerrit上,再执行一下连接
ssh -p 29418 fengyd@gerrit.cloudexplor.cn
连接成功后,再次执行步骤1,下载成功
步骤2
执行
chmod +x .git/hooks/commit-msg (给hook加上可执行权限)
git commit --amen
执行git commit --amen时,不用做任何操作,直接关闭就可以了
然后git log看下change-Id的那条commit是不是已经加上了change-Id。到这里我们就解决了,后面就是正常提交就可以了
总结
commit缺少change-Id,通常原因是commit-msg这个hook有问题,我们只要重新下载commit-msg,再编辑一下commit,hook就会自动加上change-Id。
在下载commit-msg hook的过程中,有可能会出现的问题:
问题一:连接不上ssh
解决:检查一下当前项目的git配置
邮箱、名称和仓库上的一致
公钥路径和本地存放公钥的路径一致
兼容新老加密算法
问题二:需要验证私钥密码,但是忘记了?
解决:最直接效率的方式是,直接重新生成一个新的公钥,再到仓库上删除替换
问题三:下载hook命令不生效
解决:网上查一下对应仓库建议的命令