我们公司使用(并且支持!)SVN,但我倾向于使用 git。我想尝试的是拥有 git 存储库 - 每个项目一个,项目开发人员将能够从这个存储库中提取(当然,如果他们愿意的话,也可以互相提取)。但我仍然想将所有更改推送到 SVN,因为 SVN 是由我们的技术支持维护的。
我正在使用以下存储库测试该场景:
我注意到直接使用“git svn rebase”和“git svn dcommit”的唯一问题是,每次从开发人员的 git 存储库推送到 git-svn-clone 存储库后,我必须尽快重新设置开发人员存储库的基址更改将传播到 SVN 并重新设置基础。我想要实现的是避免每次推送后重新定位。
请注意,我假设每个项目开发人员都只会使用 git 存储库,没有人会直接使用 SVN。
我能够在推送后通过在“git-svn-clone”存储库中一一检查每个 git 提交并使用 SVN 客户端将这些更改提交到 SVN 来手动实现此行为。我相信“git svn dcommit”会做同样的事情,但它也会从 SVN 同步回来并更改提交 SHA 标识符,这迫使我重新设置基准。
P.S.:
--no-rebase
的 git svn dcommit
选项没有帮助,因为在第一次提交传播到 SVN 后,git svn dcommit
不允许我向 SVN 提交更多更改,直到前一个被重新设置。我已经尝试过这种行为一次,可能会忽略一些东西。
实际上比这更糟糕... dcommit 会更改上传到 SVN 的提交(添加 git-svn-id 行、更改作者信息等),即使您破解 dcommit 不尝试重新设置基准。
基本上,如果不进行变基,git-svn 就无法从 SVN 同步回来。正在开发一个新的 git<->SVN 界面,可能会消除此限制,但尚未准备就绪。
恐怕如果您想与 SVN 存储库保持同步,如果现在不进行变基,您的场景将无法工作。
这个答案意味着使用
--no-metadata
将从提交消息中删除svn信息。 可能使 dcommit 使用相同的提交,但我尚未验证:
举个例子,如果我从本地 file: URL git svn init 一个存储库,然后从 https: URL 中拉取,则存储库中的每个提交都将被重复,因为所有带有 git-svn-id: file: 的提交都将被重复。 ///... 将作为 git-svn-id: https:///... 获取并使用新的 SHA1 进行编码。
如果我指定 --no-metadata 那么提交消息和这个 sha1 将是相同的,我可以从本地文件系统或 subversion 服务器获取,因为 git 中只会有任何给定 svn 提交的单个副本回购。
--authors-file
以确保 git 和 svn 用户名完全匹配。