我在一家SVN商店工作,但为了在工作中注入一点理智,我使用git-svn。越来越多的同事也看到了光明,现在我们想要在某些情况下完全支持SVN。目前我们每个人都拥有自己的git-svn仓库,但由于差异很大,我们无法真正分享除普通补丁或SVN之外的任何东西。我们应该如何组织我们的回购以便直接共享(通过git-remote)?
我能想到的唯一方法是使用单个共享git-svn repo,我们将其用作SVN的网关,但这可能有点麻烦 - 它会更好如果我们都可以直接从我们自己的git-svn repos推送到SVN。
编辑:不幸的是我没有SVN服务器的管理员权限,所以目前很少使用像 subgit 这样的解决方案,即使它们很有意思
答案 0 :(得分:7)
您可以查看subgit:
SubGit是一个平稳,无压力的Svn到Git迁移的工具。在服务器端安装一次,并根据需要使用Subversion和Git。
SubGit允许用户设置双向Subversion到Git复制(可写镜像)。
和
SubGit是一个从Svn到Git的公司范围迁移的解决方案:
Much better than git-svn (see comparison); Requires no changes of the infrastructure that is already in place; Allows one to use all Git and all Subversion features; Provides genuine stress-free migration experience.
答案 1 :(得分:1)
如果我们都可以直接从我们自己的git-svn repos推送到SVN,那就好了。
不是git svn dcommit
命令的用途吗?
使用git svn rebase
将git clone重新绑定到中央svn repo,然后使用git svn dcommit
将本地提交推送到svn。
我每天都使用git svn GCC git mirror并且效果非常好。也许那是因为有一个中央只读镜像,它会自动从svn提交更新,所以使用git-svn的每个人都可以从git镜像和同一组commit-id看到相同的历史记录。这允许从只读镜像获取和合并,然后只是git svn rebase和git svn dcommit将更改推送到svn repo。然后,这些更改将同步到只读镜像,并由具有相同ID的其他所有人提取。
答案 2 :(得分:1)
两个不同版本控制系统之间的双向网关早于git。大约10年前,我已经在CVS和Arch之间手工完成了这项工作。如果您不想购买subgit,可以手动维护网关,甚至尝试编写脚本。工作流程很简单:
trunk
和master
。 trunk
镜像颠覆,master
加上git $ git svn fetch
master$ git merge trunk
trunk$ git merge master
trunk$ git svn dcommit
master$ git merge trunk
答案 3 :(得分:1)
我们处于完全相同的情况。我们拥有的是(警告,一些伪代码!):
一个预接收挂钩,用于检查用户名,然后根据收到的每个ref和所有SVN映射的分支:( git - > svn):
git checkout -f <branch>
git reset HEAD --hard
git clean -fdx
git merge -n $newrev
git svn dcommit
如果失败,请全部还原,
然后,在所有循环之后 - 更新所有SVN分支(使用脚本,见下文)
使用最新的svn更改(svn - &gt; git)更新git-svn分支的cronjob:
git checkout --orphan svn-update <random-branch-name>
git svn fetch --all
git branch -D <branch> && git branch --track <svn-branch> refs/remotes/<svn-branch>
,用于git身份验证的ssh密钥
这样没有人直接使用SVN,与纯git的唯一区别是你不能改变git-svn分支历史(因为SVN不会让你这么说)。
答案 4 :(得分:1)
我处于类似的设置中,这是一个适合我和我工作的人的过程:
一个人使用git svn clone
和朋友创建一个Git存储库。
其他人使用常规Git命令克隆第一个Git存储库,然后复制第一个存储库svn-remote.{name}
的{{1}}位。在.git/config
。
现在,每个人都有git help svn
设置,可用于与Subversion存储库进行交互。
更重要的是,每个人都有git-svn
设置,具有相同的分支和提交历史记录,这意味着git-svn
和朋友创建的提交将是相同的,包括哈希 。此时,除了推送和拉动Subversion存储库之外,您还可以使用所有Git的发烧友分布式功能。
与常规Git不同,你需要小心共享配置 - 如果你的分支结构发散,你的哈希也会分歧。偶尔会出现问题并且需要修复(我曾经有两个git svn fetch
同时进行攻击,其中的每个人都以微妙的方式工作;我不得不用git svn fetch
回溯我的历史记录并重新填写为了保持我的哈希与其他人的匹配)。但它们是将两种工具混合在一起的限制。