无法从HEAD历史记录中确定上游SVN信息

时间:2009-08-13 01:20:16

标签: git git-svn

为什么会收到此错误消息?

11 个答案:

答案 0 :(得分:33)

(发布Chad的“问题”作为答案,修复了格式和拼写错误。)

此错误消息有几个原因。

第一种,是最常见的。您的git存储库中有两个不相交的历史记录:您在git中创建的历史记录,以及远程svn存储库中的历史记录。

要解决这个问题,你需要让你的git存储库和svn存储库共享一个共同的祖先,这样git就能知道提交已经改变了什么。

以下Article讨论了如何解决问题:

问题的第二个可能原因是你有一个早期版本的git(可能是windows msysGit包),而你刚刚创建了一个与远程svn存储库通信的新git存储库。

例如:

git svn init svn://svn.xxx.xxx/xxx/trunk
git svn fetch -r BASE:10

git clone svn://svn.xxx.xxx/xxx/trunk // Adds all the files in the revision...

使用以下命令时,您会收到以下错误消息。

git svn info

无法确定工作树或

中的上游svn信息
git svn rebase

无法确定上游svn信息工作树历史记录或

  git svn dcommit

无法从HEAD历史记录中确定上游SVN信息

如果您收到上述错误消息,请第一步检查您的git版本。如果您使用(msysGit)运行较旧的git版本< = 1.6.3.3。*,那么解决问题的最简单方法是更新到最新版本的git,例如1.6.4。*。

以下Article更详细地讨论了该问题。

答案 1 :(得分:28)

我收到此消息是因为使用--no-metadata选项克隆了svn repo。也许你的问题也是如此。

在没有这个选项的情况下克隆它一切都很好。

--no-metadata选项用于在新的git克隆将来成为规范来源时克隆SVN存储库。它缺乏向上游提交回SVN的能力,因为它无法跟踪git clone和SVN上游之间的差异。

答案 2 :(得分:16)

在我的情况下,来自svn repo的HEAD应该与git repo中的HEAD匹配。 This应解决问题:

git update-ref refs/remotes/git-svn refs/remotes/origin/master

如果你为svn trunk使用不同的git分支,例如svntrunk,那么应该引用该分支,即:

git update-ref refs/remotes/git-svn refs/remotes/origin/svntrunk

答案 3 :(得分:9)

我错误地将-s / --stdlayout参数添加到git svn clone命令,以获得具有“标准”的Subversion回购邮件后收到此消息Subversion布局“trunktagsbranches相对路径。

(Subversion repos我通常克隆确实有标准的相对路径,所以当我克隆一个没有使用我通常的git svn clone命令的Subversion仓库时,我得到了这个神秘的消息。消息是100 %正确,但在试图找出问题所在时几乎100%无用。)

答案 4 :(得分:8)

当您有结帐新创建的SVN回购时,您可能也会收到此错误。

我已经通过

解决了这个问题
  1. 首先通过svn命令进行初始提交
  2. 然后使用git svn命令克隆repo。

答案 5 :(得分:8)

遇到同样的问题,这是基于http://eikke.com/importing-a-git-tree-into-a-subversion-repository/文章的解决方案:

$ git svn init http://server.com/svn/project/trunk/prototypes/proto1/
$ git svn fetch
  W: Ignoring error from SVN, path probably does not exist: (160013): Filesystem has no item: '/svn/!svn/bc/100/dcom/trunk/prototypes/ws' path not found
  W: Do not be alarmed at the above message git-svn is just searching aggressively for old history.
  This may take a while on large repositories
  r147367 = 37c9910f794cb9cff7ca0d5d2eb26e1f0dabbc4d (refs/remotes/git-svn)
$ svn log http://server.com/svn/project/trunk/prototypes/proto1/
  ------------------------------------------------------------------------
  r147367 | user | 2014-01-16 18:02:43 +0100 (Thu, 16 Jan 2014) | 1 line
  proto1 home
  ------------------------------------------------------------------------
$ git log --pretty=oneline master | tail -n1
  71ceab2f4776089ddbc882b8636aacec1ba5e832 Creating template
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #1

$ git show-ref git-svn
  37c9910f794cb9cff7ca0d5d2eb26e1f0dabbc4d refs/remotes/git-svn
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #2

$ echo "71ceab2f4776089ddbc882b8636aacec1ba5e832 37c9910f794cb9cff7ca0d5d2eb26e1f0dabbc4d" >> .git/info/grafts

$ git svn dcommit
  Committing to http://server.com/svn/project/trunk/prototypes/proto1 ...
    A   README.md
    A   pom.xml
A   src/main/java/.gitkeep
A   src/main/resources/.gitkeep
A   src/main/webapp/WEB-INF/web.xml
A   src/main/webapp/index.html
A   webapps/.gitkeep
  Committed r147419
    A   README.md
    A   pom.xml
A   src/main/java/.gitkeep
A   src/main/resources/.gitkeep
A   src/main/webapp/WEB-INF/web.xml
A   src/main/webapp/index.html
A   webapps/.gitkeep
  r147419 = 6a8bda7262739306d0a6e17eaad2802737dedc35 (refs/remotes/git-svn)
  No changes between current HEAD and refs/remotes/git-svn
  Resetting to the latest refs/remotes/git-svn
  Unstaged changes after reset:
    M   pom.xml
    M   src/main/webapp/index.html
    A   .gitignore
  Committed r147420
    M   pom.xml
    M   src/main/webapp/index.html
    A   .gitignore
  r147420 = 749b5acec55c341672bca08d07de8c336b5a4701 (refs/remotes/git-svn)
  No changes between current HEAD and refs/remotes/git-svn
  Resetting to the latest refs/remotes/git-svn
  ...etc...

答案 6 :(得分:2)

此问题的另一个原因是错误的svn-remote.svn.rewriteRoot选项(有关使用此选项的说明,请参阅this answer。)

从Subversion导入的提交中的git-svn-id行必须与rewriteRoot网址匹配(如果已设置)。

答案 7 :(得分:2)

我收到此消息是因为我在git svn init命令中使用了FQDN,但预先存在的git-svn集成只使用了主机名。

E.g。 grep git-svn-id显示:

git-svn-id: svn://host/repo/...

但我做了:

git svn init -Ttrunk svn://host.domain.com/repo

(我们有一台机器定期将一个git repo与svn同步,然后其他人都有git config --add remote.origin.fetch refs/remotes/*:refs/remotes/*来获取svn同步分支。)

答案 8 :(得分:0)

另一个可能的原因:如果您有svn-remote..rewriteUUID配置集,git-svn可能无法找到存储库的正确元数据。例如,你可能有这样的东西(请参阅git-svn手册页,讨论你为什么要这样做):

[svn-remote "svn"]
    url = svn://read-write.test.org
    fetch = trunk/project:refs/remotes/trunk
    rewriteRoot = http://read-only.test.org/svn
    rewriteUUID = 1234-abcd

...其中1234-abcd是只读镜像的UUID。当你'git svn fetch'时,你可能会得到这个文件:

.git/svn/refs/remotes/trunk/.rev_map.5678-dcba

...其中56780-dcba是读写存储库的UUID。解决方法是:

$ mv .git/svn/refs/remotes/trunk/.rev_map.5678-dcba \
    .git/svn/refs/remotes/trunk/.rev_map.1234-abcd

不能确定这是否是一个持久的解决方案,即下次你'git svn fetch'时可能会感到困惑。可能会尝试使用符号链接而不是“mv”,我还没有尝试过。

答案 9 :(得分:0)

在我使用BFG Repo-Cleaner https://rtyley.github.io/bfg-repo-cleaner/并重写了git历史记录(有意地),然后尝试再次git svn fetch之后,看到了这一点。 该消息显示git <-> svn匹配丢失。

要解决此问题,请阅读https://git-scm.com/docs/git-svn
在最底部显示:

  

$ GIT_DIR / svn / * /。rev_map。

     

Subversion修订版之间的映射   数字和Git提交名称。在noMetadata所在的存储库中   没有设置选项,可以从git-svn-id重建:   在每次提交的末尾(请参见上面的svn.noMetadata部分   有关详细信息)。

您需要在提交注释中包含git-svn-id注释才能执行此操作。 如果这样做,则可以删除.rev_map。*文件并重建它。

rm .git/svn/refs/remotes/git-svn/.rev_map.*
git svn info

这应该显示:

Rebuilding .git/svn/refs/remotes/git-svn/.rev_map.{snip} ...
...
Done rebuilding .git/svn/refs/remotes/git-svn/.rev_map.{snip}
Path: .
...and then regular git svn info output

答案 10 :(得分:0)

这件事也发生在我身上。而且我不记得做过不寻常的事情。存在SVN回购,Git版本是最新的。 我想向SVN提交2次本地git repo中的提交。但是当我跑步时:

git svn dcommit

我得到了错误。

git svn fetch

git svn rebase

没有帮助。运行它们后出现相同的错误。

我认为该问题可能是由于我之前进行了2次本地git commit的挤压而导致的。如果这是我仍然不知道为什么在这种情况下壁球成为问题的原因(请告诉我,请发表评论)。

无论如何,我通过再次将svn存储库克隆到另一个工作目录来解决了这个问题。

git svn clone .../trunk

将有问题的git回购添加为远程回购:

git remote add last /cygdrive/c/data/problem_repo

,并对尚未转移到SVN的所有提交进行了挑选。之后,我可以成功运行:

git svn dcommit