我们将 Git 与 Gerrit 一起使用,并使用 commit hook 为 Gerrit 生成更改 id。现在的问题是,当择优提交时,不会触发提交挂钩,因此不同分支中的不同提交可能存在相同的更改 ID。有什么快速的方法可以让更改 ID 在挑选过程中重新生成吗?
谢谢。
我已经启动了 gerrit 服务器。当我尝试 ssh 到它时,我得到:
Unable to negotiate with 127.0.0.1 port 29418: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
Run Code Online (Sandbox Code Playgroud)
由于此功能已被弃用,因此需要手动启用(http://www.openssh.com/legacy.html):
ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 username@localhost -p 29418
Run Code Online (Sandbox Code Playgroud)
这很好用。现在我想要git clone,但需要KexAlgorithms通过 git 将选项传递给 ssh。一种解决方案是将选项添加到~/.ssh/config. 这是我添加的:
Host localhost
KeyAlgorithms +diffie-hellman-group1-sha1
Run Code Online (Sandbox Code Playgroud)
问题是我收到以下错误:
/home/username/.ssh/config: line 6: Bad configuration option: keyalgorithms
Run Code Online (Sandbox Code Playgroud)
有一个HostKeyAlgorithms选项可以在那里工作,但会抱怨Bad key types '+diffie-hellman-group1-sha1'。我应该如何配置git/ssh连接到gerrit?
所以我想要做的是:将 url,例如 ( https://gerrit-server/#/c/7456/ ) 添加到 gerrit 上出现的提交消息中。
到目前为止,我尝试过的是创建一个文件patchset-created,gerrit_site/hooks/当我推送更改时会启动它。
问题是我找不到提交消息文件,所以我可以修改它的内容。
我想,因为我试图将 url 插入到提交消息中,所以我无法通过在本地 git 存储库上使用钩子来做到这一点,因为无法知道它将在 gerrit 上关联到哪个 url,所以我认为可以通过在gerrit一侧使用钩子来完成。
将不胜感激任何反馈。
我当前正在使用以下 Git diff 命令来获取文件更改列表。我想排除某些文件夹(例如datafiles)和文件(.DSstore)。有没有办法做到这一点?
git diff --no-index /Users/USERNAME/Documents/FWintegration/ingo2/ukon_4355c1 /Users/USERNAME/Documents/FWintegration/ingo2mirror/ingo2mirror
Run Code Online (Sandbox Code Playgroud) 我对 gerrit 进行了更改,该更改经过代码审查并在 7 次修订后获得批准。但是,现在它无法合并,并且由于合并冲突,尝试在 gerrit 网站中重新设置基准不起作用。如何解决此合并冲突并合并相同的已批准更改而不是创建新更改。(从克隆回购的完整步骤将不胜感激。)
我们有一个被多个用户使用的服务器。磁盘空间是一个很大的限制,因为我们的 git repo 非常大,每次有人克隆它时,它都会消耗 130G 的空间。
我知道 git 不是设计为集中式工作流,但这是一种非常特殊的情况。我们考虑过升级硬件,但这是一条很长的路,因为它不是云实例。
我试着摆弄,git worktree但很快就遇到了权限问题。我的理想设置是一个单一的存储库,多个用户可以通过它推送和拉取。
我查看了以前的线程,但不幸的是那里没有可靠的建议,而且它们是很旧的线程。因此,任何新的建议将不胜感激。
使用Gerrit很容易将不稳定的代码从develop分支合并到stable分支中:
$ git checkout develop
$ commit
$ git push origin HEAD:refs/for/stable
在Gerrit中,提议的更改来自开发分支并且要合并到稳定分支中并不是很清楚.有没有办法防止这种合并发生,无论是在git还是在Gerrit?
更新: 现在我们使用自定义命令推送到gerrit,它找到它所基于的最后一个分支,并且只允许推送到该分支.
在与Gerrit合作时,预期的push是:
git push origin HEAD:refs/for/branch
Run Code Online (Sandbox Code Playgroud)
但是一些坏人似乎以一种简单的方式做到了这一点(他们从一些Git手册中学到了):
git push origin
Run Code Online (Sandbox Code Playgroud)
要么
git push
Run Code Online (Sandbox Code Playgroud)
这些操作会导致严重的问题:
git log找不到它们.有没有办法push在Gerrit设置中禁用这些操作?或者在客户端禁用它?
似乎很多人已经git clone用组合替换了git init && git fetch.这看起来相当愚蠢,不幸的是像詹金斯这样的工具不会为你做那件事.那么为什么git clone不采用refspec,就像git fetch一样呢?
具体来说,如果您希望在Jenkins上运行gerrit触发的构建任务,则需要确保工作区存在,否则jenkins将无法签出包含gerrit更改的修订.这是因为gerrit使用的ref路径不属于git clone提取的路径.
推动对Gerrit的更改需要相当深奥的命令
git push origin HEAD:refs/for/branchname
我们编写了这个脚本,但我正在寻找一种本地化的方法.使用git强大的配置,看起来我可以预先配置它的大部分[1],这样就git push足够了......差不多.我坚持参考remote.<name>.pushrefspec.
我已经可以创建一个跟踪主题分支,以便git pull(没有其他参数)将更改从上游远程转移到我的主题分支.但是对于Gerrit,push和fetch引用refspecs是不一样的:一个从中获取(合并)refs/heads/trackbranch,但是一个推送到refs/for/trackbranch[2]
我可以配置pushrefspec remote.<name>.push,但语法非常基本:如果我放
push = refs/heads/*:refs/for/*
然后,这将尝试推动我的t-foo主题分支refs/for/t-foo.但是git有t-foo跟踪的信息trackbranch.我可以定义一个refspec,以便git自动尝试将任何内容推t-foo送到它refs/for/trackbranch吗?
我们目前正在使用脚本来执行此操作,我想我可以为每个主题分支定义推送refspec(可能通过更多脚本).我希望有一种本地的git方式,这样我们就不需要为我们的团队依赖更多的自定义内部脚本了.
[1]通过git checkout origin/upstream_branch -b topic_branch在现有分支中定义跟踪分支git branch --set-upstream-to origin/upstream_branch
[2]推动refs/for/*创建变更集以供审核.有了适当的权限,人们可以推动refs/heads/*绕过审查,但这否定了Gerrit的大部分观点.