SVN商店中的Git用户,组织我们的回购

SVN商店中的Git用户,组织我们的回购,git,git-svn,Git,Git Svn,我在一家SVN商店工作,但为了在工作中注入一点理智,我使用git SVN。越来越多的同事也看到了曙光,现在我们想,在某些情况下,完全避开SVN。目前,我们每个人都有自己的git-svn-repo,但由于散列的差异很大,除了普通补丁或通过svn,我们无法真正共享任何东西。我们应该如何组织回购协议以允许直接共享(通过git remote) 我能想到的唯一方法是一个单一的、共享的git svn repo,我们使用它作为svn的网关,但使用它可能会有点麻烦——如果我们都能直接从自己的git svn re

我在一家SVN商店工作,但为了在工作中注入一点理智,我使用git SVN。越来越多的同事也看到了曙光,现在我们想,在某些情况下,完全避开SVN。目前,我们每个人都有自己的git-svn-repo,但由于散列的差异很大,除了普通补丁或通过svn,我们无法真正共享任何东西。我们应该如何组织回购协议以允许直接共享(通过git remote)

我能想到的唯一方法是一个单一的、共享的git svn repo,我们使用它作为svn的网关,但使用它可能会有点麻烦——如果我们都能直接从自己的git svn repo推送到svn,那会更好

编辑:不幸的是,我没有SVN服务器的管理员权限,因此像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.
如果我们都能从自己的git SVN回购协议直接推送到SVN,那就更好了

git svn dcommit命令不是用来做什么的吗

使用
git-svn-rebase
将git克隆重设为中心svn-repo,然后使用
git-svn-dcommit
将本地提交推送到svn


我每天都在使用git svn,它工作得非常好。也许这是因为有一个中央只读镜像,它会从svn提交中自动更新,所以每个使用git svn的人都会从git镜像和同一组提交ID中看到相同的历史。这允许从只读镜像中获取和合并,然后只需到git svn rebase和git svn dcommit,就可以将更改推送到svn repo。然后,这些更改被同步到只读镜像,并由其他所有人以相同的ID获取。

两个不同版本控制系统之间的双向网关比git早很多年。大约10年前,我已经在CVS和Arch之间手工完成了这项工作。如果不想购买subgit,可以手动维护网关,甚至尝试编写脚本。工作流程很简单:

  • 有两个分支,
    trunk
    master
    trunk
    镜像subversion,
    master
    加上在git中开发的更改
  • 每当subversion有新的变化时:
  • $git svn fetch
  • master$git合并中继线
  • 每当按下行李箱时:
  • trunk$git合并主机
  • trunk$git svn dcommit
  • master$git合并中继线
  • 您应该以原子方式执行两个序列,即一次只执行一个操作
  • <> LI>您可以考虑设置Git Svn,这样它就不会用Sudio修订信息重写提交,以减少Git中的合并提交数。
  • 可以对多个分支执行此操作,但我认为在git中合并单独的subversion分支是行不通的

    • 我们的处境完全相同。我们得到的是(警告,一些伪代码!):

      • 脚本化的远程git repo(使用bash脚本)不能是空的
      • 一个预接收钩子,用于检查用户名,然后根据收到的每个ref以及所有SVN映射的分支:(git->SVN):

        • git签出-f
        • git复位头——硬
        • git clean-fdx
        • git合并-n$newrev
        • git svn dcommit
        • 如果失败,请全部恢复

        • 然后,在所有循环之后-更新所有SVN分支(使用脚本,见下文)

      • cronjob使用最新的svn更改(svn->git)更新git svn分支:

        • git签出--孤立svn更新
        • git svn fetch--all
        • 对于所有git svn分支:
          git分支-D&&git分支-跟踪refs/remotes/
      • 用于git身份验证的ssh密钥

      • 用户管理的SVN身份验证(基于git用户名,这取决于您的设置)

      这样就没有人直接使用SVN,与纯git的唯一区别是您无法更改git SVN分支的历史记录(因为SVN不允许您更改历史记录)。

      我也处于类似的设置中,以下是一个适用于我和我的同事的过程:

    • 一个人使用
      Git svn clone
      和朋友创建Git存储库

    • 其他人使用常规Git命令克隆第一个Git存储库,然后复制第一个存储库的
      svn remote.{name}
      .Git/config
      git help svn
      中的示例中提供了执行此操作的说明

    • 现在,每个人都有一个可以用来与Subversion存储库交互的
      git svn
      设置

      更重要的是,每个人都有一个具有相同分支和提交历史的
      git svn
      设置,这意味着
      git svn fetch
      和friends创建的提交将是相同的,包括散列。在这一点上,除了推拉到Subversion存储库之外,您还可以在自己之间使用Git的所有更奇特的分布式功能

      与普通Git不同,在共享配置时确实需要小心——如果分支结构出现分歧,哈希值也会出现分歧。有时事情会出错,需要修复(我曾经有两个
      git svn fetch
      es同时进行,这以一种微妙的方式影响了彼此的工作;我不得不用
      git svn reset
      和refetch倒回我的历史,以保持我的哈希与其他人的哈希匹配)。但这是将两者混合到一起的限制