为什么会收到此错误消息?
答案 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布局“trunk
,tags
和branches
相对路径。
(Subversion repos我通常克隆确实有标准的相对路径,所以当我克隆一个没有使用我通常的git svn clone
命令的Subversion仓库时,我得到了这个神秘的消息。消息是100 %正确,但在试图找出问题所在时几乎100%无用。)
答案 4 :(得分:8)
当您有结帐新创建的SVN回购时,您可能也会收到此错误。
我已经通过
解决了这个问题答案 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