git 子树与 Gerrit 兼容吗?

Is git subtree compatible with Gerrit?

我们的 git 存储库托管在 Gerrit 中。一位同事维护着 2 个存储库 mainsub。他想将 sub 包含在 main 中作为子树。到目前为止,这是我们尝试过的:

git clone repo_url_main -b dev main
cd main
git subtree add -P foo/bar repo_url_sub master
touch foo/bar/baz.txt
git add .
git commit -m 'foo.bar.baz.tt'
git subtree push -P foo/bar repo_url_sub master

第一个问题是git subtree push失败,因为他的账号没有权限不经审核直接push commits。评论就是他想要的。

对于非子树存储库,我们使用 git push origin HEAD:refs/for/master 创建审查更改。所以我们尝试 git subtree push -P foo/bar repo_url_sub master:refs/for/master 但它也失败了。 Git 抱怨 master:refs/for/master 不是有效的引用。我在手册中找到 git subtree push -P <prefix> <repository> <ref> 。最后一部分是 ref 而不是 refspec。所以master:refs/for/master在这里不是预期的。

然后我们尝试 git subtree push -P foo/bar repo_url_sub refs/for/master。推送成功,但结果不是预期的。创建了分支 refs/for/master 而不是审查更改。经过几次尝试,我们发现无论最后一个 ref 是什么,它总是扩展到 refs/heads/...。甚至 refs/heads/master 也扩展为 refs/heads/refs/heads/master.

目前我们想到的解决方法:

  1. 使用 Google 的 REPO 工具来管理 2 个 repos,就像 AOSP 所做的那样,这需要额外的技能并且有点矫枉过正。

  2. git submodule比较麻烦

  3. 将本地传输 sub 存储库作为子树包含在 main 中。首先 git subtree push 更新 transfer repo 中的 master,然后在 transfer repo 中使用 git push repo_url_sub HEAD:refs/for/master 创建审核更改。但是我们可以预见当许多维护者参与进来时会出现混乱。

是否有任何 git 选项或配置可以指示 git subtree push 在 Gerrit 中正确创建审查更改?感谢您的任何想法。

根据"git help subtree":

push

Does a split using the supplied and then does a git push to push the result to the repository and ref

所以我认为您可以先执行 "git subtree split",然后执行 "git push",例如:

git subtree split --prefix=foo/bar -b split
git push repo_url_sub split:refs/for/master