【问题标题】:Working locally with Git when main repository is SVN当主存储库是 SVN 时在本地使用 Git
【发布时间】:2026-02-15 08:45:01
【问题描述】:

我想签出一个开源项目并为之做出贡献。主存储库是 SVN,但我想在 Git 中工作。这可能吗?

我的大部分搜索都出现了从 SVN 迁移到 Git(或相反)而不回头看的指南。

  • 如果我签出项目,进行更改并将其推送到我在 Github 上创建的分支,我应该如何通知原作者?
  • 将 Git 存储库上的贡献包含到 SVN 存储库中有多难?
  • 只需比较两个修订版(我最新的 checkout/pull/update 和我自己的本地最新提交),从中生成一个补丁并发送给他们;这应该被视为一种后备工作流程还是标准方法?

假设原作者对学习 SVN 以外的任何东西都没有兴趣。

[更新]我没有,也不想拥有,提交对 SVN 存储库的访问权限。我正在寻找解决方法。

[Update2]如果补丁确实是我唯一的选择,是否还有其他需要注意的事项?

【问题讨论】:

    标签: svn git git-svn


    【解决方案1】:

    幸运的是,git-svn 正是为此目的。它使您能够在本地使用 git,同时还可以在您希望这样做时签入 SVN。这相当简单,如果您在此处或通过 Google 搜索 git-svn,就会有很多信息。

    http://flavio.castelli.name/howto_use_git_with_svn 有一个教程,您可能想先看看。

    编辑:要生成与 SVN 兼容的差异,您可以使用 git diff --no-prefix。但是请注意,这种格式与 TortoiseSVN 不兼容。如果需要兼容性,您将不得不使用某种 shell 脚本;请参阅此处的示例:http://mojodna.net/2009/02/24/my-work-git-workflow.html

    编辑: git-svn 的一个潜在缺点是它不处理 svn 外部。你必须自己处理这些。

    祝你好运!

    【讨论】:

    • 是的,我看过一些 git-svn。从原始 (SVN) 存储库中获取更新看起来很棒。但我主要对上游工作流程感兴趣。如何正确处理和生成补丁(如果那是我唯一的选择)?
    • 我现在已经在我的回答中包含了有关生成 SVN 补丁的信息。
    【解决方案2】:

    使 Git 存储库与 Subversion 存储库保持同步非常简单:

    克隆 Subversion 存储库(在这个简单的示例中,我忽略了分支/标签)

    $ git svn clone https://url/to/repo/trunk
    

    与 Subversion 主干保持同步:

    $ git svn rebase
    

    现在,如果您拥有对 Subversion 存储库的提交访问权限,则可以推送您的更改:

    $ git commit
    $ git svn dcommit
    

    否则,如果 Subversion 存储库的提交者对使用 Git 不感兴趣,那么提交补丁是您唯一的选择:

    $ git diff 1cc92b96 > my_patch.patch
    

    在这种情况下,显然最好不要提交与 Subversion 存储库同步的分支。

    【讨论】:

    • 为什么我不应该提交我正在同步的分支?只是因为它更容易生成差异(因为我只需要一个提交 id)?
    【解决方案3】:

    是的!这是可能的!

    查看此帖子了解详情:http://www.romanenco.com/gitsvn

    只需三四个简单的步骤即可使 SVN 和 Git SCM 共生。

    我使用这项技术大约三个月,没有任何问题。这很酷!当您在 SVN 中的主要 repo 时,您可以进行离线提交并获得强大的 Git 合并。

    【讨论】:

      【解决方案4】:

      如果没有,也不想拥有,提交对 SVN 存储库的访问权限,那么 git-svnStGit 的组合可能会有所帮助。 git-svn 创建/更新一个克隆,stg 在其上维护一系列补丁(stg 命令来自StGit Crash Course):

      git svn clone ..
      
      stg new invent-some-patch-id
      ...edit patch description...
      ...hack hack hack in the tree...
      stg refresh
      ...possibly hack some more...
      stg refresh    
      ..
      stg mail
      

      请参阅StGIT Tutorial 以开始使用。

      注意:我还没有真正尝试过这个工作流程。

      【讨论】:

      • 有趣,谢谢,我回家后检查一下 StGit。我实际上认为这里最大的问题是尝试与不相信分布式版本控制系统的人合作。但无论如何他们只是手动处理补丁,所以我越来越意识到这可能是要走的路。