jjzjj

git - 将遗留代码库从 cvs 转移到分布式存储库(例如 git 或 mercurial)。初始存储库设计所需的建议

coder 2023-06-25 原文

关闭。这个问题是opinion-based .它目前不接受答案。












想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题.

3年前关闭。




Improve this question




介绍和背景

我们正在更改源代码控制系统,目前正在评估 git 和 mercurial。总代码库大约有 600 万行代码,所以不算大也不算小。

首先让我简要介绍当前存储库设计的外观。

我们有一个用于完整代码库的基本文件夹,在该级别之下有在几个不同上下文中使用的各种模块。例如,“dllproject1”和“dllproject2”可以被视为完全独立的项目。

我们正在开发的软件是我们称之为配置器的东西,它可以针对不同客户的需求进行无休止的定制。我们总共可能有 50 个不同的版本。然而,他们有一个共同点。它们都共享几个强制性模块(mandatory_module1 ..)。这些文件夹基本上包含内核/核心代码和公共(public)语言资源等。所有自定义都可以是其他模块(module1 ..)之间的任意组合。

由于我们目前使用的是 cvs,因此我们在 CVSROOT/modules 文件中添加了别名。它们可能看起来像:

core –a mandatory_module1 mandatory_module2 mandatory_module3
project_x –a module1 module3 module5 core

因此,如果有人决定在 project_x 上工作,他/她可以通过以下方式快速检查所需的模块:
base>cvs co project_x

问题

直觉上,将基本文件夹作为单个存储库感觉是错误的。作为程序员,您应该能够查看您正在使用的当前项目所需的确切代码子集。你对此有何看法?

另一方面,将这些模块中的每一个都放在单独的存储库中感觉更合适。但这使得程序员更难检查他们需要的模块。您应该能够通过一个命令来做到这一点。所以我的问题是:在 git/mercurial 中是否有类似的定义别名的方法?

非常欢迎任何其他问题、建议和指点!

附注。我已经搜索过类似的问题,但我觉得它们中的任何一个都没有 100% 适用于我的情况。

最佳答案

只是快速评论提醒您:

  • 这些迁移通常提供了重新组织源代码的机会,而不是沿着模块(每个模块都有一个存储库)而是沿着功能域拆分(同一给定功能域的多个模块放在同一个存储库中)。

  • 然后submodules将用作定义 configuration 的一种方式.
  • Git 没问题,但来自 Linus's admission himself , 将所有内容都放在一个存储库中可能会出现问题。

  • [...] CVS, ie it really ends up being pretty much oriented to a "one file at a time" model.

    Which is nice in that you can have a million files, and then only check out a few of them - you'll never even see the impact of the other 999,995 files.

    Git fundamentally never really looks at less than the whole repo. Even if you limit things a bit (ie check out just a portion, or have the history go back just a bit), git ends up still always caring about the whole thing, and carrying the knowledge around.

    So git scales really badly if you force it to look at everything as one huge repository. I don't think that part is really fixable, although we can probably improve on it.

    And yes, then there's the "big file" issues. I really don't know what to do about huge files. We suck at them, I know.



    上述两点主张为大型系统(和大型遗留存储库)采用更加面向组件的方法。

    Git submodule ,您可以在您的项目中 checkout 它们(即使它是一个两步过程)。然而,您拥有可以使子模块管理更容易的工具(例如 git.rake)。

    When I'm thinking of fixing a bug in a module that's shared between several projects, I just fix the bug and commit it and all just do their updates



    这就是我在帖子 Vendor Branch 中所描述的作为“系统方法”:每个人都在最新的(HEAD)上工作,对少数项目有效。
    虽然对于大量的模块,“模块”的概念还是很有用的,但是它的管理和 DVCS 不太一样:
  • 对于密切相关的模块(又名“在同一功能域中”,例如“与盈亏相关的所有模块 - 利润和损失 - 或“风险分析”,在金融领域中),您确实需要使用最新的 (HEAD)涉及的所有组件。
    这可以通过使用 subtree strategy 来实现。 ,不是为了让您在其他子模块上发布(推送)更正,而是为了跟踪其他团队完成的工作。
    Git 允许这种“跟踪”不必在您的存储库和一个“中央”存储库之间进行,但也可以在您和另一个团队的本地存储库之间进行,从而允许非常快速地在类似性质的项目之间来回集成和测试。
  • 但是,对于不直接在您的功能域中的模块,子模块是更好的选择,因为它们指的是模块的修复版本(提交):
    当低级框架发生变化时,您不希望它立即传播,因为它会影响所有其他团队,然后他们将不得不放弃他们正在做的事情以使他们的代码适应新版本(尽管您确实想要所有其他团队都应该知道这个新版本,以便他们不要忘记更新那个低级组件或“模块”)。
    这允许您仅使用其他模块的官方稳定标识版本,而不是潜在的不稳定或未经充分测试的 HEAD。
  • 关于git - 将遗留代码库从 cvs 转移到分布式存储库(例如 git 或 mercurial)。初始存储库设计所需的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/899373/

    有关git - 将遗留代码库从 cvs 转移到分布式存储库(例如 git 或 mercurial)。初始存储库设计所需的建议的更多相关文章

    1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

      如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

    2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

      我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

    3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

      在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

    4. ruby-on-rails - 浏览 Ruby 源代码 - 2

      我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

    5. ruby - 模块嵌套代码风格偏好 - 2

      我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

    6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

      几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

    7. ruby - Net::HTTP 获取源代码和状态 - 2

      我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

    8. ruby - 分布式事务和队列,ruby,erlang,scala - 2

      我有一个涉及多台机器、消息队列和事务的问题。因此,例如用户点击网页,点击将消息发送到另一台机器,该机器将付款添加到用户的帐户。每秒可能有数千次点击。事务的所有方面都应该是容错的。我以前从未遇到过这样的事情,但一些阅读表明这是一个众所周知的问题。所以我的问题。我假设安全的方法是使用两阶段提交,但协议(protocol)是阻塞的,所以我不会获得所需的性能,我是否正确?我通常写Ruby,但似乎Redis之类的数据库和Rescue、RabbitMQ等消息队列系统对我的帮助不大——即使我实现某种两阶段提交,如果Redis崩溃,数据也会丢失,因为它本质上只是内存。所有这些让我开始关注erlang和

    9. 程序员如何提高代码能力? - 2

      前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

    10. 7个大一C语言必学的程序 / C语言经典代码大全 - 2

      嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来

    随机推荐