git 子树与 Gerrit 兼容吗?
Is git subtree compatible with Gerrit?
我们的 git 存储库托管在 Gerrit 中。一位同事维护着 2 个存储库 main
和 sub
。他想将 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
.
目前我们想到的解决方法:
使用 Google 的 REPO 工具来管理 2 个 repos,就像 AOSP 所做的那样,这需要额外的技能并且有点矫枉过正。
用git submodule
比较麻烦
将本地传输 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
我们的 git 存储库托管在 Gerrit 中。一位同事维护着 2 个存储库 main
和 sub
。他想将 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
.
目前我们想到的解决方法:
使用 Google 的 REPO 工具来管理 2 个 repos,就像 AOSP 所做的那样,这需要额外的技能并且有点矫枉过正。
用
git submodule
比较麻烦将本地传输
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