为什么 `git svn clone` 不转换所有 SVN 分支?

Why does `git svn clone` not convert all SVN branches?

我有一个 SVN 存储库,我正在使用 git svn 将其转换为 Git 存储库。该过程不会始终如一地将 SVN 分支转换为 Git 分支,我正在尝试找出原因。

我从目录 svn_source/ 中的 SVN 存储库开始。这是一个正确的回购协议,而不是工作副本。如果我将工作副本检出到 svn_wc/,我可以明确列出它的分支:

~$ svn checkout file://~/svn_source/ ~/svn_wc/
~$ cd svn_wc/
~/svn-wc$ ls -A1h branches/
1.0
1.1
1.2
1.3
2.0
3.0
3.0-alpha
3.0-beta
3.1-test

然后我使用 git svn clone 将 SVN 存储库(不是工作副本)克隆到完整的 Git 存储库中时,

~$ git svn clone --stdlayout --no-metadata file://~/svn_source/  ~/git_full/

只有三个SVN分支在~/git_full/.git/refs/remotes/origin/下被转换为远程分支引用:

~/git_full/.git$ tree refs/     
refs/
├── heads/
│   └── master
├── remotes/
│   └── origin/
│       ├── 2.0
│       ├── 3.0-beta
│       ├── tags/
│       └── 3.1-test
└── tags/

5 directories, 4 files

为什么只有这三个转换?我已经 运行 git svn clone 三次了,而且总是这些。据我所知,他们没有什么特别之处。

您的 tree refs/ 命令可能不会显示所有引用,因为 git 最终会将它们打包到文件 .git/packed-refs 中。这在 git pack-refs 手册中有解释:

Traditionally, tips of branches and tags (collectively known as refs) were stored one file per ref in a (sub)directory under $GIT_DIR/refs directory. While many branch tips tend to be updated often, most tags and some branch tips are never updated. When a repository has hundreds or thousands of tags, this one-file-per-ref format both wastes storage and hurts performance.

要显示所有内容,请使用 git show-ref or git for-each-ref.