在使用git-svn下拉(相当大)的svn repo的过程中,我遇到了以下错误消息(替换为真实信息的通用信息):
Found possible branch point: svn://server/project/trunk/dir => svn://server/project/branches/branchname, <revision>
Initializing parent: refs/remotes/branchname@<revision>
project/trunk/dir/file was not found in commit <hash> (r<revision>)
我在other posts读过,可以通过一些修补来“取消”这个信息。但是,我宁愿不要失去历史,尽可能无痛地前进。
我如何让git-svn fetch
继续?
这可能意味着您正在接收一个新的svn修订版,该修订版修改了一个文件(由于某种原因)在您的git commit中不存在等同于父svn修订版的文件。导致这种情况的一种非常简单的方法是与--ignore-paths
不一致(最初没有办法配置它们,并且必须在每个可能获取的git-svn
命令行上输入它们)。另一种方法是让svn服务器端的某个人更改存储库权限,以便突然出现(从您的角度来看)您的git存储库没有历史记录的整个文件子树。
通过这个直接问题并继续git-svn fetch
的最简单方法是使用--ignore-paths
(或更好的svn-remote.svn.ignore-paths
配置条目)来忽略树的问题部分。您可以使用命令行参数来传递单个修订版,直到有人在svn端修改它时才会再次遇到问题。
如果你想在没有--ignore-paths
的情况下恢复,那么你需要修复父修订版,以便它包含被修改的文件。我特意写了git-svn reset
来做你所提到的“取消取消”,而不是修修补补。它可以将您的svn遥控器重置回文件真正创建的位置,以便将其集成到历史记录中。这不会消除您的工作副本,但您需要在此新历史记录中重新显示任何工作分支。
当存储库有svn:externals urls设置时,我从git svn fetch得到了这个错误,而我的--ignore-paths regexp会将它们过滤掉。
这里的一个快速解决方案是在出现问题之前将其重置为修订版。
git svn reset <a past revision>
例如,当错误消息提及r1000
时,例如运行git svn reset r990
等
并运行git svn rebase
或git svn fetch
。
在Windows上与文件名中的特殊字符(此处为:变音符号)相关的错误:
(...)
r36770 = 24d589b34b952dd13ee8d231e7ce4d675ec1a82c (refs/remotes/origin/xxx)
M doc/specification/xxx/2013 03 07 Workflows.xls
xxx/branches/xxx/doc/specification/xxx/2013 03 07 München.xls
was not found in commit 24d589b34b952dd13ee8d231e7ce4d675ec1a82c (r36770)
有问题的文件确实在引用的修订版中,但git svn
无法看到它。
我能够通过为语言和语言环境设置环境变量来解决这个问题,如下所示:
SET LANG=C
SET LC_ALL=C
您可以在运行git svn
之前执行这些命令,但只有当前shell存在时它们才会持久存在。如果要永久设置它们,请转到“控制面板”>“系统”>“高级系统设置”>“环境变量”。
我遇到了包含unicode字符的目录名称的问题,即使错误抱怨目录中的特定文件。我试过了
git svn fetch --ignore-paths path/up/to/filename
与文件的完整路径,但这不起作用。也没有用unicode字符尝试目录的完整路径。
最终工作的命令是带有unicode字符的目录的父目录,如下所示:
git svn fetch --ignore-paths path/up/to/but-not-including-unicode-chars