如何使用git-svn将带有非法分支名称的svn存储库转换为git?

时间:2011-06-18 09:21:45

标签: svn git git-svn

我正在尝试使用git-svn将公司svn repo加载到git中,但遗憾的是我的一个同事在分支名称中创建了一个带有非法字符(\)的分支。现在,当我尝试导入整个历史记录时,git退出时出现错误:

fatal: Cannot lock the ref 'refs/remotes/feature-\\-bar'.
update-ref -m r4 refs/remotes/feature-\\-bar 471d9622546803b3712a436c2e2ed6b1490c829a: command returned error: 128

我可以没有分支,因为它无论如何都是过去的方式,但我不想放弃所有的历史直到合并分支的地步。我尝试了--ignore-path选项,但我无法让它工作,主要是因为我怀疑它只解决了分支/主干路径内的路径(??)。 有没有人知道解决这个问题的方法?

2 个答案:

答案 0 :(得分:2)

我也必须忽略一些分支,因为他们使用了我无法使用git svn取得的非法字符(在我的情况下,字符为:/)。< / p>

解决方案1:为每个分支手动添加其他svn存储库

使用git svn init -s [svn-repository-url]初始化存储库后,我在.git/config中注释了分支配置:

[svn-remote "svn"]
    url = [svn-base-url]
    fetch = [project-name]/trunk:refs/remotes/trunk
    #branches = [project-name]/branches/*:refs/remotes/*
    tags = [project-name]/tags/*:refs/remotes/tags/*

稍后要添加分支,我将通过为每个分支添加新的svn位置来完成此操作,例如

[svn-remote "svn-your-branch"]
    url = [svn-base-url]
    fetch = [project-name]/branches/your-branch:refs/remotes/your-branch

来源:How do Git SVN ignore-paths work (ignoring daily build tags)?或某些实际配置,例如http://www.dmo.ca/blog/20070608113513/

解决方案2:在配置中明确说明您喜欢的分支

您可以定义要在.git/config中获取的分支:

[svn-remote "svn"]
    url = [svn-base-url]
    fetch = [project-name]/trunk:refs/remotes/trunk
    branches = [project-name]/branches/{your-branch-1|your-branch-2}:refs/remotes/*
    tags = [project-name]/tags/*:refs/remotes/tags/*

如果在签出svn中的所有内容之后添加分支是安全的,我会更喜欢这个解决方案。

来源:https://stackoverflow.com/a/3844508/709431

为什么忽略路径不起作用?

根据http://go-dvcs.atlassian.com/display/aod/Advanced+git-svn+options git svn --ignore-paths,只会忽略提交的内容。因此,它仍将为分支名称创建引用。如果分支名称包含非法字符,则会失败。 (此外,与您的假设相反,ignore-paths会匹配除网址部分之外的所有内容,例如,使用project-name/branches/your-branch-1等上述内容进行配置。)

答案 1 :(得分:0)

我会在当前任何分支的头部开始git repo - 手动制作分支git-friendly的名称。对于旧历史记录,在需要时以此方式导入有时候,导入svn历史的痛苦是不值得的,它们遵循完全不同的机制。