【问题标题】:Import svn repo to git WITHOUT history将 svn repo 导入到没有历史记录的 git
【发布时间】:2014-04-13 07:27:24
【问题描述】:

我需要在没有历史记录的情况下将 svn repo(主干、分支、标签)导入新的空 git repo。 svn历史非常大,因为存在很多分支和标签。

Svn 的主干必须进入 git 的主控。 svn的分支必须进入git的分支。并且svn的标签必须进入git的标签。都没有历史。

此命令将与历史记录一起导入:

git svn clone http://server.ru/myrepo/ --stdlayout --preserve-empty-dirs .

手动导入分支和标签(从 svn 签出每个并提交到 git)太费力了。

【问题讨论】:

标签: git svn git-svn


【解决方案1】:

建议-r HEAD 似乎只获得了最新的主干修订版,但忽略了分支和标签。此外,在我的测试中,当最后一次提交到存储库不是中继时,它执行 git-svn clone 失败。

您可以尝试单独获取主干、分支和标签。首先初始化空的 git-svn 存储库:

git svn init http://server.ru/myrepo/ --stdlayout .

然后为每个主干、标签、分支找到它们最新的 svn 版本并执行 git-svn-fetch:

git svn fetch -r <svn revision>

为避免手工劳动,您可以创建一个简单的脚本来解析svn ls -v <svn_path>/branchessvn ls --xml <svn_path>/tags 的输出。

或者,如果您已经有 git-svn-imported 存储库但想要剥离历史记录,您可以为每个分支/主干执行:git checkout --orphan <branch> && git commit -m "as imported from svn" - 这将产生一堆分离的分支,您可以进一步推送到新的“干净” git 存储库。

【讨论】:

  • 感谢您的回答,Mykola!但是git svn fetch -r <last_svn_revision> 什么也得不到。我应该指定修订间隔吗?它等于完整的历史克隆。
  • 我不知道为什么最后一个 svn 版本的 git-svn-fetch 对你不起作用。可能是版本 svn server/client/git-svn 的组合。如果修订对您有用,您可以要求非常浅的历史记录:`git svn fetch -r : 左右。
  • @MykolaGurov:在 git svn init 命令中,我们是提供主干、分支的 URL,还是同时包含主干和分支的根 URL?例如,server/myrepo 包含主干和分支文件夹,那么我们是否提供server/myreposerver/myrepo/trunkserver/myrepo/branches/***?如果是 git svn init?
  • @WaqasShah 你读过kernel.org/pub/software/scm/git/docs/… 吗?
【解决方案2】:

阅读git-svn man page仔细,注意-r选项并在克隆时使用-r HEAD

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2010-10-12
    • 2014-12-22
    • 1970-01-01
    • 2020-12-01
    • 2022-06-14
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    相关资源
    最近更新 更多