将现有的Git仓库推送到svn中的一个文件夹

3
我有一个现存的git仓库,一直在其中工作。但最近,我需要将提交推入svn(无需包含所有合并内容,但至少需要一个单线性主分支)。
我在git/svn方面不是很擅长,我只是一个普通用户,使用SourceTree和CornerStone或带有良好UI的Tortoise进行提交、分支和标记。我以前曾使用git-svn将svn仓库迁移到git,但从未反过来做过。
这可行吗?我已经在谷歌上搜了几个教程,但没有一个能行。我也不太懂那些像rebase、reflog等术语,如果有一份好的指南可以轻松完成简单的任务而不需要学习git/svn的更复杂部分,我会非常感激的。(因为我猜想必定有人面临着同样的问题,并且已经解决了)
先行致谢!

可能是将现有的git存储库推送到SVN的重复问题。 - Jeff
1个回答

7
很简单,首先需要通过git克隆你的svn,然后将git仓库作为另一个远程仓库添加到其中。这将给你两个独立的HEAD,这就是为什么你需要将你的git提交git-rebase到git-svn头部的原因。由于svn只有线性提交,可能会有冲突。这就是为什么你需要使用各种git命令来解决所有这些问题,最终git svn dcommit将所有内容推送到svn中。

以下是总结:

1. 创建一个跟踪svn的git svn克隆

git svn clone svn://DEST/repo/projectname/trunk dest

现在我们有一个Git仓库来跟踪导入操作的目标SVN着陆点。
2: 跟踪我们想要导入的Git仓库。
cd dest
git remote add -f source /path/to/git/source/repo

现在,如果您检查git历史记录,您将看到一整个系列的提交来自原始的git repo,与此不相关的是master HEAD和一个指向我们克隆的原始(单个)svn提交的git-svn HEAD。
3:将原始git存储库变基到git-svn
这就是秘密魔力所在。似乎有很多方法可以从这里开始。这是我发现的唯一可行的方法。当然,我尝试了很多失败的方法。一旦我找到一个可行的方法,我就停止尝试。所以如果有更好的办法,我很乐意听取建议,但这种方法似乎运行良好。
git rebase --onto remotes/git-svn --root source/master

在这一点上,我意识到我的Git历史记录并不是严格线性的;我曾经在几台机器上工作过,因此主干的历史记录有些交错。

这意味着我原本期望的简单操作(如果你戴着SVN的帽子,那么你会这样认为)需要进行一些rebase修补:

(
gvim foo # fix merge conflict
git add foo
git rebase --continue
)
# ... rinse and repeat

这些步骤是必需的,因为源代码库中来自不同机器的工作分支合并在一起形成“源”开发主干线时,如果没有进行一些调整,就无法将其平铺到重新基础。

总的来说,冲突很小,修复起来也不难。

4:推送到svn

现在我们已经安排好了git-svn上面的所有内容,只需要简单地执行:

git svn dcommit

即可将更改推送到svn。

来源:http://goodliffe.blogspot.sg/2011/08/pushing-git-repository-into-existing.html


这非常有帮助,但有一个小问题:当您创建git svn克隆时,最好使用 git svn clone -s svn://DEST/repo/projectname dest 这样可以获取标签和分支。 如果您这样做,远程被称为“remotes/trunk”,而不是“remotes/git-svn”,因此在变基时的意图也更清晰。 - Arnaud Jeansen
在遵循这些步骤后,我git日志上的所有提交都归属于我。 我该如何保留来自git / svn的原始提交者? - lpacheco
据我所知,很遗憾你不能这样做,因为git svn dcommit只是像一个svn客户端一样为你提交。 - Zennichimaro
@ajeans,感谢您的建议!确实更好了,但我有另一个问题,这阻止了我使用“-s”。我得到的分支都是相互断开的,因此它们并不是很有用,我只从主干克隆。您知道如何拥有真正连接的分支吗?我的意思是svn分支变成像git分支一样? - Zennichimaro
@Zennichimaro,我很惊讶你的SVN分支之间没有连接。这是怎么发生的?无论如何,使用纯Git,您可以使用嫁接强制共同历史记录,但我认为您不能在git svn克隆中做到这一点。所以我猜你只能每个SVN分支检出一次... - Arnaud Jeansen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接