只用git命令也能正常拉仓库,上传代码,repo集成了一些功能?
小型项目(例如3个算法(dsp+FPGA),3个bsp,2个上层)需要用git管理代码吗,或者有其他合适的工具吗
kernel级项目属于大型项目
repo是Google开发的用于管理Android版本库的一个工具,repo是使用Python对git进行了一定的封装,并不是用于取代git,它简化了对多个Git版本库的管理。用repo管理的版本库都需要使用git命令来进行操作。
repo下载安装
下载地址:https://mirrors.tuna.tsinghua.edu.cn/git/git-repo ,将下载下来的文件命名为repo,放在PATH环境变量所包含的目录下面,例如可以放在/usr/local/bin目录下(后面介绍均以放在/usr/local/bin目录下为例)。
其实下载下来的repo文件只是一个使用Python编写的引导脚本(Google 称之为 Repo launcher,本质上是一个python脚本,可以使用vim打开的),完整的repo(即,repo的主体部分)还没有下载。repo还未安装,需要执行repo init
安装。(需要注意repo init
需要跟参数的,后面会单独介绍repo init
的使用)这里就会涉及到一个问题,repo的主体部分是从哪里下载的?其实查看repo的引导脚本(/usr/local/bin/repo)可以发现,repo主体部分默认从https://gerrit.googlesource.com/git-repo获取(即,执行repo init命令时,不设置--repo-url选项),这个网站需要科学上网才可以访问。
1,实际使用中我们会遇到一些具体repo指令不能用
导致你提交不了代码,合并不了分支啥的
1.1repo init
repo init [options] [manifest url]
repo init -u manifest_git_path -m manifest_file_name -b branch_name --repo-url=repo_url --no-repo-verify
repo init -u ssh://xxx@git.mioffice.cn:29418/platform/manifest.git -b master-u -m default.xml --repo-url=ssh://xxx@git.mioffice.cn:29418/tools/repo.git --depth=1 --no-repo-verify
命令效果:
首先当前目录产生一个.repo目录
然后克隆一份repo的源代码到.repo/repo下,里面存放了其他repo子命令,即repo的主体部分。
接着从manifest_git_path仓库地址clone清单库到.repo/manifests和.repo/manifests.git目录。
同时.repo目录下还包括manifest仓库(清单库)内容
常用选项:
-u:指定Manifest库的Git访问路径。唯一必不可少的选项
-m:指定要使用的Manifest文件。不指定的话,默认为default.xml文件
-b:指定要使用Manifest仓库中的某个特定分支(例如手机仓库很大,你可以单独拉kernel下某个文件夹的代码)。
--repo-url:指定repo的远端repoGit库的访问路径。
--no-repo-verify:指定不要验证repo源码。
--mirror:创建远程存储库的副本,而不是客户端工作目录。该选项用于创建版本库镜像。使用该选项则在下一步repo sync同步时,本地按照源的版本库组织方式进行组织,否则会按照 manifest.xml 指定的方式重新组织并检出到本地
执行repo init
命令之后,会在当前目录创建一个.repo
文件夹。manifests manifest仓库(清单库)内容,即repo init
的-u
选项对应的仓库。manifest文件是用XML文件的格式记录了本项目依赖的各个Git仓库的名称、地址,以及分支等信息。
1.2repo sync
repo init后就可以拉代码了,repo sync -j6 -d -c --no-tag会将整个项目下载下来,也可以单独下载某个文件夹的
命令为下载的整个manifest的所有仓库都创建分支,例如 ”repo start k8 --all“,会每一个仓库都会创建k8这个分支
1.3 添加本地分支
repo start k8 --all k8就是自己的本地仓库名字 可以自己起名字
1.3 git 如何只下载一个仓库并且提交修改
在这里记录两个单独下载一个仓库的办法
1.3.1、直接去Gerrit里下载一个
这里使用charge_logger_new 举例,如果要修改这个仓库东西而且不需要修改其他文件的话,就可以先去Gerrit搜索一下相关提交
点击这里查看仓库信息,还可以顺便看看这里其他人的提交。确定一下是不是自己需要的仓库
然后再点击这个,我们马上就可以下载这个仓库了
选择第一个复制粘贴去终端,按下Enter,就可以下载这个仓库了
这里会发现clone下来没有文件,是因为我们没有checkout,没有追踪需要的远端分支
确认一下确实是主分支,然后我们就可以追踪一下想要的远端
我们追踪了远端之后就有了所需的代码,如果要是不放心我们可以再pull一下看看有没有未更新的
1.3.2 使用 repo sync 仓库路径 拉取仓库
有些时候不是很确定要怎么在Gerrit里搜索,但是我们知道路径而且repo init了。那其实也是可以只下载一个仓库的
还是以charge_logger_new举例
这样我们就有了下载单个仓库的办法,之后使用git push就可以提交了。
做完修改之后准备使用git push之后发现少写了后面的分支信息,于是补全一下
记得要加refs/for/提交的分支名,不加refs/for会失败,之后我们就可以去Gerrit查看我们的提交了
以上就是下载一个仓库并提交的方法了
ps:不用repo upload 主要是还没学会怎么样在只下载一个仓库的前提下用repo upload提交代码
例子:
1.4 repo upload .失败怎么办
出问题先用git push救急
执行命令: git remote -v,查看这个patch对应的仓名:
使用git push提交到gerrit,将patch对应的仓名中的git改成gerrit.pt。
而"HEAD:refs/for/"后面对应的"bsp-qcom-s"是分支名,需要根据具体的项目来定
例子:git push ssh://cuibinbin@gerrit.pt.mioffice.cn:29418/platform/vendor/qcom-proprietary/mm-camerasdk HEAD:refs/for/bsp-qcom-s
repo init出问题 可以添加 --no-repo-verify
使用repo upload
需要搭建gerrit环境,并且在manifest文件remote
元素中添加review
属性,使用 git rebase -i
,然后再运行 repo upload
。
一般就是这些指令来回整
138 git status
139 git add -A .
140 git status
141 git commit --amend
144 git pull
149 git rebase
下面这俩 不是这个行就是那个行
rm -fr ".git/rebase-merge" 有时候需要
git pull
git push ssh://tianxiang1@gerrit.pt.mioffice.cn:29418//device/xiaomi/dada HEAD:refs/for/master-v-qcom
git pull miui HEAD:refs/for/master-v-qcom
repo就这几个命令常用
2,git
git常用命令 等再搜索几篇文章的
2.1 git pull出错
如果你本地分支有修改,git pull会报错,提示你有未提交的修改
git branch -a 或者 git branch -a 找到 远程主分支
git reset --hard miui/master-u-qcom 和远程主分支同步
git pull
3,查找代码提交信息
git blame <filename> -L n,m
查看filename文件从n到m行的提交信息
例如
/drivers/power/supply$ git blame ti_battery_charger.c -L 3661,3663
回复
Blaming lines: 100% (3/3), done.
dd2116df9a93d (Subbaraman Narayanamurthy 2019-12-19 17:11:49 -0800 3661)
ee4ed6549350f (lsy1 2024-04-01 19:39:51 +0800 3662) QTI_CHARGER_RO_SHOW(moisture_detection_status, PSY_TYPE_USB, USB_MOISTURE_DET_STS);
dd2116df9a93d (Subbaraman Narayanamurthy 2019-12-19 17:11:49 -0800 3663)
3,git fetch 切换分支
git fetch miui research-u-qcom-bp-sm8650-HW34023 (目标分支)
git branch -a
git branch -a |grep 34023 在所有列出的分支里找34032
git branch -vv
git checkout -b 分支名
表示以当前分支的当前状态创建新分支并切换到新分支 -b 表示创建新分支
git checkout -b 34033 remotes/miui/research-u-qcom-bp-sm8650-HW34023
git switch -c remotes/miui/research-u-qcom-bp-sm8650-HW34023 切过去
4,本地分支进行了修改无法git pull
基于本地分支修改了文件,无法git pull 也无法git rebase(rebase到远程分支)
必须的解冲突 会提示哪个文件冲突了 该文件冲突处会标深 能看到冲突位置
解完冲突后 需要先git add . repo upload . 然后再git rebase --continue
可以git log看一下
git branch -D k88 散出本地k88分支
git reset --hard HEAD^ 本地分支追踪到git log里前一个提交位置 上面图片正好是远程分支位置
git reset --hard HEAD 017333.....(上面图片黄色远程分支位置) 本地分支追踪到git log里特定提交位置
repo upload . 出错了 这么解决
k8 本地分支名字 我的提交就在这个分支上 把前面的#去掉
参考链接:
1,【精选】git repo工具详细使用教程——彻底学会Android repo的使用_repo教程-优快云博客
(很详细)
2,【精选】repo入门和基本用法_repo start_Jason_Lee155的博客-优快云博客
3,