3

下面的 svn 分支已添加到 .git/config 文件中。

[svn远程“svnb02”]
        网址 = https://svn/repos/Project/branches/b02
        获取 = :refs/remotes/git-svn-b02
[svn-远程“svnb03”]
        网址 = https://svn/repos/Project/branches/b03
        获取 = :refs/remotes/git-svn-b03

但只能使用以下命令获取“svnb03”:

git svn fetch -R svnb03 -r HEAD

对于“svnb02”,下面的命令将安静地返回而不获取任何东西。

git svn fetch -R svnb02 -r HEAD

欢迎任何评论。

4

4 回答 4

3

如果您的 subversion repo 没有标准布局,其中包含顶级的主干、分支和标签,git svn clone 也会静默失败。如果是这种情况,重组你的 repo 和 git svn clone 应该可以工作。

于 2012-05-14T19:40:49.487 回答
2

也许没有设置分支 HEAD。看.git/remotes/svnb02/HEAD。如果它丢失或不是最新的,这可能会导致您的问题。

Git 有在这种情况下找到 HEAD 的代码,但显然git svn没有;有一个关于这个的补丁

如果没问题,那么我会在配置文件中寻找一个svn.remote.svn.变量的奇怪条目,或者在.git/remotes目录中寻找一些奇怪的东西。

这都是猜测。一个奇怪的情况通常有一个奇怪的解释。祝你好运。

编辑——我假设svnb02当你遇到这个问题时有新的修订。如果有未获取的修订版,您的命令只会从 svn 获取。

于 2009-02-19T20:54:51.700 回答
2

如果请求的修订 (HEAD) 不在主干上,则会发生这种情况。我们的构建脚本会在构建成功后自动标记源代码,所以在我的情况下,最后一个 svn 修订版很少指向主干,所以我得到了很多。以下脚本将获取主干的最后修改版本并在执行提取时使用它:


#! /bin/sh
URL=$1
# git-svn fails to pull files if specified revision is not in path specified
# so find the last changed revision and use that
REV=$(svn info ${URL}trunk | grep "Last Changed Rev:" | awk '{print $NF}')
[ -n "$REV" ] || {
  echo "Revision not found. Check URL"
  exit 1
}
git svn init "$URL" -s --prefix svn/
git svn fetch -r $REV
于 2009-12-08T17:15:55.827 回答
1

注意我是新用户,所以我的回复中只能有一个超链接。假设 BASE 是“ https://svn/repos/Project ”。

我的回答不是这个问题的直接原因,但它密切相关,几乎可以肯定是一个因素。

问题与您将 SVN 分支视为 git 主干这一事实有关。我发现新版本的 git (1.6+) 不允许您将分支或标签作为 git 主干检出。Git 采用标准布局。在你的情况下,它可能假设。

树干 - {BASE}/trunk/ 分支 - {BASE}/branches/ 标签 - {BASE}/tags/

由于 b02 和 b03 是分支的孩子,因此它认为它们是分支而不是树干。在 1.5.x 后期版本中,我发现行为不是很一致,但在 1.6.x 版本(尤其是 1.6.x 后期版本)中,行为是完全可重现的。

对我来说非常有效的解决方法是明确声明标签和分支 URL:

git svn init -T {BASE}/branches/b03 -b {BASE}/anydir -t {BASE}/tags git svn fetch -r33666 # 其中 33666 是最新版本。

在我建议使用 git svn rebase 之后。

于 2009-08-04T11:32:20.487 回答