gpt4 book ai didi

git-svn 单个 svn 服务器,多个 svn 目录作为多个 git 远程

转载 作者:太空狗 更新时间:2023-10-29 14:20:19 25 4
gpt4 key购买 nike

在使用 git-svn 创建的 git 存储库中,是否可以拥有一个具有多个分支目录的单个 subversion 服务器,每个目录都映射为远程?

现有设置

  • 中继:http://svn.example.com/trunk
  • 我的分支:http://svn.example.com/developers/luisgo/branches
  • 我的标签:http://svn.example.com/developers/luisgo/tags
  • 我的 scrum 团队的分支机构:http://svn.example.com/teams/scrum-01/branches
  • 我的 scrum 团队的标签:http://svn.example.com/teams/scrum-01/tags
  • 公司分支机构:http://svn.example.com/branches
  • 公司标签:http://svn.example.com/releases

这是遗留问题,正在迁移到 git,但我试图证明我们可以使用 git-svn 并拥有:

  • 一个“个人”远程指向我在服务器上的个人 subversion 目录
  • 一个“scrum”远程指向我的 scrum 团队在服务器上的 subversion 目录,并且
  • 一个“company”远程指向服务器上公司的subversion目录

请注意,如果我的 Remote 的名称必须是 personal/branchespersonal/tagsscrum/branches,我并不介意、scrum/tagscompany/branchescompany/tags

最终我希望能够从主干(又名公司/主)创建一个分支,它不仅是本地的,而且被推送到 personal/branches/some-feature-branch 以后可以推送到不同的远程(比如 scrum/branches/some-feature-branch 进行协作,最后推送到 company/some-feature-branch 进行发布。请注意,我理解标记,但出于本次讨论的目的有意省略。

我认为这会起作用:

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
warnambiguousrefs = false
[svn-remote "svn"]
url = https://svn.example.com
fetch = trunk:refs/remotes/trunk
branches = developers/luisgo/branches/*:refs/remotes/svn/personal/branches/*
tags = developers/luisgo/tags/*:refs/remotes/svn/personal/tags/*
branches = teams/scrum-01/branches/*:refs/remotes/svn/scrum/branches/*
tags = teams/scrum-01/tags/*:refs/remotes/svn/scrum/tags/*
branches = branches/*:refs/remotes/svn/company/branches/*
tags = releases/*:refs/remotes/svn/company/tags/*

但事实并非如此。

编辑 ===========================================

我想我解释错了。从技术上讲,上面的例子是可行的。我想要实现的是为每个分支目录创建一个“远程”,这样:

git push personal feature-branch

结果:

https://svn.example.com/developers/luisgo/branches/feature-branch

还有……

git push scrum feature-branch

结果:

https://svn.example.com/teams/scrum-01/branches/feature-branch

还有……

git push company feature-branch

结果:

https://svn.example.com/branches/feature-branch

本质上,personalscrumcompany 是同一个 svn 服务器中具有不同分支/* 的远程服务器。

当我尝试这样做时:

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = false
warnambiguousrefs = false
[svn-remote "company"]
url = https://svn.example.com
fetch = trunk:refs/remotes/trunk
branches = branches/*:refs/remotes/svn/company/branches/*
tags = releases/*:refs/remotes/svn/company/tags/*
[svn-remote "personal"]
url = https://svn.example.com
fetch = trunk:refs/remotes/trunk
branches = developers/luisgo/branches/*:refs/remotes/svn/personal/branches/*
tags = developers/luisgo/tags/*:refs/remotes/svn/personal/tags/*
[svn-remote "scrum"]
url = https://svn.example.com
fetch = trunk:refs/remotes/trunk
branches = teams/scrum-01/branches/*:refs/remotes/svn/scrum/branches/*
tags = teams/scrum-01/tags/*:refs/remotes/svn/scrum/tags/*

它告诉我我需要解决一个不明确的设置,我为多个 Remote 指定了相同的 url。我明白了,但它们确实共用一个主干。

结束编辑 ===========================================

有什么想法吗?这可能吗?

谢谢,

路易斯

PS:如果没有发布在正确的位置,我深表歉意。我很乐意移动它。无需火焰。

最佳答案

Git 会非常高兴您拥有多个具有相同基本 URL(svn-remote.{name}.url 设置)的 Subversion 存储库。问题是,从 Git 的角度来看,您有多个“存储库”试图 pull 入 refs/remotes/trunk,并且从一个 pull 会覆盖另一个。最终它们将完全相同这一事实无关紧要,因为 Git 没有真正的方法可以确定这一点。

(我将继续提及单独的“存储库”,因为从 Git 的角度来看,它们是完全独立的存储库;事实上,它们实际上是相同的 Subversion 存储库,这对 Git 没有影响。)

根据您当前的工作流程,我可以看到两种可能的解决方案:

  • 从配置中删除所有 fetch = trunk:refs/remotes/trunk 行,这样您只有一个存储库试图 pull 入主干。

    如果你想让事情变得非常干净,你可以为主干设置一个全新的存储库,如下所示:

    [svn-remote "svn"]
    url = http://svn.example.com
    fetch = trunk:refs/remotes/trunk

    然后从其他三个存储库中删除该提取。

  • 分别为每个存储库获取主干,例如,“公司”远程将具有 fetch = trunk:refs/remotes/company/trunk 行。

    这意味着您将对每个存储库重复一些获取操作,但这意味着您将有最好的机会获得正确的 merge 和分支历史记录,因为 Git 会知道主干(因此分支从/merge 到trunk) 在你所有的仓库中。

    不过,Git 仍然无法跟踪不同存储库之间的 merge 和分支,因此,例如,从 scrum 分支到公司分支的 merge 将不会被检测到。

就是说,您要执行的命令(git push scrum feature-branch 推送到 teams/scrum-01/branches/feature-branch,例如) 永远不会工作——你需要使用 git svn 命令,例如 git svn branch -R scrum feature-branch,然后是 git svn dcommit checkout 功能分支时。

不过,我个人会推荐您的原始配置:这是最简单的选项,这意味着您永远不会多次获取提交,并且 Git 将能够尽其所能跟踪分支和 merge 操作。

使用你原来的配置,你需要指定 -d 而不是 -Rgit svn branch,例如 git svn branch -d teams/scrum-01/branches feature-branch,我承认这有点复杂,但是一旦创建了分支,推送到它是完全一样的: git svn dcommit。添加的配置简单性以及 Git 跟踪完整 merge 和分支历史记录的能力弥补了在 Subversion 服务器上创建分支时增加的复杂性。

关于git-svn 单个 svn 服务器,多个 svn 目录作为多个 git 远程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15487258/

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