繁体   English   中英

git svn -<file> 未在提交中找到<hash>

[英]git svn - <file> was not found in commit <hash>

在使用 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>)

我在其他帖子中读到,可以通过一些修补来“取消获取”这些信息。 但是,我宁愿不失去历史,尽可能无痛地前进。

我怎样才能让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例如 run git svn reset r990等。

并运行git svn rebasegit 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

对于较新的 MacOSX 系统,配置

git config --global core.precomposeunicode false

,对于年长的人来说是true 解释如下:

https://michael-kuehnel.de/git/2014/11/21/git-mac-osx-and-german-umlaute.html

正确设置配置选项后,我能够使用svn2git (在svn2git使用git svn )导入 SVN 存储库。

我也有

$ locale
LANG="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_CTYPE="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_ALL="de_DE.UTF-8"

但我怀疑这会有很大的不同。

好的,我为此苦苦挣扎了一段时间,但找到了解决方法。 您将丢失当前 git repo 修订之前的文件历史记录,但历史记录将保持完整,您不必--ignore-paths 如果重写历史是一种选择,您应该遵循 Ben Jackson 的git svn reset answer

假设您在 r123 上,但无权访问在 r100 中创建的文件夹scripts/ 在某处,您被授予访问权限。 这实际上不会生成修订,并且在 SVN 中是可以接受的,但在 git 中这有效地重写了历史。 git-svn repo 会继续正常更新,直到scripts/某些内容被修改(我们称之为 r126)。 现在git svn fetch失败,因为它不知道该怎么做——它有一个不存在的文件的差异!

我修复它的方式如下:

# Clone the directory that is missing one revision before it is next changed
$ svn co -r 125 https://your-server/svn/bla/scripts

# copy the contents and (-p)reserve their attributes
$ cp -pr scripts/* ~/your-git-svn-mirror-on-r125ish/scripts

# Get the git-svn-id of the the most recent commit
$ cd ~/your-git-svn-mirror-on-r125ish
$ git log -1 | grep git-svn-id
git-svn-id: https://your-server/svn/bla/trunk@125 7b6d...daf

那个git-svn-id是问题的症结所在。 它告诉 git-svn 哪个提交映射到每个修订版。 我们将欺骗它认为我们的手动提交实际上是一个 SVN 提交。

# Add the missing new directory
$ git add scripts/

# An editor will open up, type a message warning this commit isn't a real svn revision
# The last line of your message should be the 'git-svn-id' from earlier.
$ git commit
<your message of warning>
git-svn-id: https://your-server/svn/bla/trunk@125 7b6d...daf

现在,应该有另一个提交在更新之前恢复一个提交的文件。 最后,我们需要让 git-svn 重建历史记录,并记录我们新的棘手提交

# Backup the svn state in case something goes wrong
$ mv .git/svn .git/svn-BACKUP

# Cross your fingers, and fetch the changes from svn
# If your repo is large, it may take a long time to rebuild the mappings
$ git svn fetch

如果一切按计划进行,您应该拥有一个包含新文件的存储库,而无需重写历史记录。 你可以安全地git svn rebasegit push

它可能不是最有说服力的,但从git version 2.17.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM