为什么很多修改在 git-svn 中丢失了?

Why do a lot of revisions get lost in git-svn?

我目前正在尝试使用 git-svn 将几个项目从 svn 移动到 git。无论我尝试转换哪个项目,svn 修订都比 git 提交多得多。我不太了解 svn,所以我很难弄清楚为什么会这样。

我基本上已经按照this指南进行转换了。 git 中的损失从 18 次修订到 9 次提交到 131 次修订到 10 次提交不等。这发生在有很多分支的项目和没有任何分支的项目中。

到目前为止,我已尝试使用选项 --stdlayout (Missing revisions after "git svn clone")。 我也尝试过使用 svn2git,但是也失败了,可能是因为我的项目似乎没有 svn2git 需要的基础结构(格式和数据库文件丢失)。 我想我最终会通过使用任何其他可用工具(如 this)找到一种方法来做到这一点,但我真的很想知道为什么会这样。

所以:有谁知道为什么在使用 git-svn 将 svn 存储库转换为 git 时,提交历史中没有显示这么多修订? git-svn 是有问题还是有一些修订类型没有显示在 git 提交历史中?

更新

我后来发现 svn log - 与 git log 相反 - 显示了历史中的所有修订,而不仅仅是 trunk/master 的修订。这意味着许多我认为缺失的修订实际上只是在分支中。然而,即便如此,并非所有修订都在提交历史中。缺少的是调用 svn log 时显示的那些,例如在 \branches 内(但不在其中一个分支内)。 git-svn 可能不会导入它们,因为它们既不影响 master 也不影响任何分支。虽然我现在很清楚这一点,但对于它的重要性我仍然有些不知所措。这些修订是否重要,或者 git 没有它们,历史是否还好?

更新 2

.git/config 文件

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true
    ignorecase = true
[svn-remote "svn"]
    noMetadata = 1
    url = svn://TheURL/TheRepository
    fetch = trunk:refs/remotes/svn/trunk
    branches = branches/*:refs/remotes/svn/*
    tags = tags/*:refs/remotes/svn/tags/*
[svn]
    authorsfile = /a/file/path/svn/authors-transform.txt
[remote "origin"]
    url = https://github.com/User/TheRepository.git
    fetch = +refs/heads/*:refs/remotes/origin/*

文件结构:

TheRepository
|
+--branches
|  |
|  +--branchA
|  |
|  +--Readme_branch.txt
|
+--trunk
|
+--tags

所以今天我学到了(非常感谢 eftshift0):

1。 svn 日志和 git 日志显示不同的东西

svn log 将 return 对您当前所在的任何子目录所做的所有修改。因此,如果您在根目录中,它将显示对所有分支、主干和标签。这与 git log 不同,后者仅显示对您当前所在分支所做的提交。如果您知道 svn,这可能看起来很明显,但我不知道,所以...

2。 --stdlayout 的作用

指定 --stdlayout 意味着 git-svn 将只包含在主干、分支或标签中完成的文件和修订。在分支和标签内部,它只获取分支和标签(即目录),因此如果出于某种原因在分支中有其他文件(但不在任何实际分支中),这些文件不会在 git 存储库。这也意味着与这些文件相关的修订不会变成提交。

这两个事实是我的提交与修订不同的原因。我希望有一天这些信息对其他人有用:)