试图看几十个帖子但仍然没有得到我想要的东西。
前言: 我们最初有一个非常大的SVN存储库,没有主干(标准结构)等。所以,我工作的项目也没有结构(在子文件夹内)。我在这个项目上工作了大约几个月,然后遇到了我需要一个分支进行生产修复的情况。因此,我只将我的项目代码重组为主干,标签和分支(即SVN存储库中的子目录)。然后从历史记录中我创建了一个名为 Live 的分支,并对生产进行了修复并进行了部署。然后我将此修复程序合并到我的 trunk 中,没有任何问题。我们继续处理 trunk 并继续部署,但由于SVN的不必要的复杂性,并没有将 trunk 合并到 Live 虽然我们的部署很少。 (这都是SVN)
移植: 我们最近决定设置一个新的TFS服务器并通过GIT进行版本控制。因此,在安装完成后,我有一项任务是仅将此项目的代码迁移到GIT。我开始在我的本地PC上使用" git svn clone"我很高兴看到我的所有历史都被迁移了。分支机构为:
问题是分支断开连接(没有加入节点): - (
请参阅下图:
根据上图,主分支从突出显示的提交(节点)开始,但实时分支刚刚从SVN第一次提交开始。
理想情况下,我希望将master和Live上的所有内容显示为master的分支,当它真正创建时。此外,当我尝试检查Live分支时,我收到警告,它是分离的HEAD,我可能无法将提交/推送到主(即HEAD)分支。
有人可以告诉我修复此方案的步骤吗?
可能的解决方案,我认为:
这个过程可能会产生负面影响,所以我要谨慎。
更新: 根据" Live @ 2656"重命名分支和Created master。现在,尝试合并" Svn-trunk"掌握(新分支) - 我得到以下错误:
fatal: refusing to merge unrelated histories
Done
答案 0 :(得分:1)
也许从一个新的git svn clone
开始,因为它可以省去一些头痛。将这样获得的git存储库的副本保存在安全的地方也是一个坏主意:)
你可以尝试两种方式......
可能性#1 - 修复结构
更简洁的方法是重建存储库的真实结构。如果我理解正确,trunk
是在历史的某个时刻创建的。如果您能够在历史记录中找到该位置,则可以使用git rebase <SHA of that spot in branch Live>
将历史记录重新连接在一起。但是可能会出现一些冲突。
但是,如果您在SVN上将某些开发进度合并回Live
,则合并时可能会遇到困难。为了避免这种情况,您可以将这些合并重建为正确的合并提交,但如果您没有合适的历史记录可能不值得花时间......
可能性#2 - 只是变基
如果你根本不关心正确的历史,那么这个解决方案就更简单了......
git checkout master
git rebase Live
你唯一需要确定的是解决可能的冲突。
答案 1 :(得分:0)
对于一次性迁移,git-svn
不是用于转储存储库或部分存储库的正确工具。如果您想将Git用作现有SVN服务器的前端,这是一个很棒的工具,但对于一次性转换,您应该不使用git-svn
,但svn2git
是更适合这种用例。
有很多名为svn2git
的工具,最好的工具是来自https://github.com/svn-all-fast-export/svn2git的KDE工具。我强烈建议您使用svn2git
工具。这是我所知道的最好的,它可以非常灵活地使用它的规则文件。
您将可以轻松配置svn2git
的规则文件,以便从当前的SVN布局中生成您想要的结果,包括可能存在的任何复杂历史记录,包括从一个SVN回购中生成多个Git回购或者如果你愿意,可以在一次运行中将不同的SVN repos合并到一个Git repo中。
如果您不是100%关于存储库的历史记录,那么http://blog.hartwork.org/?p=763中的svneverever
是一个很好的工具,用于在将SVN存储库迁移到Git时调查其历史记录。
尽管git-svn
更容易入手,但除了灵活性之外,以下是使用KDE svn2git
代替git-svn
优于其他原因的其他原因:
svn2git
重建得更好更清洁(如果使用了正确的历史记录),对于更复杂的分支和合并历史记录来说尤其如此,等等git-svn
标记包含一个额外的空提交,这也使它们不属于分支,因此正常fetch
将不会获得它们,直到您将--tags
作为命令提供给默认情况下,仅提取指向已获取分支的标记。正确的svn2git标签是他们所属的地方svn2git
轻松配置,git-svn
最终会丢失历史记录svn2git
您还可以轻松地将一个SVN存储库拆分为多个Git存储库svn2git
比使用git-svn
你知道,git-svn
更糟糕且KDE svn2git
更优越的原因有很多。 : - )
答案 2 :(得分:0)
我遇到了类似的问题,其中一些(不是全部)SVN分支和标签已从中继断开。
Rebase不适用于我,但是我通过重写历史记录来修复它们。
您首先需要导出变量:
# create and checkout a new branch where the disconnected branch should be inserted in trunk
git checkout -b <name of the branch> <sha where to insert>
# generate the list of commands to execute
git log <your_disconnected_branch> | grep -P "(^commit|^Date:)" | tac | sed 's/commit /git cherry-pick /g' | sed 's/Date: \(.*\)$/GIT_COMMITTER_DATE="\1"/g'
# copy the output of the previous command
# export the GIT_COMMITTER_DATE variable
export GIT_COMMITTER_DATE
# paste the output of the log command, it should look like the following (without leading # sign):
#GIT_COMMITTER_DATE="Wed Jun 1 17:18:55 2016 +0000"
#git cherry-pick 54f30ac8071b5f935bf12595ab922542ce9d348e
#GIT_COMMITTER_DATE="Wed Jun 1 17:20:08 2016 +0000"
#git cherry-pick 5188d54f6d4bf09b06a108a887fdc6ec84f68919
#GIT_COMMITTER_DATE="Wed Jun 1 17:21:22 2016 +0000"
#git cherry-pick d47cbcfbd3fbd4c92e68fa2cfe92b555c7abaf8c
git log命令的说明:
最后,不要忘了用
清除GIT_COMMITTER_DATE。GIT_COMMITTER_DATE=
以防止您以后的所有操作显得过时。