在SVN目录中初始化Git存储库后,如何重新设置Git提交给SVN的基础?

在SVN目录中初始化Git存储库后,如何重新设置Git提交给SVN的基础?,git,svn,version-control,git-svn,rebase,Git,Svn,Version Control,Git Svn,Rebase,当我的SVN服务器关闭时,我在我的SVN存储库中创建了一个Git存储库。在主分支上进行了一些提交之后,我希望将更改重新设置回SVN服务器(这在逻辑上是可能的,因为主分支的初始提交是SVN服务器停止运行时的SVN修订,再加上一些小的更改)。因此,我使用Git SVN将SVN作为一个分支添加到Git中,如So中所述 基本上我现在有两个分支: git_svn(我的svn服务器崩溃时的svn版本) master(从1开始的分支,包含从1开始的所有更改) 由于它们在Git树中没有连接,Git不知道1+2是

当我的SVN服务器关闭时,我在我的SVN存储库中创建了一个Git存储库。在主分支上进行了一些提交之后,我希望将更改重新设置回SVN服务器(这在逻辑上是可能的,因为主分支的初始提交是SVN服务器停止运行时的SVN修订,再加上一些小的更改)。因此,我使用Git SVN将SVN作为一个分支添加到Git中,如So中所述

基本上我现在有两个分支:

  • git_svn(我的svn服务器崩溃时的svn版本)
  • master(从1开始的分支,包含从1开始的所有更改)
  • 由于它们在Git树中没有连接,Git不知道1+2是一个线性分支

    如何将所有更改(包括它们的提交消息)从主分支应用回SVN

    我已经试过了
    • 在包含master和git_svn分支(补丁)的初始提交的一个目录上创建标准diff
    • 将修补程序应用于git_svn分支
    • 创建
      git格式回补到初始提交
    • git-am
      git\u svn的所有补丁

    然而,在这里,Git告诉我补丁无法应用

    按时间顺序排列的工作流如下所示:

  • 我正在处理这个svn存储库:

    A——F

  • svn服务器已关闭,但我正在基于F开发一些功能F',因此我在完全相同的目录中启动了git存储库,并从那时起开始提交git(希望使用git svn在svn分支上重新设置基础)

    F'--G--…--K

  • 现在的意图是使用git svn来归档:

    A——F--F'--G--…--K

  • 怎么做?
    • 使用svn repo的git svn clone url签出svn存储库(svn_repo与包含A-F的svn_分支)
    • 准备好git特性分支(包含特性分支F'-K的git_repo)
    现在我们可以在git_repo中签出F',以便能够创建从F到F的补丁。其思想是将补丁应用于svn_分支,以使svn_分支头F和特征分支初始提交F'相同。将两个存储库都放在一个目录中:

    cd svn_repo
    git reset --hard (warning: dont apply if you dont understand the implications)
    git clean -rfx   (warning: dont apply if you dont understand the implications)
    cd ../git_repo
    git checkout F'
    git reset --hard (warning: dont apply if you dont understand the implications)
    git clean -rfx   (warning: dont apply if you dont understand the implications)
    diff -wru3 svn_repo git_repo | grep -i only
    
    现在删除仅在svn_repo中的所有内容,然后准备创建和应用修补程序:

    diff -wrNu3 svn_repo git_repo > svnToGit.patch
    cd svn_repo
    patch -p1 < ../svnToGit.patch
    
    现在我们在svn_分公司

    A --- ... --- F -- F'
    
    在git_repo

    F' --- G --- ... --- K
    
    对于重定基址,我们现在将功能分支作为远程添加到svn_repo

    git remote add featurebranch path/To/git_repo
    git checkout featurebranch
    
    请记住,我们现在在F'有svn_分支,从F'开始有feature分支。这意味着git rebase能够将功能分支的每次提交应用于svn_repos svn_分支。我们可以通过拨打电话:

    git rebase -s recursive -Xours -Xignore-space-at-eol --onto svn_branch G K
    
    选择递归合并策略并在eol和ours处传递选项ignore space,这有效地告诉递归策略在发生冲突时始终使用来自feature分支而不是svn_分支的代码

    我只有删除文件和新文件的冲突
    gitmergetool
    总是告诉我更改是本地的还是远程的,我决定在整个重基过程中使用远程,这意味着功能分支。发生冲突后,您可以继续使用
    git-rebase--continue
    。当重新基址完成后,您应该检查正确性,查看日志,如果一切正常,您可以使用
    git svn dcommit
    应用最终的svn_分支

    git rebase -s recursive -Xours -Xignore-space-at-eol --onto svn_branch G K