gpt4 book ai didi

git-svn 克隆 |虚假分支

转载 作者:IT王子 更新时间:2023-10-29 01:15:33 25 4
gpt4 key购买 nike

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

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

git branch -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、branch_test_script、modules 和 release。有人可以帮助理解 'abc-1.3.x@113346' 、 'abc-1.3.x@541512' ... 'release-1.1@468862' 等是什么吗?

我们怎样才能摆脱这些虚假的分支/它们意味着什么?

谢谢,
伽耶斯丽

最佳答案

tl;博士:

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


注意:我为此提交了补丁;这个解释的编辑版本现在是官方 git svn 联机帮助页的一部分,作为一个新部分“HANDLING OF SVN BRANCHES”(自 Git 1.8.1 起)。


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

然而,在 git 中,一个分支总是针对整个 repo,不存在子目录分支。 git svn 因此使用了一个解决方法。如果它检测到一个分支是从一个目录复制的,而这个目录本身并没有被 git-svn 跟踪为一个分支,它将创建一个新的历史记录。例如,对于将/trunk/foo 复制到 r1234 中的/branches/bar 的子目录分支,它将创建:

  • 从 r1233 开始向后对每个 SVN 修订版进行新的 git 提交(注意数字是创建分支之前的最后一个修订版)。这些提交的树将只包含被分支的子目录。因此对于从 r1233 向后的每个修订,通常会有两个 git 提交,一个是整个树(当 git-svn 处理 trunk 的历史时创建),另一个是新的。
  • 一个名为“bar@1233”(分支名称@revision)的虚拟分支,它指向从上面的 r1233 创建的提交。
  • 来自 r1234 的提交,即创建分支的提交。此提交会将上面的分支作为其(唯一)祖先。
  • 一个名为“bar”的分支,它指向第二个提交。

这样,对于子目录分支栏,你在git中得到了两个分支

  • bar@1233 ,表示从中创建分支的存储库的状态
  • bar,代表分支

我不太清楚为什么要创建这个虚拟分支。我认为这样做是为了表示有关分支从哪个修订版分支出来的信息,并具有分支的完整历史记录。


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

关于git-svn 克隆 |虚假分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11356901/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com