因此,我正在上班销售GIT。我需要做的第一件事就是说服所有人,GIT在他们已经习惯的情况下会更好。我们目前使用Perforce。其他人也有类似的交易吗?有什么好的链接/建议吗?
最大的成功之一是我们可以与网络断开连接。IMO的另一项胜利是处理添加/结帐的方式。欢迎更多积分!另外,我们共有大约10-20个开发者。
因此,我正在上班销售GIT。我需要做的第一件事就是说服所有人,GIT在他们已经习惯的情况下会更好。我们目前使用Perforce。其他人也有类似的交易吗?有什么好的链接/建议吗?
最大的成功之一是我们可以与网络断开连接。IMO的另一项胜利是处理添加/结帐的方式。欢迎更多积分!另外,我们共有大约10-20个开发者。
Answers:
Perl 5解释器源代码目前正经历着从Perforce转换为git的苦恼。也许萨姆·维兰的git-p4raw
进口商很感兴趣。
无论如何,您将要获得的每一个集中式VCS的主要胜利之一,也是大多数分布式VCS的胜利,是原始的,极快的速度。您无法想象拥有整个项目历史是多么的自由,只有几分之一秒的路程,直到您经历了它。即使生成整个项目历史的提交日志,其中包括每个提交的完整差异,也可以在几分之一秒内进行测量。Git太快了,你的帽子会飞起来。必须通过网络往返的VCS根本没有竞争的机会,甚至没有通过千兆以太网链路的竞争。
另外,git使得在提交时仔细选择起来非常容易,从而允许将工作副本(甚至单个文件中)的更改分散到多个提交中(如果需要的话)。这样一来,您在工作时就无需再进行任何心理记录了–您无需如此仔细地计划工作,无需事先决定要进行哪些更改,并确保将其他任何操作都推迟。您可以随时进行所需的任何更改,并在需要提交时几乎总是非常轻松地取消更改。藏起来可能对这里有很大帮助。
我发现,这些事实使我自然比起使用git之前进行了越来越多的集中提交。反过来,这不仅使您的历史记录更加有用,而且对诸如git bisect
。
我敢肯定,现在还有更多我想不到的事情。就像我在上面指出的那样,以git出售您的团队的建议的一个问题是,许多收益是相互关联的,并且相互抵消,因此很难简单地查看git的功能和收益清单并推断出它们是如何实现的。将改变您的工作流程,而哪些改变将是真正的改进。您需要考虑到这一点,还需要明确指出。
我在工作中使用Perforce。我也使用Git,因为当我在处理代码并且无法连接到服务器时,我仍然想要某种形式的版本控制。不,调和离线工作是不一样的。这是我发现git有很大好处的地方:
好吧,那是我的2美分。在Perforce的辩护中,我得说说他们的客户支持规则,以及他们的“延时查看”工具。我不知道如何使用git获得延时视图。但是为了方便和节省时间,我每天都会使用git。
从perforce转向我需要很多说服力。在我使用的两家公司中,这已经足够了。两家公司的办公室都不相同,但是办公室的基础设施很多,因此不需要脱节/脱节的功能。
您正在谈论有多少开发人员?
真正的问题是-perforce不能满足git可以提供的组织需求的原因是什么?同样,与perforce相比,git有哪些弱点?如果您自己无法回答,那么在这里提问将无济于事。您需要为公司找到一个业务案例。(例如,也许总体拥有成本较低(包括临时学习阶段的生产力损失,较高的管理成本(至少在最初阶段如此)等)
我认为您的销售很艰难-perforce是一个很好的替代产品。如果您尝试启动pvc或ssafe,这是没有问题的。
我认为,在让人们在切换期间/岗位切换过程中保持快乐的过程中,要尽早解决的问题之一就是Git中本地分支机构的私密性以及给他们犯错的自由度。让他们全部从当前代码中克隆一些私有分支,然后在那里疯狂尝试。重命名一些文件,签入内容,合并其他分支中的内容,倒带历史记录,将一组更改基于另一组更改,依此类推。展示即使在当地发生的最严重事故也不会对同事造成任何后果。您想要的是让开发人员感到安全的情况,这样他们可以更快地学习(因为Git的学习曲线很重要,这很重要),然后最终使他们作为开发人员更加有效。
当您尝试学习集中式工具时,显然您会担心制造一些问题,而这会给存储库的其他用户带来麻烦。仅凭尴尬就足以使人们不敢尝试。甚至拥有一个特殊的“培训”存储库也无济于事,因为开发人员不可避免地会遇到生产系统中在培训期间从未见过的情况,因此他们又会担心。
但是Git的分布式特性消除了这一点。您可以在本地分支机构中尝试任何实验,并且如果发生严重错误,只需将分支机构扔掉,没有人需要知道。由于您可以创建任何内容的本地分支,因此您可以使用实际的实时存储库复制您遇到的问题,而不会冒“破坏构建”或以其他方式自欺欺人的危险。一旦完成,您就可以绝对检查所有内容,而无需尝试将工作分批处理成整洁的小程序包。因此,不仅您今天花了四个小时修改了两个主要代码,而且还修改了中途记住的构建修复程序,以及在向同事解释某些内容时发现的文档中的拼写错误,等等。如果由于项目正在改变方向而放弃了重大更改,
亲自将我卖给git的命令是二等分的。我认为目前尚无此功能在任何其他版本控制系统中提供。
话虽如此,如果人们习惯了GUI客户端进行源代码控制,他们不会对git印象深刻。现在,唯一功能齐全的客户端是命令行。
git log --graph
是因为Git修订历史记录倾向于非线性并且很难在没有图片的情况下可视化。我将GitX和SourceTree用作GUI,尽管gitk(现在随Git一起提供)在一定程度上可以通过。
人们正在使用哪些Perforce功能?
我问,因为如果所有人都在命令行中进行获取和放置,则git已经覆盖了,其他所有RTS都做了。
显然,GitHub现在为公司提供了git培训课程。答曰他们的博客文章吧:
在过去的几周中,我曾多次去过Google校园,以帮助在Git培训Android。肖恩·皮尔斯(Shawn Pearce)要求我(您可能会从他的Git和EGit / JGit的荣耀中认识他-他是Junio外出时负责维护的英雄)来帮助他培训过渡时期从事Andriod工作的Google工程师从Perforce到Git,因此可以与大众共享Android。我可以告诉你,我很乐意这样做。
[…]
现在,Logical Awesome正式为所有公司提供这种类型的定制培训服务,如果您也考虑转换到Git,我们可以在这里帮助您的组织进行培训和计划。
强调我的。
我已经使用Perforce很长时间了,最近我也开始使用GIT。这是我的“客观”观点:
Perforce功能:
GIT功能:
总体而言,对于开源/分布式项目,我总是会推荐GIT,因为它更像是P2P应用程序,每个人都可以参与开发。例如,我记得当我使用Perforce进行远程开发时,我每周一次通过1Mbps链接同步4GB项目。因此,浪费了很多时间。同样,我们需要设置VPN来做到这一点。
如果您的公司规模较小,并且P4服务器将始终处于运行状态,那么我想说Perforce也是一个很好的选择。
我们已经使用Git一段时间了,最近我们的Git服务器的硬盘崩溃了,我们无法恢复到最新状态。我们设法回到了几天以前的状态。备份服务器时。团队中的每个人都拉/推了他们的更改,瞧,服务器又回到了当前状态。
Perforce和git(以及最常提及的一个)之间的一个重要区别是它们各自对大型二进制文件的处理。
例如,在一个视频游戏开发公司的员工博客中,例如:http://corearchitecture.blogspot.com/2011/09/git-vs-perforce-from-game-development.html
但是,重要的是,当您拥有庞大的6gb存储库时,git和perforce之间的速度差异很大,其中包含从文档到曾经构建的每个二进制文件的所有内容(最后,是的!实际的源历史记录)通常来自于事实上,大型公司倾向于运行Perforce,因此他们将其设置为将所有重要的操作转移到地下室中的大型服务器库。
Perforce的这一重要优势仅来自与Perforce无关的因素,因为运行该公司的公司可以负担得起上述服务器银行的费用。
而且,最后,Perforce和git是不同的产品。Git被设计为仅是一个VCS,它的性能远胜于Perforce(因为它具有更多功能,这些功能通常更易于使用,特别是换句话说,在Perforce中进行分支就像执行“开放式心脏”手术,只能由专家进行:P)(http://stevehanov.ca/blog/index.php?id=50)
使用Perforce的公司获得的任何其他好处仅仅是因为Perforce不仅是VCS,它还是文件服务器,并且具有许多其他功能来测试构建的性能,等等。
最后:Git是开源的,并且引导起来更加灵活,对git进行补丁以将重要的操作分担到中央服务器上运行并不难,运行大量昂贵的硬件。
我认为,我知道GIT胜出的一件事是它能够“保留所有文件的行尾”,而perforce似乎坚持将其转换为Unix,Dos / Windows或MacOS9格式(“ \ n”,“ \ r \ n“或” \ r)。
如果要在Windows环境或混合OS环境中编写Unix脚本,这将是一个很大的痛苦。甚至不可能基于每个文件扩展名设置规则。例如,它将.sh,.bash,.unix文件转换为Unix格式,并将.ccp,.bat或.com文件转换为Dos / Windows格式。
在GIT中(我不确定这是默认值,一个选项还是唯一的选项),您可以将其设置为“保留行尾”。这意味着,您可以手动更改文件的行尾,然后GIT将按原样保留该格式。在我看来,这似乎是一种理想的做事方式,而且我不明白为什么Perforce无法选择这种方式。
您可以实现此行为的唯一方法是将文件标记为二进制。如我所见,要解决缺少的功能,那将是一个讨厌的技巧。除了要在所有脚本等上执行很繁琐之外,它还可能会破坏大多数差异,等等。
目前,我们已经解决的“解决方案”是运行sed命令,以在每次将脚本部署到Unix环境时从脚本中删除所有回车符。这也不是理想的,特别是因为其中一些已部署在WAR文件中,并且解压后必须再次运行sed行。
我认为这只是GIT的一个很大优势,而我认为上面没有提到。
编辑:在使用Perforce一段时间后,我想添加另外几条评论:
A)我在Perforce中真正想念的是一个清晰的实例差异,包括更改,删除和添加的文件。该git diff
命令在GIT中可以通过命令使用,但是在Perforce中,必须在记录文件更改之前将其签出,并且尽管您可能将主编辑器(如Eclipse)设置为在编辑文件时自动签出文件,但是有时可能会以其他方式(记事本,Unix命令等)编辑文件。而且似乎根本不会自动添加新文件,即使使用Eclipse和p4eclipse也可能会很烦人。因此,要查找所有更改,您必须在整个工作区上运行“ Diff Against ...”,这首先需要花一些时间才能运行,其次包括所有不相关的内容,除非您设置了非常复杂的排除列表,这将我引向下一点。
B)在GIT中,我发现.gitignore非常简单,易于管理,阅读和理解。但是,在Perforce中可配置的工作区“忽略/排除”列表显得笨拙且不必要地复杂。使用通配符时,我无法获得任何排除。我想做类似的事情
-//Server/mainline/.../target/... //Svend_Hansen_Server/.../target/...
排除服务器/主线内所有项目内的所有目标文件夹。但是,这似乎不像我预期的那样工作,并且我最终为每个项目都添加了一行,例如:
-//Server/mainline/projectA/target/... //Svend_Hansen_Server/projectA/target/...
-//Server/mainline/projectB/target/... //Svend_Hansen_Server/projectB/target/...
...
以及用于bin文件夹,.classpath和.projet文件等的类似行。
C)在Perforce中有相当有用的变更列表。但是,假设我进行了一组更改,将其全部检查并放入更改列表中,然后在提交该更改列表之前进行其他操作。如果以后我对第一个变更列表中包含的一个文件进行了更改,则该文件仍将在该变更列表中,并且我不能稍后再提交变更列表,前提是它仅包含我最初添加的变更(尽管将是相同的文件)。在GIT中,如果您添加文件并对其进行进一步更改,则这些更改将不会被添加(并且仍会显示在git diff
并且您也必须先添加新更改才能提交文件。当然,这与更改列表的作用方式没有什么用,因为您只有一组添加的文件,但是在GIT中,您可以提交更改,因为实际上并没有推送更改。您可以让他们先进行其他更改,然后再进行推送,但是如果不先推送以前的更改,您将无法再推送以后添加的其他任何内容。
我没有使用Git的经验,但是有Mercurial,它也是一个分布式VCS。这实际上取决于项目,但是在我们的情况下,分布式VCS适合该项目,因为它基本上消除了频繁的损坏构建。
我认为这实际上取决于项目,因为有些更适合于客户端-服务器VCS,而另一些则是分布式的。
这是我不喜欢git的地方:
首先,我认为分布式想法与现实不符。实际使用git的每个人都在以集中方式进行操作,甚至包括Linus Torvalds。如果以分布式方式管理内核,那将意味着我实际上无法下载“官方”内核源代码-不会有一个-我必须决定是要Linus的版本还是Joe的版本,或Bill的版本。这显然是荒谬的,这就是为什么有Linus使用集中式工作流控制的正式定义的原因。
如果您接受要对内容进行集中定义的定义,那么服务器和客户端角色显然是完全不同的,那么客户端和服务器软件应该相同的信条就变成了纯粹的限制。客户端和服务器数据应该相同的教条显然变得荒谬,尤其是在已有15年历史的代码库中,没有人关心,但是每个人都必须克隆。
我们实际上想要用所有旧东西做的事情是将它装在柜子里,却忘了它在那里,就像任何普通的VCS一样。git每天都会在网络上来回拖拉它是非常危险的,因为它使您无法修剪它。修剪涉及许多繁琐的决定,并且可能会出错。因此,人们可能会从历史的各个角度保留一整套快照回购,但是这不是源代码控制的初衷吗?直到有人发明了分布式模型后,这个问题才出现。
Git积极鼓励人们改写历史,而上述原因可能就是原因之一。每个普通的VCS都会使除管理员以外的所有人都无法重写历史记录,并确保管理员没有理由考虑它。如果我错了,请纠正我,但据我所知,git无法提供授予普通用户写访问权限的方法,但禁止他们重写历史记录。这意味着任何有怨恨的开发人员(或仍在学习曲线上挣扎的开发人员)都可能浪费整个代码库。我们如何收紧那个?好吧,您可以对整个历史记录进行定期备份,即保持历史记录平方,或者禁止对除所有不良草皮之外的所有文件进行写访问,这些草皮将通过电子邮件接收所有差异并手动合并。
让我们以一个资金充足的大型项目为例,看看git如何为他们工作:Android。我曾经决定玩android系统本身。我发现我应该使用一堆称为repo的脚本来获得它们的git。一些回购在客户端运行,而另一些在服务器上运行,但是就它们本身的存在而言,这两个事实都说明了git在这两种能力中都不完整。发生的事情是,我无法拉出消息来源约一个星期,然后完全放弃了。我本来必须从几个不同的存储库中提取大量的数据,但是服务器完全被像我这样的人超负荷使用。回购正在超时,无法从超时位置恢复。如果git如此可分发,您可能会认为他们 d已经做了某种点对点的工作来减轻该服务器上的负载。Git是可分发的,但它不是服务器。Git + repo是一台服务器,但是repo并不是可分发的cos,它只是一个临时的hacks集合。
git不足的一个类似例子是gitolite(其祖先显然做得不太好。)Gitolite将其工作描述为简化git服务器的部署。同样,这个东西的存在证明了git不是服务器,而是客户端。更重要的是,它永远不会,因为如果它发展成任一种,那就背叛了它的创立原则。
即使您确实相信分布式的东西,git仍然是一团糟。例如,什么是分支?他们说,每次克隆存储库时,您都隐式地创建了一个分支,但这与单个存储库中的分支是不一样的。因此,至少有两种不同的东西被称为分支。但是,然后,您也可以倒回存储库并开始编辑。就像第二种分支一样,还是有些不同?也许这取决于您拥有的回购类型-哦,是的-显然,回购也不是一个很明确的概念。有普通的和裸露的。您不能将其推入正常状态,因为裸露的部分可能与其源代码树不同步。但是您不能cvsimport到他们根本没有想到的一个cos。因此,您必须cvsimport到一个普通的,将其克隆到开发人员命中的裸机上,然后cvs将其导出到cvs工作副本,该副本仍必须检入cvs。谁可以打扰?这些并发症来自何处?从分布式想法本身开始。最后,我放弃了乙醇钠矿,因为它对我施加了更多的限制。
Git表示,分支应该是轻量级的,但是许多公司已经存在严重的流氓分支问题,因此我认为分支应该是一个严格的治安重大决策。这是perforce真正闪耀的地方...
在perforce中,您很少需要分支,因为您可以以非常敏捷的方式处理变更集。例如,通常的工作流程是您同步到主线上的最后一个已知的良好版本,然后编写功能。每当您尝试修改文件时,该文件的差异都会添加到“默认更改集”中。当您尝试签入变更集时,它将自动尝试将来自主线的新闻合并到变更集中(有效地重新定级),然后提交。该工作流程是强制执行的,您甚至不需要了解它。因此,Mainline收集了变更的历史记录,您可以很容易地在以后选择方法。例如,假设您要还原一个旧的,例如,一个在前一个在最后一个之前。您同步到有问题的更改之前,将受影响的文件标记为更改集的一部分,同步到那一刻,并与“ always mine”合并。(那里有一个非常有趣的东西:同步并不意味着拥有相同的东西-如果文件是可编辑的(即,处于活动变更集中),则同步不会破坏它,但将其标记为可解决。)现在,您有了更改列表,可以撤消违规的更改。合并后续新闻,您将拥有一个更改列表,您可以将其放置在主线顶部以产生所需的效果。我们从来没有重写任何历史记录。合并后续新闻,您将拥有一个更改列表,您可以将其放置在主线顶部以产生所需的效果。我们从未重写任何历史记录。合并后续新闻,您将拥有一个更改列表,您可以将其放置在主线上方以产生所需的效果。我们从未重写任何历史记录。
现在,假设在此过程中进行了一半,有人跑到您身边,告诉您放弃所有内容并修复一些错误。您只需给默认更改列表指定一个名称(实际上是一个数字),然后“挂起”它,修复现在为空的默认更改列表中的错误,提交它,然后恢复命名的更改列表。通常,在尝试其他操作时会挂起多个变更列表。它既简单又私密。您可以从分支机构体系中真正获得所需的资源,而不会因拖延或与主线合并而陷入困境。
我想从理论上讲可以在git中做类似的事情,但是git实际上使任何事情成为可能,而不是断言我们赞成的工作流程。相对于分布式模型,集中式模型是一堆有效的简化,这是无效的概括。它是如此的笼统,以至于它基本上希望您像repo一样在其之上实现源代码控制。
另一件事是复制。在git中,一切皆有可能,因此您必须自己弄清楚。在perforce中,您将获得有效的无状态缓存。它唯一需要知道的配置是主服务器在哪里,客户端可以根据自己的意愿指向主服务器或缓存。那是一个五分钟的工作,它不会出错。
您还可以使用触发器和可自定义的形式来声明代码审阅,Bugzilla引用等,当然,您在实际需要它们时具有分支。这不是一个清晰的案例,但是很接近,而且设置和维护起来也很容易。
总而言之,我认为,如果您知道每个人都会以一种集中的方式工作,那么您不妨使用专为这一目的而设计的工具。Git之所以被高估是因为Linus的机智令人恐惧,加上人们倾向于像羊一样互相跟随,但是它的主要存在实际上并没有违背常识,通过遵循它,git将自己的双手与(a)软件和(b)数据在客户端和服务器上必须是两个相同的巨大教条,这在集中式工作中总是使它变得复杂而and脚。
用GIT代替不良代码行管理是很常见的。Perforce的许多缺点是不良分支策略的结果。其他集中式工具也是如此。如果必须创建大量分支,则说明您做错了什么。为什么开发人员需要创建这么多分支?
另外,为什么断开工作仍然如此重要?只是为了有人可以在火车上工作?那是最近几天唯一无法无线连接的地方。甚至大多数火车都有不错的WiFi。