git svn克隆|伪分支

git svn克隆|伪分支,git,git-svn,git-branch,Git,Git Svn,Git Branch,我使用以下命令将svn repo克隆到git中,执行后,我看到一些虚假的分支 git svn clone[svn repo URL]--无元数据-A authors-transform.txt--stdlayout~/temp git分行-a *(no branch) master remotes/abc-1.3.x remotes/abc-1.3.x@113346 remotes/abc-1.3.x@541512 remotes/branch_test_script r

我使用以下命令将svn repo克隆到git中,执行后,我看到一些虚假的分支

git svn clone[svn repo URL]--无元数据-A authors-transform.txt--stdlayout~/temp

git分行-a

*(no branch)
  master
  remotes/abc-1.3.x
  remotes/abc-1.3.x@113346
  remotes/abc-1.3.x@541512
  remotes/branch_test_script
  remotes/tags/modules-1.2
  remotes/tags/modules-1.2@113346
  remotes/tags/modules-1.2@516265
  remotes/tags/release-1.1
  remotes/tags/release-1.1@113346
  remotes/tags/release-1.1@468862
  remotes/trunk
在svn中创建的实际分支包括abc、分支测试脚本、模块和发行版。 有人能帮助理解什么是abc-1.3吗。x@113346","abc-1.3。x@541512' ... '第1版。1@468862“你是谁

我们怎样才能去掉这些假树枝/它们意味着什么

谢谢,

Gayathri

当我将我的SVN回购克隆到Git回购时,我也有这样奇怪的分支

在查看了预期的分支(在您的例子中是
modules-1.2
abc-1.3.x
branch\u test\u script
release-1.1
)之后,我注意到
@revisionnumber
分支只不过是其前缀分支中的提交

如果要手动执行,请在branch
abc-1.3.x
上打开
gitk
,并验证
abc-1.3。x@113346
abc-1.3。x@541512
显示在该分支的历史记录中。如果是这样,您可以删除相应的分支

如果有许多分支或提交要浏览,那么这可能有点麻烦

自动方式:让git为您完成:

git branch -r --contains abc-1.3.x@113346
将回声(或至少

这意味着您可以安全地删除
abc-1.3。x@113346
因为它包含在
abc-1.3.x
中:

git branch -r -d abc-1.3.x@113346
由于SVN的线性历史,它当然也包含在(较新的)提交
541512


旁注:
您可能已经注意到,SVN标记实际上并没有转换为Git标记和本机Git分支。这可以通过将SVN回购克隆为Git回购来实现。

tl;博士:

git svn
如果为子目录(或git svn未跟踪的其他目录)创建了分支(或标记),则会创建这些“@”分支。还将始终存在一个具有相同名称但没有“@”后缀的“常规”分支。“@”-分支仅作为常规分支的分支点存在


注意:我为此提交了一个补丁;该解释的编辑版本现在是官方
git svn
manpage的一部分,作为“svn分支处理”的新章节(自git 1.8.1起)


在Subversion中,分支和标记只是目录树的副本,因此可以(尽管通常不鼓励)从本身不是分支(或主干)的目录创建分支。例如,通过将/trunk/foo复制到/branchs/bar,而不是复制/trunk(可以说是“子目录分支”),或者通过复制位于trunk/tags/branchs结构之外的目录(这在SVN中是可能的)

然而,在git中,一个分支始终用于整个repo,子目录分支不存在<因此,code>git svn使用了一种变通方法。如果它检测到从一个目录复制的分支,而该目录本身并不是git svn跟踪的分支,它将创建一个新的历史记录。例如,对于将/trunk/foo复制到r1234中的/branchs/bar的子目录分支,它将创建:

  • 从r1233向后为每个SVN版本提交一个新的git提交(请注意,该数字是创建分支之前的最后一个版本)。这些提交的树将只包含分支的子目录。因此,对于从r1233向后的每个修订,通常会有两个git提交,一个包含整个树(当git svn处理
    trunk
    的历史时创建),另一个是新的
  • 一个名为bar@1233“(分支机构name@revision),它指向从上面的r1233创建的提交
  • 来自r1234的提交,创建分支的提交。此提交将以上面的分支作为其(唯一)祖先
  • 一个名为“bar”的分支,它指向第二个提交
这样,对于子目录分支栏,您可以在git中获得两个分支

  • bar@1233,表示从中创建分支的存储库的状态
  • 表示分支的条
我不太清楚为什么会创建这个虚拟分支。我认为这样做是为了表示分支来自哪个版本的信息,并为分支提供完整的历史记录



请注意,可以使用标志
--no follow parent
关闭整个机制。在这种情况下,每个SVN分支将生成一个git分支,其中只包含来自SVN分支目录的提交。每个分支都将与历史记录的其余部分无关,并且将有自己的根提交,与分支中的第一个提交相对应。

我很难找到此命名的来源,但看起来这些分支是从SVN提交创建的,SVN提交被发现不再被SVN分支(或标记)引用它们最初是在英国制造的。与Git中的未引用提交类似,只是可以恢复提交的分支名称。@fork0:感谢您的回复。但我不清楚svn中如何存在未引用的提交。参考文献怎么会丢失?你能谈谈你的想法吗?我不知道。可能SVN存储库的维护人员从未清理过它们(或者SVN根本没有这个能力?)。我的意思不是说引用丢失了,而是有人从历史的早期开始提交可能SVN中的提交列表总是生成所有提交的完整列表,与它们是否被标记或分支引用无关,但其中一些分支没有被删除或移动。即使对于某些正常的提交修订,也会创建这些分支。知道为什么会发生这种情况吗?如何移除这些分支?是否有任何参数可以传递给git以忽略此类提交而不创建
git branch -r -d abc-1.3.x@113346