使用git svn dcommit不进行变基操作

6
我们公司使用(并支持!)SVN,但我更喜欢使用git。我想尝试的是拥有git存储库-每个项目一个,项目开发人员将能够从此存储库拉取(当然也可以相互拉取)。但我仍然希望将所有更改推送到SVN,因为我们的技术支持正在维护SVN。
我正在测试以下存储库方案:
1. SVN存储库-这个由我们公司维护,我们的团队应该在某个时候将所有更改推送到此处。 2. git-svn克隆-这是从上面的SVN克隆的git存储库-所有项目开发人员都应该将他们的提交推送到这里。 3. git-dev-clone-这是开发人员的git存储库。
我注意到直接使用“git svn rebase”和“git svn dcommit”的唯一问题是,在每次从开发人员的git存储库推送到git-svn-clone存储库后,我必须立即重新基于开发人员的存储库,以便更改传播到SVN并被重新基于。我想要实现的是避免每次推送后重新基础。
请注意,我假设每个项目开发人员只使用git存储库,没有人会直接使用SVN。
我能够通过在每次推送后逐个检出“git-svn-clone”存储库中的每个git提交并使用SVN客户端将这些更改提交到SVN来手动实现此行为。我相信“git svn dcommit”也会这样做,但它还会从SVN同步回来并更改提交SHA标识符,这迫使我重新基于。
附注:对于“git svn dcommit”的“--no-rebase”选项没有帮助,因为在第一个提交传播到SVN后,“git svn dcommit”不允许我提交更多的更改到SVN,直到先前的更改被重新基于。我尝试过这种行为,可能会忽略一些东西。
2个回答

7
事实上,情况比这还要糟糕...即使您已经修改了dcommit以避免尝试rebase,它也会更改上传到SVN的提交(添加git-svn-id行,更改作者信息等)。
基本上,git-svn无法在不进行rebase的情况下从SVN同步回来。正在开发一种新的git <-> SVN接口,可能会消除这种限制,但目前还没有准备好。
恐怕,如果您想与SVN存储库保持同步,现在就需要进行rebase。

关于“无法从SVN同步而不进行rebase”的问题。我不需要从SVN同步回来,我只需要将代码同步到SVN即可。 - Snowbear
在这种情况下,您仍然需要对git-svn进行相当广泛的hackery,因为它在许多事情上使用提交对象中的信息,并且在dcommit期间重写它们。 - Jan Krüger
谢谢,Jan。我也明白即使解决了这个问题,由于其他问题,我也不能以可接受的方式做我想做的事情。我可能会开始考虑在我们公司安装Git,这样它就可以在没有SVN的情况下使用。无论如何,感谢您的回答。 - Snowbear

0
这个回答暗示使用--no-metadata选项会从提交消息中删除svn信息。这可能会使dcommit使用相同的提交,但我还没有验证过。
举个例子,如果我从本地文件URL初始化一个git svn仓库,然后从https: URL拉取,那么仓库中的每个提交都会重复,因为所有带有git-svn-id: file:///...的提交都会被获取为git-svn-id: https:///...并使用新的SHA1编码。
如果我指定了--no-metadata选项,那么提交消息和这个SHA1将会是相同的,我可以从本地文件系统或子版本服务器获取,因为在git仓库中只会有一个给定svn提交的副本。
你可能还需要使用--authors-file选项来确保git和svn的用户名完全匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接