无法确定HEAD历史logging中的上游SVN信息

为什么我得到这个错误信息?

(发表乍得的“问题”作为答案,固定格式和错别字。)

这个错误信息有几个原因。

第一,是最常见的。 在git仓库中有两个不相交的历史logging:你在git中创build的历史logging,以及远程svn仓库的历史logging。

要解决这个问题,你需要让你的git仓库和svn仓库共享一个共同的祖先,这样git可以确定什么提交已经改变了什么。

下面的文章 ,讨论如何解决这个问题:

这个问题的第二个可能的原因是,如果你有一个早期版本的git(可能,windows msysGit包),你刚刚创build了一个新的git仓库,与远程svn仓库进行通信。

例如:

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历史logging中的上游SVN信息

如果你得到上面的错误信息,第一步是检查你的git版本。 如果你使用(msysGit)运行旧版本的git版本<= 1.6.3.3。*,那么解决这个问题最简单的方法就是更新到git的最新版本,例如1.6.4。*。

下面的文章更详细地讨论了这个问题。

我得到这个消息是因为用--no-metadata选项克隆了svn repo。 也许你的问题就是这样。

当克隆它没有这个选项时,一切都很好。

--no-metadata选项是为了克隆一个SVN仓库,当新的git克隆将成为未来的标准来源时。 它缺乏承诺回到SVN上游的能力,因为它无法跟踪git克隆和上游SVN之间的差异。

在我的情况下,从SVN回购HEAD应该已经匹配到HEAD从GIT回购。 这应该解决问题:

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

在将“ -s / --stdlayout参数错误地添加到git svn clone命令后,我收到了这条消息,该命令是针对具有trunktagsbranches相对path的“标准Subversion布局”的Subversion repo。

(我通常克隆的Subversion版本库都有标准的相对path,所以当我克隆一个Subversion版本库时,没有使用我的平常的git svn clone命令,我得到了这个神秘的信息。当试图找出问题所在时,100%是无用的。)

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

 $ 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... 

你也可能会得到这个错误,当你结帐新鲜创build的SVN回购。

我已经解决了这个

  1. 首先通过svn命令进行初始提交
  2. 然后使用git svn命令克隆回购。

这个问题的另一个原因是错误的svn-remote.svn.rewriteRoot选项(请参阅此答案的使用说明)。

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

我得到了这个消息,因为我使用了git svn init命令的FQDN,但是现有的git-svn集成只使用了主机名。

例如grep git-svn-id显示:

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

但是我做到了:

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

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

另一个可能的原因:如果你有一个svn-remote..rewriteUUIDconfiguration集,git-svn可能会在find版本库的正确的元数据时遇到问题。 例如,你可能有这样的事情(请参阅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 

不能肯定地说,这是否是一个持久的解决scheme,也就是说,下一次你可能会感到困惑。 可能尝试一个符号链接,而不是“MV”,我没有尝试过。