3

布局是:

Branches\
    Project1/
        Branch11/
        ...
        Branch1N/
    Project2/
        Branch21/
    ProjectX/   # not anywhere else
Excluded1\
Excluded2\
Excluded3\
Excluded4\
Programs\
    Excluded11\
    ...
    Excluded1N\
    Project1/   # the main one
    Project2/
    ...
    ProjectN/
Tags\
    Project1/
        Release1/
        ...
        Release69/

排除我设法排除 - 但我完全无法理解如何将分支/标签映射到 git 分支/标签 - 最好是事后(每个克隆需要约 5 小时)。

请记住,我是 SVN 的新手——我不知道也不了解分支/标记系统。

我在windoz上-svn2git是没有选择的(无论如何我对克隆后如何执行此操作感兴趣,或者更糟糕的是再次克隆但使用香草git )
而且我不打算将其作为永久迁移,它将充当桥梁在 SVN 和 dev 中使用的新 git repo 之间 - 所以我想保留尽可能多的信息 - 但不超过需要。在某些时候它可能会变成永久性的——我猜我需要在哪里过滤掉空提交(到被排除的项目)(?)

回购

命令 :

$ git svn clone --ignore-paths="^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x's Oblivion Toolset|Shader Disasm|Shader Editor)/" --authors-file=authors_with_emails.txt svn://svn.code.sf.net/p/oblivionworks/code/。

克隆后我有:

$ git branch -r
  git-svn
$ git branch
* master


回顾:我已经克隆了不包括我想要排除的东西 - 现在我想对 git 说“为这些 svn 分支中的每一个创建一个 git 分支 - 一个真正的 git 分支,它计算增量并压缩它们并删除文件夹Branches- 和跟踪它们 - 这个(700 mb)标签目录只是标签 - 你能做些什么(他们做不是对应于提交)?”
我看不到邪恶的树干

我的config

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    symlinks = false
    ignorecase = true
    hideDotFiles = dotGitOnly
[svn-remote "svn"]
    ignore-paths = ^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x's Oblivion Toolset|Shader Disasm|Shader Editor)/
    url = svn://svn.code.sf.net/p/oblivionworks/code
    fetch = :refs/remotes/git-svn
[svn]
    authorsfile = authors_with_emails.txt
[gui]
    wmstate = zoomed
    geometry = 787x377+54+59 305 1127
[remote "github"]
    url = https://github.com/Utumno/wrye_bash_refactoring.git
    fetch = +refs/heads/*:refs/remotes/github/*
[branch "master"]
    remote = github
    merge = refs/heads/master
4

2 回答 2

2

对于分支机构:

在您的 git 配置文件中,您可以控制 svn 分支的位置:

[svn-remote "svn"]
url = file:///some.url.to/svn/dir
fetch = trunk:refs/remotes/trunk
branches = Branches/*/*:refs/remotes/*

因此,您可以设置对分支的不同引用。

好的,所以你可以对标签做同样的事情——因为在 svn 中,标签和分支是如此相似。

branches = Tags/*:refs/remotes/*

但是你想要“真正的”git标签,没问题,一旦你将它们作为分支引用,你可以再次修改你的git repo以制作好的git标签引用:

git-for-each-ref refs/remotes/origin/tags | cut -d / -f 5- |
while read ref
do
git tag -a "$ref" -m"say farewell to SVN" "refs/remotes/origin/tags/$ref"
git push origin ":refs/heads/tags/$ref"
git push origin tag "$ref"
done

显然,您需要根据自己的目的稍微修改这些脚本。

于 2013-07-27T01:43:35.047 回答
1

我最近做了这样的事情。

首先,我不确定为什么要在从 svn 移出 git后重新排列所有内容。我怀疑这是可能的。

其次,如果没有 svn2git,我做梦也不会想到这样做。我不确定您指的是什么 Windows 问题 - svn2git 是用 Ruby 编写的。如果可以避免的话,我不会使用 Windows,但如果没有别的,肯定有 Windows 的 Ruby 实现,通过 Cygwin。

第三,这是关键,在转换之前,我使用 svndumpfilter 以我想要的方式获取svn存储库(即,以 svn2git 乐于使用的形式)。这需要一些尝试和错误,但最终效果非常好。

请参阅http://svnbook.red-bean.com/en/1.7/svn.reposadmin.maint.html#svn.reposadmin.maint.migratehttp://svnbook.red-bean.com/en/1.7/svn .reposadmin.maint.html#svn.reposadmin.maint.filtering(为您的 SVN 版本调整链接)以获取更多信息。

编辑:我会对此发表评论,但它太长了。我认为你能做的最好的事情是这样的:

[svn-remote "svn"]
    ignore-paths = ^(?:Releases|Projects|Scripts|Games|)/|^Programs/(?:Nif Scanner|Nif Viewer|Raziel23x's Oblivion Toolset|Shader Disasm|Shader Editor)/
    url = svn://svn.code.sf.net/p/oblivionworks/code
    fetch = Programs/Wrye Bash:refs/remotes/git-svn/Wrye Bash
    branches = Branches/Wrye Bash/*:refs/remotes/git-svn/Wrye Bash/branches/*
    fetch = Programs/Skyrim Viewer:refs/remotes/git-svn/Skyrim Viewer
    fetch = Programs/CBash:refs/remotes/git-svn/CBash
    branches = Branches/CBash/*:refs/remotes/git-svn/CBash/branches/*
# etc.

也就是说fetch,如果适用,branches您感兴趣的每个程序都有一行。就像您链接到的答案一样,您必须在再次.git/svn/.metadata执行之前清除文件git svn fetch

但这并不会影响我之前的评论:您的 git 历史仍然是完全线性的,并且不反映您项目的实际分支和合并历史。如果您将此作为永久迁移,这将不是您想要的。

于 2013-07-27T16:29:36.270 回答