18

我正在使用 git-svn 来处理 svn 存储库。我不想要整个回购,因为它包含很多遗产,其中包含二进制文件。我只跟踪一些目录。

这是我的电流.git/config,它工作正常。

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[svn-remote "svn"]
    url = https://svn.example.com/repository
    fetch = trunk/Python:refs/remotes/trunk
    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*
    branches = branches/{active}/Python/:refs/remotes/*

现在我想添加一个新分支:

    branches = branches/{fuze_node}/:refs/remotes/*

但是在执行git svn fetch新分支时对 git 不可见。就好像该行不在配置中一样。


我知道这可以通过一个新的 svn-remote 来完成,但我不想走那条路。

4

2 回答 2

23

对于每个 svn-remote git-svn 将最新获取的修订存储在.git/svn/.metadata文件中。它永远不会获取小于该值的修订。这就是为什么它不获取您添加到配置中的分支的原因;git-svn 认为fuze_node分支已经转换。

但是,您可以在不重新克隆整个存储库的情况下获取此分支:

  1. 添加另一个 svn-remote,其中包含您需要获取的所有分支;
  2. 删除旧的 svn-remote;
  3. 运行git svn fetch -R newer-svn-remote以从添加的分支中获取修订。

您的配置应如下所示:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
# [svn-remote "svn"]
#    url = https://svn.example.com/repository
#    fetch = trunk/Python:refs/remotes/trunk
#    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*
#    branches = branches/{active}/Python/:refs/remotes/*
[svn-remote "newer-svn-remote"]
    url = https://svn.example.com/repository
    fetch = trunk/Python:refs/remotes/trunk
    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*
    branches = branches/{active}/Python/:refs/remotes/*
    branches = branches/{fuze_node}/:refs/remotes/*

请注意,您必须指定与旧 svn-remote 中完全相同的分支映射:

    branches = branches/{stage,prod,stage_with_proxy}/ucapi/:refs/remotes/*

也就是说,refs/remotes/*仍应位于映射的右侧。否则 git-svn 无法检测到已转换的提交并尝试再次获取它们。


实际上还有另一种方法可以达到同样的效果。不过,它涉及对内部 git-svn 文件的一些操作。

您可以只添加必要的分支.git/config并更新.git/svn/.metadata文件,因此最新获取的修订版变为 0:

[svn-remote "svn"]
    reposRoot = https://svn.example.com/repository
    uuid = 8a6ef855-a4ab-4527-adea-27b4edd9acb6
    branches-maxRev = 0
    tags-maxRev = 0

之后git svn fetch将只获取必要的修订。

于 2012-11-20T16:15:10.833 回答
0

我找到了一个更简单的方法,它不需要编辑任何配置文件。

您只需要要添加到本地 git-svn 存储库的分支中最后一次提交的修订号。

如果您有新分支的 SVN 检出并安装了 TortoiseSVN,您可以右键单击此文件夹并使用“TortoiseSVN / 显示日志”。

记下最顶层的提交(例如 45065)。

现在在 Git Bash 中使用以下命令:

git svn fetch -r45065

注意:您需要将编号替换为45065您的提交编号。
git 现在会将新的远程分支拉到您的本地存储库中。

You can then check it out with creating a local Branch. I'm using Git Extension for checking out the new branch, using "Remote-Branch" and the option "Create local branch with name: ...".
Hint: You can remove the "origin/" prefix from your local branch name, as this avoids the warning "refname 'origin/V8.0' is ambiguous.".

于 2021-03-16T14:00:03.143 回答