转载,但忘掉网址了,对原创者表示歉意,如不妥,请发信!
如何取得 Android 源代码 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、同步版本库 使用 repo 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 的中文版。
1. Git Config:
$ git config --global user.name "Shilin Yi"$ git config --global user.email "
[email protected]"
配置git的参数变量,它可以带以下2个参数:
--system,针对系统的所有用户的,对应的配置文件在/etc/gitconfig
--global,针对系统当前用户的,对应的配置文件在~/.gitconfig
不带参数,针对当前git仓库的,对应的配置文件在.git/config
如果在个人pc上使用git,加上参数--global即可
如果在公共服务器上使用git,则一定不要带那2个参数
2. Git push
$ git push ssh://
[email protected]/rt4ls.git master // 把本地仓库提交到远程仓库的master分支中
与以下两条语句相同:
添加一个标记,让origin指向ssh://
[email protected]/rt4ls.git,也就是说你操作origin的时候,实际上就是在操作ssh://
[email protected]/rt4ls.git。origin在这里完全可以理解为后者的别名
$ git remote add origin ssh://
[email protected]/rt4ls.git$ git push origin master
默认情况下这条语句等价于提交本地的master branch到远程仓库,并作为远程的master分支
$ git push origin test:master // 提交本地test分支作为由origin指向的远程的master分支$ git push origin test:test // 提交本地test分支作为由origin指向的远程的test分支如果想删除远程的分支呢?类似于上面,如果:左边的分支为空,那么将删除:右边的远程的分支。$ git push origin :test // 刚提交到远程的test将被删除,但是本地还会保存的,不用担心
3. 远程分支
我们用 (远程仓库名)/(分支名) 这样的形式表示远程分支
$ git branch -r origin/HEAD -> origin/master origin/master$ git remote -vorigin
[email protected]:yottaa/router-fm.git (fetch)origin
[email protected]:yottaa/router-fm.git (push)$ git fetch origin fetch由origin标示的远程
[email protected]:yottaa/router-fm.git到本地的origin/master上(但是你不能修改origin/master上的内容)说明:这里origin使默认的名字,你也可以取别的名字
4. Git pull/fetch
git fetch origin master:test #从origin指定的远程获取最新的版本到本地的test分支上,不会自动进行merge
git pull origin master #从origin指定的远程获取最新的版本到本地,并自动进行merge到本地当前分支上
Git配置KDiff3
文章分类:软件开发管理
Git支持很多merge工具, 我习惯用KDiff3
配置命令如下
git config --global -l
查看已经配置了什么merge工具
如果没有merge.tool和mergetool.kdiff3.path
则输入
git config --global --add merge.tool kdiff3
git config --global --add mergetool.kdiff3.path "D:/Program Files/KDiff3/kdiff3.exe"
路径根据你的安装位置
如果有
则输入
git config --global merge.tool=kdiff3
git config --global mergetool.kdiff3.path="D:/Program Files/KDiff3/kdiff3.exe"
repo的用法(zz)
注:repo只是google用Python脚本写的调用git的一个脚本,主要是用来下载、管理Android项目的软件仓库。(也就是说,他是用来管理给git管理的一个个仓库的)
下载 repo 的地址: http://android.git.kernel.org/repo ,可以用以下二者之一来下载 repo
wget http://android.git.kernel.org/repo
或者
curl http://android.git.kernel.org/repo > ~/bin/repo
下载完成后须修改repo的权限: chmod a+x ~/bin/repo
用repo sync 在抓去 android source code 的时候,会经常出现一些错误导致 repo sync 中断,每次都要手动开始。 可以用如下的命令,来自动重复
$?=1;
while [ $? -ne 0 ] ;
do repo sync ;
done
获取帮助:
repo help [ command ] //显示command 的详细的帮助信息内容
示例: repo help init 来获取 repo init 的其他用法
repo init -u URL 用以在当前目录安装 repository ,会在当前目录创建一个目录 ".repo" -u 参数指定一个URL, 从这个URL 中取得repository 的 manifest 文件。
示例:repo init -u git://android.git.kernel.org/platform/manifest.git
获取的manifest文件放在.repo目录中。命名为manifest.xml。这个文件的内容其实就是所有被git管理的仓库的列表!
可以用 -m 参数来选择获取 repository 中的某一个特定的 manifest 文件,如果不具体指定,那么表示为默认的 namifest 文件 (default.xml)
repo init -u git://android.git.kernel.org/platform/manifest.git -m dalvik-plus.xml
(有诸多供我们选择的manifest文件,所有的manifest文件都放在目录.repo/manifests中,该目录本身亦被git所管理,你可以cd进去看看)
可以用 -b 参数来指定某个manifest 分支。
repo init -u git://android.git.kernel.org/platform/manifest.git -b release-1.0
你会发现.repo/manifests是个被git管理的仓库,这里放的是所有的manifest文件(*.xml),因为被git管理,固然有分支,-b可以切换到你想要的分支然后再下载相关的xml文件,当然具体下载那个xml还要看-m参数了,所以如果你仅仅指定-b而没有-m的话,就是下载-b指定分支下的default.xml文件
如果不指定-b参数,那么会默认使用master分支
4. repo sync [project-list]
下载最新本地工作文件,更新成功,这本地文件和repository 中的代码是一样的。 可以指定需要更新的project , 如果不指定任何参数,会同步整个所有的项目。
如果是第一次运行 repo sync , 则这个命令相当于 git clone ,会把 repository 中的所有内容都拷贝到本地。 如果不是第一次运行 repo sync , 则相当于 git remote update ; git rebase origin/branch . repo sync 会更新 .repo 下面的文件。 如果在merge 的过程中出现冲突, 这需要手动运行 git rebase --continue
5. repo update[ project-list ]
上传修改的代码 ,如果你本地的代码有所修改,那么在运行 repo sync 的时候,会提示你上传修改的代码,所有修改的代码分支会上传到 Gerrit (基于web 的代码review 系统), Gerrit 受到上传的代码,会转换为一个个变更,从而可以让人们来review 修改的代码。
6. repo diff [ project-list ]
显示提交的代码和当前工作目录代码之间的差异。
7. repo download target revision
下载特定的修改版本到本地, 例如: repo download pltform/frameworks/base 1241 下载修改版本为 1241 的代码
8. repo start newbranchname .
创建新的branch分支。 "." 代表当前工作的branch 分支。
9. repo prune [project list]
删除已经merge 的 project
10. repo foreach [ project-lists] -c command
对每一个 project 运行 command 命令
12. repo forall -c
11. repo status
显示 project 中每个仓库的状态,并打印仓库名称。