草庐IT

git - 灵活与静态分支(Git与Clearcase/Accurev)

coder 2023-06-23 原文

我的问题是有关Git处理分支的方式:无论何时从提交分支开始,除非您通过合并强制执行,否则该分支永远不会收到父分支的更改。

但是在其他诸如Clearcase或Accurev这样的系统中,您可以指定如何用某种继承机制填充分支:我的意思是,对于Clearcase,您可以使用config_spec来说“获取在分支/ main / issue001上修改的所有文件,然后然后继续使用/ main或此特定基准上的那些”。

在Accurev中,您还可以使用类似的机制,使流从上级分支接收更改(流如何称呼它们),而无需在分支上合并或创建新的提交。

您在使用Git时不会错过吗?您能否列举必须继承的场景?

谢谢

更新请阅读下面的VonC答案以真正解决我的问题。一旦我们同意“线性存储”和基于DAG的SCM具有不同的功能,我的问题就是:哪些是现实生活中的场景(尤其是对于OSS以外的公司而言),线性可以为DAG做些不可能的事情?他们值得吗?

最佳答案

要了解Git为什么不提供某种您所谓的“继承机制”(不涉及提交),您必须首先了解这些SCM的 core concepts 之一(例如,Git与ClearCase)

  • ClearCase使用线性版本存储:元素(文件或目录)的每个版本都与该元素的先前版本以直接线性关系链接。
  • Git使用 DAG-Directed Acyclic Graph :文件的每个“版本”实际上都是树中全局更改集的一部分,而树本身就是提交的一部分。必须在先前的提交中找到它的先前版本,可以通过单个有向无环图路径访问该先前提交。

  • 在线性系统中,配置规范可以指定一些规则来实现您看到的“继承性”(对于给定的文件,请首先选择某个版本,如果不存在,则选择另一个版本,如果不存在,则选择一个版本。第三,依此类推)。

    分支在给定选择规则的给定版本的线性历史记录中为fork(该选择规则之前的所有其他选择规则仍然适用,因此具有“继承性”效果)

    在DAG中,提交代表您将获得的所有“继承”。没有“累积”版本选择。在此图中只有一个路径可以选择您将在此确切点(提交)看到的所有文件。
    分支只是该图中的新路径。

    要在Git中应用其他版本,您必须:
  • 合并到您的分支中(例如stsquad's answer提到的git pull中的其他提交)或
  • 重新设置分支(作为Greg mentions)

  • 但是由于Git是基于DAG的SCM,它将始终导致新的提交。

    使用Git所“失去”的是某种“组成”(当您选择具有不同连续选择规则的不同版本时),但是在 D VCS中(如“分布式”中),这是不实际的:您在使用Git进行分支时,需要以一个起点和明确定义的内容以及可以轻松复制到其他存储库的方式进行。

    在纯中央VCS中,您可以使用所需的任何规则定义工作区(在ClearCase中,快照或动态的“ View ”)。

    unknown-google在注释中(以及上面的问题中)添加:

    So, once we see the two models can achieve different things (linear vs DAG), my question is: which are the real life scenarios (especially for companies more than OSS) where linear can do things not possible for DAG? Are they worth it?



    对于选择规则而言的“真实场景”,您可以在线性模型中为同一组文件设置多个选择规则

    考虑以下“配置规范”(即使用ClearCase的选择规则的“配置规范”):
    element /aPath/... aLabel3 -mkbranch myNewBranch
    element /aPath/... aLabel2 -mkbranch myNewBranch
    

    它选择所有标记为“aLabel2”的文件(并从那里分支),除了那些标记为“aLabel3”的文件-然后从那里分支(因为该规则在提到“aLabel2”的文件之前)。

    这值得么?

    没有。

    实际上,出于简化的原因,UCM风格的ClearCase(ClearCase产品随附的“ Unified Configuration Management ”方法论,代表了从基本ClearCase使用中得出的所有“最佳实践”)不允许这样做。一组文件称为“组件”,如果要分支给定标签(称为“基准”),则将按照以下配置说明进行翻译:
    element /aPath/... .../myNewBranch
    element /aPath/... aLabel3 -mkbranch myNewBranch
    element /aPath/... /main/0 -mkbranch myNewBranch
    

    您必须选择一个起点(此处为“aLabel3”),然后从那里开始。
    如果您还想要来自aLabel2的文件,则将所有aLabel2的文件合并到myNewBranch中的文件。

    这是您不必使用DAG进行的“简化”,在DAG中,图的每个节点代表分支的唯一定义的“起点”,而与所涉及的文件集无关。

    合并和变基足以将起点与给定文件集的其他版本组合在一起,以实现所需的“组成”,同时将特定历史记录隔离在分支中。

    总体目标是推断“应用于一致性组件的一致性版本控制操作”。
    一个“连贯”的文件集是处于定义良好的连贯状态的文件:
  • (如果已标记),,所有,其文件都标记为
  • (如果分支),所有,其文件将从相同的唯一起始点
  • 分支

    在DAG系统中很容易做到;在线性系统中(尤其是使用“Base ClearCase”,其中的“config spec”可能很棘手),这可能会更加困难,但是它是使用同一线性工具的UCM方法实现的。

    而不是通过“专用选择规则技巧”(使用ClearCase,某些选择规则顺序)来实现该“组合”,而是仅通过VCS操作(变基或合并)来实现它,从而使每个人都可以清楚地追踪(相对)开发人员专用的配置规范,或在某些但不是所有开发人员之间共享的规范)。
    再次,它增强了一致性感觉,而不是“动态灵活性”,因此稍后可能很难在上进行再现。

    这样,您就可以离开VCS (Version Control System) Realm 并进入SCM (Software Configuration Management) Realm ,该 Realm 主要与“可复制性”有关。而且(SCM功能)可以使用基于线性或基于DAG的VCS来实现。

    关于git - 灵活与静态分支(Git与Clearcase/Accurev),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/763099/

    有关git - 灵活与静态分支(Git与Clearcase/Accurev)的更多相关文章

    1. git使用常见问题(提交代码,合并冲突) - 2

      文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

    2. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

      关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

    3. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

      我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

    4. ruby - 让 bundler 使用 http : instead of git:? - 2

      我正在安装gitlabhq,并且在Gemfile中有对某些资源的“git://...”的引用。但是,我在公司防火墙后面,所以我必须使用http://。我可以手动编辑Gemfile,但我想知道是否有另一种方法告诉bundler使用http://作为git存储库? 最佳答案 您可以通过运行gitconfig--globalurl."https://".insteadOfgit://或通过将以下内容添加到~/.gitconfig:[url"https://"]insteadOf=git://

    5. ruby-on-rails - 安装 active admin 时 activeadmin.git (at master) is not yet checked out 错误 - 2

      Activeadmingem已添加到我的rails项目中,但每次我尝试安装railsgactive_admin:install时,我都会收到类似的错误git://github.com/activeadmin/activeadmin.git(atmaster)isnotyetcheckedout.Runbundleinstallfirst.我肯定在运行“railsgactive_admin:install”之前运行了bundle。运行“bundleshow”后,我看到我已将“*activeadmin(1.0.0.pre3f916d6)”添加到我的项目中,但不断收到此错误消息。我的gem文

    6. ruby - 如何让 GitHub 页面使用 master 分支? - 2

      我有一个使用Jekyll托管在GitHub上的静态网站。问题是,我真的不需要master分支,因为存储库唯一包含的是网站。这样我就必须gitcheckoutgh-pages,然后gitmergemaster,然后gitpushorigingh-pages。有什么简单的方法可以摆脱gh-pages分支并直接从master推送? 最佳答案 Theproblemis,Idon'treallyneedthemasterbranch,astheonlythingtherepositorycontainsisthewebsite.Isthere

    7. ruby - 如何在 Ruby 中只执行一次方法?有静态变量吗? - 2

      我写了一个脚本,其中包含一些方法定义,没有类和一些公共(public)代码。其中一些方法执行一些非常耗时的shell程序。然而,这些shell程序只需要在第一次调用该方法时执行。现在在C中,我会在每个方法中声明一个静态变量,以确保这些程序只执行一次。我怎么能在Ruby中做到这一点? 最佳答案 ruby中有一个成语:x||=y。defsomething@something||=calculate_somethingendprivatedefcalculate_something#somelongprocessend但是如果您的“长时间

    8. ruby-on-rails - 最灵活的 Rails 密码安全实现 - 2

      关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭8年前。Improvethisquestion我需要实现具有各种灵活需求的密码安全。这些要求基本上取自Sanspasswordpolicy:Strongpasswordshavethefollowingcharacteristics:Containatleastthreeofthe

    9. ruby-on-rails - Ruby 中的类方法(相当于 JAVA 中的静态方法) - 2

      伙计们,我正在学习ruby​​,最近从JAVA转行。在JAVA中,我可以将类的成员变量设为静态,并且该成员变量在类的实例中保持不变。我如何在ruby​​中实现相同的目标。我在我的ruby课上做了这样的事情:classBaseclass@@wordshashend到目前为止,这似乎在我测试时达到了目的,即@@wordhash在Baseclass的实例中保持不变。我的理解对吗?另外,我想在类中有一个成员方法,相当于JAVA中的静态方法(我不需要类的实例来访问它)。我怎样才能做到这一点?例如,我想在Baseclass中有一个像getwordshash()这样的方法,它返回@@wordshas

    10. ruby - 如何让模块 mixins 为静态方法工作? - 2

      假设我有两个模块。是否可以将一个模块包含在另一个模块中,使其表现得像一个混入?例如:moduleAdefself.fooputs"foo"barendendmoduleBincludeAdefself.barputs"bar"endendB.barB.foo编辑:我意识到我最初把代码抄错了。这些方法需要是静态的。更正后的代码在上面(但不起作用)。 最佳答案 如您所知,它不起作用,但为什么它不起作用是关于Ruby对象模型的非常好的一课。当你创建一个对象的实例时,你创建的是一个新对象,它有一组实例变量和一个指向对象类的指针(以及一些其他

    随机推荐