
Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的分布式版本控制软件,它不同于Subversion、CVS这样的集中式版本控制系统。在集中式版本控制系统中只有一个仓库(repository),许多个工作目录(working copy),而像Git这样的分布式版本控制系统中(其他主要的分布式版本控制系统还有BitKeeper、Mercurial、GNU Arch、Bazaar、Darcs、SVK、Monotone等),每一个工作目录都包含一个完整仓库,它们可以支持离线工作,本地提交可以稍后提交到服务器上。分布式系统理论上也比集中式的单服务器系统更健壮,单服务器系统一旦服务器出现问题整个系统就不能运行了,分布式系统通常不会因为一两个节点而受到影响。
因为Android是由kernel、Dalvik、Bionic、prebuilt、build等多个Git项目组成,所以Android项目编写了一个名为Repo的Python的脚本来统一管理这些项目的仓库,使得Git的使用更加简单。
这几天William为了拿Android最新的sourcecode,学习了一下git和repo的一些基本操作,整理了一个如何取得Android代码的How-To,今天把他贴上来。
1、Git的安装
在Ubuntu 8.04上安装git只要设定了正确的更新源,然后使用apt-get就可以了,有什么依赖问题,就让它自己解决吧。其中cURL是一个利用URL语法在命令行下工作的文件传输工具,会在后面安装Repo的时候用到。
sudo apt-get install git-core curl
2、安装Repo
首先确保在当前用户的主目录下创建一个/bin目录(如果没有的话),然后把它(~/bin)加到PATH环境变量中
接下来通过cURL来下载Repo脚本,保存到~/bin/repo文件中
curl http://android.git.kernel.org/repo >~/bin/repo
别忘了给repo可执行权限
chmod a+x ~/bin/repo
3、初始化版本库
如果是想把Android当前主线上最新版本的所有的sourcecode拿下来,我们需要repo的帮助。
先建立一个目录,比如~/android,进去以后用repo init命令即可。
repo init -u git://android.git.kernel.org/platform/manifest.git
这个过程会持续很长的时间(至少可以好好睡一觉),具体要多少时间就取决于网络条件了
最后会看到 repo initialized in /android这样的提示,就说明本地的版本库已经初始化完毕,并且包含了当前最新的sourcecode。
如果想拿某个branch而不是主线上的代码,我们需要用-b参数制定branch名字,比如:
repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
另一种情况是,我们只需要某一个project的代码,比如kernel/common,就不需要repo了,直接用Git即可。
git clone git://android.git.kernel.org/kernel/common.git
这也需要不少的时间,因为它会把整个Linux Kernel的代码复制下来。
如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.get的代码,那就先进入到common目录,然后用下面的命令:
git checkout origin/android-goldfish-2.6.27 -b goldfish
这样我们就在本地建立了一个名为goldfish的android-goldfish-2.6.27分支,代码则已经与android-goldgish-2.6.27同步。我们可以通过git branch来列出本地的所有分支。
4、同步版本库
使用epo sync命令,我们把整个Android代码树做同步到本地,同样,我们可以用类似
repo sync project1 project2 …
这样的命令来同步某几个项目
如果是同步Android中的单个项目,只要在项目目录下执行简单的
git pull
即可。
5、通过GitWeb下载代码
另外,如果只是需要主线上某个项目的代码,也可以通过GitWeb下载,在shortlog利用关键字来搜索特定的版本,或者找几个比较新的tag来下载还是很容易的。
Git最初是为Linux内核开发而设计,所以对其他平台的支持并不好,尤其是Windows平台,必须要有Cygwin才可以。现在,得益于msysgit项目,我们已经可以不需要Cygwin而使用Git了。另外,Git Extensions是一个非常好用的Windows Shell扩展,它能与资源管理器紧密集成,甚至提供了Visual Studio插件。它的官方网站上有一分不错的说明文档,感兴趣的朋友可以看一看。
至于Git的参考文档,我推荐Git Magic,这里还有一个Git Magic的中文版。
基本上每次来到你的博客都像刘姥姥进了大观园,知道到处都是好东西,可是自己又不敢动手碰,主要还是不懂,呵呵。
评论 by 月夜 — 2009-04-29 @ 18:34
其实纯软件的东西怎么弄都没关系
大不了就是把系统搞暴而已,呵呵
评论 by William Hua — 2009-04-30 @ 10:05
这个你也懂!
评论 by Chocolly — 2009-05-08 @ 09:39
@Chocolly
不懂可以学啊,呵呵
评论 by William Hua — 2009-05-08 @ 11:26
通过代理访问,curl出错,但是apt-get 就可以,这是为什么?
评论 by 漫步 — 2009-07-03 @ 17:32
@漫步
不是很清楚你的具体环境
针对这里的操作,可以用浏览器打开repo的路径,另存就可以了
评论 by William Hua — 2009-07-04 @ 00:06
Hello,昨天遇到一个问题,我在下载好的android源码的kernel目录下做了一些编译工作,但是没有成功,我以为是不是最新源码的问题,于是执行repo sync,希望重新获得一套新的源码,但是由于我的kernel目录下做了相关的操作,系统就提示我需要将这些操作进行提交才可以,我当然不希望提交了,只是本地的一些实验而已。
于是,干脆就将kernel目录全部删除,想这样总可以了吧,但是问题一下子来了。反正就是不能下载到kernel了。
试了很多方法,包括直接mkdir kernel,将以前备份好的kernel再次拷贝回去,通通不行。
最后,将备份好的kernel拷贝回去后,可以repo sync了,但是发现最终repo sync的结果是将kernel整个目录删除了,而且再次repo sync,还是说是完整的,简直晕掉了。
然后又做了一个新的目录,将repo init -u git://android.git.kernel.org/platform/manifest.git和repo sync重新做了一遍,下了我一个晚上啊一个晚上。。。今天早上起来检查,还是没有kernel目录,其他几个目录都有,不清楚到底git是什么原理,怎么检查,因为以前使用svn,似乎还是比较方便,这个就不太知道怎么搞了。
在这里看到git clone git://android.git.kernel.org/kernel/common.git这个命令,搞过来试一试,现在还在下载中,不知道这个能不能搞定,我可不想因为这个重装系统~
William,如果你知道上面我出现的情况是什么原因,能否告知一二,现在在整源码,git文档还没来得及看,多谢多谢
评论 by thinkinnight — 2009-07-19 @ 06:43
使用了git clone git://android.git.kernel.org/kernel/common.git之后,下载了一堆东西,看来是kernel,但是很奇怪,目录名使用的是common,让我一开始没有找到
而且目录下,我要找的arch/arm/mach-goldfish并没有出现,去http://android.git.kernel.org/发现有四个kernel相关的git文件,这四个是否都需要下呢?
还有问题就是,我能否将common改名为kernel?
哈,问题好多啊,大家一起研究研究?
评论 by thinkinnight — 2009-07-19 @ 07:41
@thinkinnight
你好,抱歉今天才回复,看来你是蛮着急的
使用git clone git://android.git.kernel.org/kernel/common.git下载下来的目录名是common是正常的,因为在git里它的项目名就叫common。
Android代码树中有四个和kernel相关的项目,包括common.git、experimental.git、msm.git以及omap.git,其中msm.git和omap.git看名字就知道是为高通的MSM系列和TI的OMAP西类SOC专门修改的kernel版本,experimental.git为实验性项目,所以一般我们都是拿common.git。
最后,如果你要找arch/arm/mach-goldfish(即你需要的是带有goldfish版本的kernel),在执行git clone git://android.git.kernel.org/kernel/common.git拿到common.git的代码后在本地用
git checkout origin/android-goldfish-2.6.27 -b goldfish 切换一下branch即可,这点在我上面的文章中有提到。
评论 by William Hua — 2009-07-20 @ 11:35
多谢William你的回答,呵呵,在做事上我喜欢一口气做下去,遇到哪个block住的地方,就感觉有些着急了,大概。尤其是做android,多件事情一起在做,发现没有时间研究git,找到你这么一个比较好的介绍的地方,又是中文,就来求助了,呵呵。
我主要是看到有文章写到最新的内核源码已经到了2.6.29,所以对你文章里面使用git checkout origin/android-goldfish-2.6.27 -b goldfish来得到goldfish这个分支有些疑惑,我也猜想是通过这个得到goldfish分支的,但是有不少疑问在里面。
1. 我使用git clone git://android.git.kernel.org/kernel/common.git得到的内核代码看,还是取得的是2.6.27的,是我取得有问题,还是现在的确是2.6.27的内核代码?
2. git checkout origin/android-goldfish-2.6.27 -b goldfish是否说明goldfish就是基于2.6.27的内核的呢?因为以前似乎是2.6.25的内核,现在是升级过来,这个关系是怎样的呢?
3. git checkout origin/android-goldfish-2.6.27 -b goldfish是创建了一个branch,我按照这个做,的确是得到了mach-goldfish,但是以前我没有这么做,也一样编译出了emulator,按照以前参考的一些文章的说法,goldfish是针对emulator做的一个ARMV5的架构修改,那原本没有goldfish,make出来可以运行的emulator使用的kernel是使用的什么配置呢?被搞得比较疑惑了。
真是不好意思,问题一堆,能否推荐一些站点,我自己去看,如果问题太多,而没有时间回答的话,其实邮件列表里面信息也很多,但是比较零碎,还没有专门抽出时间来看掉,如果有专门的网页会好些,谢谢了。
评论 by thinkinnight — 2009-07-20 @ 19:43
@thinkinnight
你好,
1、你取到的代码没有问题,当前common.git中的主线还是2.6.27,29是开发分支
2、goldfish有基于2.6.27的版本,也有基于更新的2.6.29的版本,25和23都是很早以前了。这么说吧,goldfish内核基本上只是针对Android模拟器添加了相应虚拟设备的驱动而已,所以只要有2.6.27的标准内核,就会有2.6.27的goldfish内核,29也一样。
3、这条命令是把本地的git版本库切换到goldfish分支(而不是创建)。至于编译emulator,这和kernel没有实质的联系,emulator是google在qemu的基础上添加了特有的goldfish虚拟设备并给target-arm添加了一些新的指令集而来的,它的编译与kernel无关。emulator运行起来以后,会载入你所编出来的kernel(通过-kernel参数),如果你用的不是goldfish的kernel,这些新添加的虚拟设备就没有driver来驱动了。
这方面的问题我有接触,尽管问吧,把我问倒了我去讨论组找答案,呵呵
评论 by William Hua — 2009-07-23 @ 00:59
呵呵,首先谢谢William的回答了。那我有问题就放心问了,哈哈。
你的回答就是我想要了解的答案,看了之后感觉清楚多了。
不过对于最后一个还有些疑问,我知道emulator是在qemu的基础上搞出来的,相当于虚拟硬件,而通过emulator -kernel等参数,将kernel放入emulator中运行,不过我源码到手后(主线的源码),就直接进行了make,记得emulator也能够启动进入android系统,按照我的想法,那肯定也是通过-kernel参数加上某个kernel的位置来运行的,那这里我使用的kernel是在哪里呢?那既然不是goldfish的kernel,那又是标准的kernel吗?还是MSM的?还是什么的呢?
谢谢
哦,还有,是不是可以给你发邮件啊?问题描述起来总是比较多的,在评论里面有时会写很多内容,呵呵。或者两种方式一起交流?
评论 by thinkinnight — 2009-07-23 @ 10:49
@William Hua
其实我觉得你应用回答说“略懂”
《赤壁》的老诸总这样回答啊
评论 by chocolly — 2009-07-26 @ 22:22
@thinkinnight
你好,理论上,用标准的kernel也能够用emualtor引导起来
只是所使用的虚拟设备和goldfish kernel不同而已
我亲自实践过,确实可以进入系统
emulator有一个默认的查找kernel的路径,所以如果你的kernel正好在那里的话,不加-kernel参数也没问题(某个环境变量似乎有一样的效果,没实践过,不太记得了:P)
邮件当然没问题,gtalk也可以,我一般都在线
评论 by William Hua — 2009-07-29 @ 19:09
[...] 本文转自William Hua的Blog,原文在此。 [...]
Pingback by Android开发环境的建立(3) « suny的世界 — 2009-09-01 @ 15:22
您好!
我有个问题想向您请教一下:我用repo sync同步完源码后,为什么在system/core/目录下没有mountd子目录?
谢谢!!
评论 by 弹 — 2009-11-18 @ 17:41
hi,
我在Windows下用git下载一个Email app的源码
比如我想下载针对模拟器android-1.6_r2的源码,我看有个tags是android-1.6_r2,如何下载这个版本的源码了?git命令是怎样的了?
谢谢
评论 by cxz — 2009-12-11 @ 21:38
[...] 本文转自William Hua的Blog,原文在此。 [...]
Pingback by Android开发环境的建立(3)——获取Android源代码【转贴】 » 不然你要我怎么样 — 2009-12-17 @ 00:04
[...] 请先参考我的另一篇文章如何取得Android源代码,确保正确地拿到了Android kernel/common项目的 Goldfish分支(该分支用于构建运行在emulator上的系统内核,而主线则是用于构建运行在实际设备上的内核代码)上的内核代码。另外,需要提 醒一下大家的是Android的sourcecode目前只能在Linux或者Mac OS下做交叉编译编译,Windows并没有被支持,以下将以Ubuntu 8.04为Host OS来说明。 [...]
Pingback by 【转贴】如何构建Android 1.5 Linux内核映像 » 不然你要我怎么样 — 2009-12-19 @ 00:22
[...] 转自:http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/ [...]
Pingback by tek-life » [转]Git和Repo扫盲——如何取得Android源代码 — 2010-02-12 @ 13:16
您好!
我想知道,我该如何开始接触android的更低一点的层,或者开始学习源码?我是不是需要一个linux环境,我是不是该先学习linux。
谢谢!
我的基本介绍:
我对android的API 已经有一定的了解,使用上没有什么问题,我已经做过几个android的实际应用。
我懂c++,java ,不懂Linux
评论 by 初学者 — 2010-03-09 @ 13:50
[...] 请先参考如何取得Android源代码一文,通过repo来取得当前最新的android主线代码(或者拿名为android-SDK-1.5_r1的tag也无妨)。 [...]
Pingback by 【转贴】如何构建Android 1.5系统映像 » 不然你要我怎么样 — 2010-03-19 @ 17:35
你好
我按照文中的步骤进行操作
执行完
repo sync
之后
我等了一天
并没有在Android目录下看到下载的东西
请问这是怎么回事
评论 by songyinghao — 2010-05-10 @ 12:10
@songyinghao
William大虾,对,我也是这种情况,执行
repo init -u git://android.git.kernel.org/platform/manifest.git 命令后,它只是进行了初始化安装,获取了我的name和email,并没有进行下载;
而执行repo sync后,看似在搜索下载,可等了一晚上,发现目录里什么也没有! 这是怎么回事,救命阿!
评论 by Lazy Cat — 2010-05-26 @ 09:58
@Lazy Cat
没有下载完,那个目录下是空的。好像是放在那个缓冲里了,我一直在找这个缓冲,谁知道在哪里?
评论 by ine — 2010-07-01 @ 10:08
@Lazy Cat
repo init确实只是初始化,repo sync才会下载
网络不佳时,确实会碰到下了一半短线的情况,只能重试
或者些个脚本一直try
下载完了以后会把内容checkout出来这是你才能看到
而之前,都在.repo目录下
评论 by William Hua — 2010-08-13 @ 20:09
@初学者
先试试把emulator编出来吧
然后可以改改framework
评论 by William Hua — 2010-08-13 @ 20:10
最简单的办法,就是在gitweb上操作,直接下这个snapshot
评论 by William Hua — 2010-08-13 @ 20:10
[...] 第二部分 推荐的文章:http://www.mcuol.com/Edu/264/29748.htm && http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/ [...]
Pingback by 猫左羽右 » 从零开始学习Android之环境配置 — 2010-10-16 @ 02:02
你好,william看了你上面的文章介绍如何使用git下载Android的源码,让我在以前的基础上又多了一些更多的了解。在这里我想请教你一个问题,我下载的源码都已经编译完了(kernel 2.6.29),但是下载道板子上的时候没有任何图像出现,用串口调试也仅仅是出现一些启动信息。因为没有触摸屏,所以想把它通过TV输出,在网上查了一下方法,有人说是改framebuffer里的Fb,让其指到TV的设备上,这样就可以了,也有人说在Android中修改js文件,两种方法我都试了,但是没有成功。现在是找不到思路了,请问这种情况,我应该怎么去修改,让其出现在显示屏上,谢谢!
评论 by bevis — 2010-12-03 @ 09:58
[...] 转自:http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/ [...]
Pingback by [转]如何取得Android源代码 | Hi Java! — 2010-12-04 @ 15:32
[...] 请先参考我的另一篇文章如何取得Android源代码,确保正确地拿到了Androidkernel/common项目的Goldfish分支(该分支用于构建运行在emulator上的系统内核,而主线则是用于构建运行在实际设备上的内核代码)上的内核代码。另外,需要提醒一下大家的是Android的sourcecode目前只能在Linux或者Mac OS下做交叉编译编译,Windows并没有被支持,以下将以Ubuntu 8.04为Host OS来说明。 [...]
Pingback by » Blog Archive » 如何构建Android 1.5 Linux内核映像 — 2011-01-07 @ 03:20
[...] 源文档 <http://www.williamhua.com/2009/04/29/git-and-repo-for-dummies/> [...]
Pingback by [转]Git和Repo扫盲——如何取得Android源代码 | { yeah : 必须哒 } — 2011-01-27 @ 11:48
[...] —————————————– 参考资料:Git和Repo扫盲——如何取得Android源代码 [...]
Pingback by Launcher源码初探_How Android » How Android — 2011-03-02 @ 00:07
楼主神人,膜拜。
评论 by rickystudio — 2011-03-18 @ 20:29
在windows下用git+脚本下载成了,但源码很乱,分析目录估计都得很长时间。目前还没有编译,在寻找 platforms 中的android.jar 源码.
评论 by Mr.TianShu — 2011-05-24 @ 21:19
“如果需要某个branch的代码,用git checkout即可。比如我们刚刚拿了kernel/common.get的代码,那就先进入到common目录,然后用下面的命令:”
kernel/common.get笔误,应该为kernel/common.git
评论 by tek-life — 2011-05-26 @ 16:06
@tek-life
多谢指正!
评论 by William Hua — 2011-07-04 @ 09:27
主要来复习下repo。。。
评论 by walfred — 2011-07-04 @ 14:16
第三步 初始化没有多长时间的
关键是在同步 repo sync需要花很多时间的
评论 by walfred — 2011-07-04 @ 14:20