从Perforce到Git的迁移

时间:2021-10-14 04:59:14

公司经过多次兼并、收购之后,开发团队使用的工具自然会出现鱼龙混杂的现象。就拿源代码管理工具来说,我们同时在使用的就有Perforce、Team Foundation、Subversion等。为了节省成本,也为了统一工程实践(以提高工作效率),我们决定让所有团队迁移到Git。

从Perforce到Git的迁移                 从Perforce到Git的迁移

      集中式(Centralized)的源代码管理                               分布式的(Distributed)源代码管理

之所以选择Git,是因为:

  1. 它是主流的;
  2. 它是免费、开源的;
  3. 它支持分布式开发——这一点特别适合跨国团队;
  4. 它支持离线环境下的开发(因为每台开发机本地都有一个代码仓库depository);
  5. 它是跨平台的(支持Windows、MAC、Linux)。

Git工具可以到http://git-scm.com/上去下载。为了方便操作,也可以使用一些带图形界面的Git工具。关于Git的介绍,网上可以找到很多资料。(顺便推荐一下中文版的《Pro Git》:http://git-scm.com/book/zh。)我想在这里分享的是,我们是怎么把一大堆老项目(主要在Perforce上)迁移到Git的。(Perforce用了将近9年,终于要说“bye-bye”啦……)

在Perforce上,我们为每个产品建立了一个*目录。然后,在它下面分别有Main、Work、ThirdParty、Release等子目录。Main里存放一个产品的主要代码,大部分人直接在这上面工作;Work里存放一些试验性质的代码,或者自己开发的小工具;ThirdParty里存放来自第三方的SDK;而Release里存放从Main派生出来的各个版本,典型情况下是为各个客户做的定制和发布,我们一般把它们命名为RelCustomerXV1、RelCustomerXV2、RelCustomerYV1、RelCustomerZV3……整个代码结构看起来是这样的:

从Perforce到Git的迁移

在往Git迁移的过程中,Perforce上每个Changelist的历史记录是移不过去的(或许只是我们不知道……)。我们的办法是:在公司里仍然保留一台Perforce服务器,并开放有限的几个账号,必要时可以提供查询功能;将Perforce上最新的一份代码放到Git上去,并且以后所有的开发都在Git上进行。

我们的迁移是这么做的:首先,由管理员在Git服务器上为每个产品建立一个空的代码仓库,比如ios.git、android.git、pcmac.git等;然后,由各个产品的开发主管负责代码的上传与分支的建立。这里的焦点问题是:如何处置那些RelCustomerXXX分支?因为Perforce的分支概念与Git的有较大的区别:Perforce做的是实实在在的代码拷贝,而Git在创建分支时保存的只是指针或引用。要在Git里为每一个RelCustomerXXX创建分支吗?这样的话,服务器上的分支看起来会比较多(通过git
branch -a命令查看),容易造成日后的混淆。经过团队讨论,我们最终决定把这些RelCustomerXXX都建在master上(不另外创建分支),由此带来的问题是:master的体量比较大,在开发人员第一次做git clone的时候会比较耗时。忍了!

往Git上传代码的过程是在Git Bash(Windows | All Programs | Git)里通过执行一系列git命令来完成的。具体步骤如下(以iOS产品为例):

从Perforce到Git的迁移

假设你的工作目录(Working Directory)在D:\GitWorkspace。在运行Git Bash之后,你需要执行cd D:\GitWorkspace进入该目录。然后执行git clone命令将空的代码仓库克隆到本地:

git clone <server URL>:ios.git

克隆完成之后,执行cd命令进入本地仓库(你可以看到默认指向了master)。然后,在文件浏览器里,将Perforce上拿到的最新的产品代码拷贝到D:\GitWorkspace\ios\main中,并且在D:\GitWorkspace\ios\customer_releases\下面建立子目录、拷入各个RelCustomerXXX分支的代码,还有其他一些文件(比如work、thirdparty)都拷入D:\GitWorkspace\ios\……当所有文件都准备好之后,在Git Bash里依次执行下面的命令:

git add -A

git commit -m "the initial porting from Perforce"

git remote add origin <server URL>:ios.git

git push origin master

如果上传的代码比较多,上述过程会比较耗时。至于日后在Git上的产品开发,我们决定采用“Gitflow工作流程”。因此,在完成上述的代码上传之后,每个产品的开发主管须立即创建一个develop分支:

git branch develop

git push -u origin develop

最后,别忘了让另一个开发人员在他的机器上拉一下代码(执行git clone或git pull命令),然后试着编译一下,看看是否有部分文件遗漏了。(完)

从Perforce到Git的迁移的更多相关文章

  1. git仓库迁移和更新远程仓库地址

    一.git仓库迁移 1,从原仓库clone或pull到本地仓库 git clone project_name ​[old_remote_repository_address] 2,​在新的git创建一 ...

  2. GIT工程迁移方法总结

    Git工程迁移方法总结 Git最近准备迁移一下位置,这里采用命令行的方式,做如下操作. 1.git init  初始化git仓库,这个时候发现本地文件夹多了个.git的文件夹. 2.git remot ...

  3. Git工程迁移方法总结(命令行)

    Git工程迁移方法总结 Git工程迁移方法总结 Git最近准备迁移一下位置,这里采用命令行的方式,做如下操作. 1.git init  初始化git仓库,这个时候发现本地文件夹多了个.git的文件夹. ...

  4. git 仓库迁移,git remote 更改源

    git仓库迁移 我们有时候需要迁移git仓库,但又想保留每次commit的记录,所以我们只需要更改git remote [源]的问题即可 首先查看你的remote的地址 git remote -vv ...

  5. Git工程迁移方法总结(命令行) &period;(转载)

    原文地址:http://blog.csdn.net/hongshan50/article/details/236630433 Git工程迁移方法总结 Git工程迁移方法总结 Git最近准备迁移一下位置 ...

  6. git仓库迁移的两种解决方案

    Git仓库迁移而不丢失log的方法 要求能保留原先的commit记录,应该如何迁移呢? 同时,本地已经clone了原仓库,要配置成新的仓库地址,该如何修改呢? 注意:如果使用了代码审核工具Gerrit ...

  7. git仓库迁移的解决方案

    一.问题 在github中遇到感兴趣的项目,直接克隆下来,随着兴趣越来越浓,在本地做了些修改,后来干脆想fork到自己的github仓库,又要把本地的修改提交到fork后的自己的github仓库中.这 ...

  8. git文件迁移到新架构

    环境: ubuntu16.04 代码托管地址:git.oschina.net 迁移原因: git上某工程是一堆静态页面html,因为在ubuntu下缺乏git图形客户端,想使用eclipse集成的gi ...

  9. git仓库迁移

    最近,装了git的本地服务器坏掉了, 没办法只能临时进行仓库的迁移  保证项目正常进行 在项目的根目录执行右键执行 查询当前仓库的远程地址 git remote -v 查看现有远程仓库的地址url 修 ...

随机推荐

  1. SQL执行效率和性能测试方法总结

    对于做管理系统和分析系统的程序员,复杂SQL语句是不可避免的,面对海量数据,有时候经过优化的某一条语句,可以提高执行效率和整体运行性能.如何选择SQL语句,本文提供了两种方法,分别对多条SQL进行量化 ...

  2. java内存泄漏的定位与分析

    1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...

  3. javascript 数组的深度复制

    javascript 数组的深度复制 一般情况下,使用 "=" 可以实现赋值.但对于数组.对象.函数等这些引用类型的数据,这个符号就不好使了. 1. 数组的简单复制 1.1 简单遍 ...

  4. ORACLE中主键约束跟唯一索引的区别

    分类: DB 2011-12-03 21:34 611人阅读 评论(0) 收藏 举报 oracleconstraintsimmutableusertabledomain 1.  分别用两种方法创建主键 ...

  5. Firemonkey 原生二维码扫描优化

    之前用了ZXing的Delphi版本,运行自带的例子,速度非常慢,与安卓版本的相比查了很多,因此打算使用集成jar的方法,但是总觉得美中不足. 经过一番研究,基本上解决了问题. 主要有两方面的优化: ...

  6. 20181115 python-第一章学习小结part2

    Python基本知识 变量,用来存储中间计算结果,在后面可进行调用被使用的东西,叫做变量. 变量的命名规则: 字母,数字,下划线组合 不能用数字开头 常见的关键字不能用啊 常量,不会变的量,称作常量. ...

  7. &lbrack;UnityShader效果&rsqb;01&period;Mask

    参考链接: https://blog.csdn.net/akof1314/article/details/50428200 1.Mask.shader // Unity built-in shader ...

  8. 阿里云-AliRepo

    <mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name&g ...

  9. centos6安装python3&period;6&period;4

    安装Python依赖包: [root@Python src]# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlit ...

  10. Oracle垃圾数据清理相关问题 分类: Oracle 2015-08-06 11&colon;14 12人阅读 评论&lpar;0&rpar; 收藏

    垃圾数据清理,简单的说,就是删除不需要的那些数据,释放存储空间 最常用的就是delete命令.truncate命令,甚至是删除表空间重建,具体操作都很简单,不是本文的重点 下面,总结几个垃圾数据清理常 ...