我正在尝试使用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选项,但我无法让它工作,主要是因为我怀疑它只解决了分支/主干路径内的路径(??)。 有没有人知道解决这个问题的方法?
答案 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历史的痛苦是不值得的,它们遵循完全不同的机制。