解决commit change-id丢失无法上传

633 阅读4分钟

现象描述

可以用ssh方式拉项目,也可以pull代码,到push代码时,报错:

很明显,看报错行ERROR:commit缺少change-Id。这是我们push代码时由于commit-msg hook有问题

解决过程

前置条件:

  1. 你git的config配置的email和name跟代码仓库绑定的email和name是一样的。如果不是,可以通过以下命令配置一下

     git config --global user.name "Your Name"
     git config --global user.email "Your email"
    
  2. 如果你只想对当前项目做特殊的设置,可以执行下面两行代码

     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

解释:

  1. xxxxx@gerrit.cloudexplor.cn:表示连接的代码仓库
  2. 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命令不生效

解决:网上查一下对应仓库建议的命令