问题背景

目前有一个 Android 和 一个 iOS 项目,两个项目底层使用相同的 C++ 代码。由于在开发迭代中代码时常更新,而且往往是今天 Android 部分修改一小部分,明天 iOS 部分修改一小部分,导致这一套代码渐渐显得有些无法管理。于是我考虑单独建一个 Git 仓库来管理这份代码。

Android 和 iOS 项目各自已经是一个 Git 仓库,出于团队的考虑,不能修改原来的结构,只好重新创建仓库。

Git bare 仓库

假设本地已经有一个普通的 Git 仓库,此时使用git clone命令 clone 一个新的仓库,这两个仓库里面的内容是一样的,包含所有的文件(工作区)和版本库(.git 文件夹),我们称之为对等的,也就是说本质上没有区别。但是不方便的地方在于只能新建的仓库只能git pull从原仓库拉取更新,而不能git push提交修改,会有如下报错:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: is denied, because it will make the index and work tree inconsistent
remote: with what you pushed, and will require 'git reset --hard' to match
remote: the work tree to HEAD.
remote:
remote: You can set 'receive.denyCurrentBranch' configuration variable to
remote: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: its current branch; however, this is not recommended unless you
remote: arranged to update its work tree to match what you pushed in some
remote: other way.
remote:
remote: To squelch this message and still keep the default behaviour, set
remote: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

提交被拒绝。那么也就是说新建的仓库其实就是原来的一个备份。当然原仓库使用git push去更新那个新的仓库同样也是不行的,能做的只有新仓库使用git pull从原来的拉取更新。

鉴于以上情况,我们需要使用裸版本库(bare repository)来做我们要做的事。bare repository 没有工作区(即需要版本控制的文件),只有版本库(即 .git 文件夹)。首先初始化中心的裸版本库

git init --bare center.git

然后在其他地方分别 clone 即可。

git clone ../demo-center/center.git android-bak
git clone ../demo-center/center.git ios-bak

clone 两次我就建立了两个新的仓库,分别用于两个项目。

版本控制实践

那么具体的控制两处代码的方法是怎么样的呢?

每次修改了代码以后,将代码同步至相应的备份文件夹,即 git 仓库,然后进行提交,另一个仓库拉取更新并将代码同步至原来的项目中。

例如 Android 项目代码位于project/android/, iOS 项目代码位于project/ios/。然后同步的

git 仓库分别为 android-bak and ios-bak。那么 Android 代码更新后,同步至 android-bak 目录,提交代码并 push,同时 iOS 代码也有更新,同样更新至 ios-bak,然后本地提交代码,注意,此时需要先从 bare repository pull 一下,和本地的 commmit 合在一起了,再 push 上去。那么来自两个仓库的代码更改稳妥地合在一起了。另一边 android-bak 只需要 pull 一下,然后将更新的代码同步至原来的 project/android/ 即可。


参考:

《Git 权威指南》 蒋鑫

Git: 本地创建版本库用于多处同步的更多相关文章

  1. git入门 创建版本库, 版本管理 分支 标签

    参考: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 GIT最流行的分布式版本 ...

  2. Git学习之路(2)-安装GIt和创建版本库

    ▓▓▓▓▓▓ 大致介绍 前面一片博客介绍了Git到底是什么东西,如果有不明白的可以移步 Git学习之路(1)-Git简介 ,这篇博客主要讲解在Windows上安装Git和创建一个版本库 ▓▓▓▓▓▓ ...

  3. 学习笔记--Git安装 创建版本库 图文详解

    一.Git下载 在Windows上安装git,一般为msysgit,官网地址:http://git-scm.com/ 我下载的是Git-1.9.2-preview20140411.exe 二.Git安 ...

  4. Git学习--创建版本库

    什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或 ...

  5. [git]入门-创建版本库

    转载整理自:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256 ...

  6. Git学习第一天--安装Git和创建版本库

    Windows上安装Git msysgit是Windows版的Git,从https://git-for-windows.github.io下载(备份:百度网盘),然后按默认选项安装即可. 安装完成后, ...

  7. git之创建版本库

    好吧,你知道了git既然有这么多好处,那么我们接下来就可以使用git命令来创建我们的仓库.这一节我们来学习一下如何在windows下面建立自己的仓库.首先我们先在本地创建一个主目录,比如文件名字叫le ...

  8. 安装 git,并创建版本库 记录一下

    参考大神网址: http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/001374325 ...

  9. Git学习笔记(一)创建版本库并添加文件

    最近从廖雪峰老师的个人网站上学习git,做点笔记. ★★★★★ 先注册自己的username和email,否则会报如下错误: 注册:git config --global user.name &quo ...

随机推荐

  1. winform socket编程之TCPListener

    运行结果: 服务端代码 using System; using System.Collections.Generic; using System.ComponentModel; using Syste ...

  2. linux下安装运行LoadrGenerator

    注:在LoadGenerator的安装使用的过程,涉及到了shell变量与环境变量.用户使用的当前shell.创建用户等一系列的linux操作系统的问题,关注我后续的博客,会为大家继续讲解这些问题. ...

  3. Mysql无法启动 InnoDB: Attempted to open a previously opened tablespace

    win2008,Mysql5.6,mysql服务无法启动 查看事件日志,报错InnoDB: Attempted to open a previously opened tablespace 最终解决方 ...

  4. JavaScript图片库(简单的应用案例)

    这个图片库小例子的效果如图所示,点击网页上某个图片链接时你将看到两种效果:占位符图片呗替换成这个链接所指向的图片,同时描述性文字也被替换为这个链接的title属性值.     利用一个简单的图片库应用 ...

  5. 解决Fiddler出现无线弹框 "creation of the root certificate was not successful”的问题

    打开Fiddler 访问:http://localhost:8888/ 安装证书,如果提示没有证书(8888是你在Tool->Fiddler Option->Connections设置的F ...

  6. [整理]Linux Crontab命令总结

    一.crontab命令的基本介绍 crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab" ...

  7. 高可用高性能分布式文件系统FastDFS进阶keepalived+nginx对多tracker进行高可用热备

    在上一篇 分布式文件系统FastDFS如何做到高可用 中已经介绍了FastDFS的原理和怎么搭建一个简单的高可用的分布式文件系统及怎么访问. 高可用是实现了,但由于我们只设置了一个group,如果现在 ...

  8. html笔记2

    html css的用法 <style type="text/css">代表我要使用css了 <html> <head> <style ty ...

  9. MongoDB(一)环境搭建与初始配置

    前言 最近的项目中需要用到MongoDB,所这段时间需要学习知道怎么去使用这个数据库. 这里我先简单的介绍一下什么是MongoDB,后面还会详细的介绍: MongoDB 是一个面向文档的通用型数据库, ...

  10. CTF---密码学入门第五题 传统知识+古典密码

    传统知识+古典密码分值:10 来源: 霜羽 难度:易 参与人数:2297人 Get Flag:735人 答题人数:938人 解题通过率:78% 小明某一天收到一封密信,信中写了几个不同的年份     ...