如何建立repo仓库 管理多个模块

4142人阅读
点滴积累(4)
& & &很久以前出于好奇仔细了解了下Repo及服务器的原理,但是今天突然发现有些忘了,于是想记录下来。
& & Repo是google官方为管理Android项目开发出来的一个软件。我们先来看下官方对该软件的描述。
Repo is a tool thatwe built on top of Git. Repo helps us manage the many Git repositories, doesthe uploads to our revision control system, and automates parts of the Androiddevelopment workflow. Repo is not meant to replace
Git, only to make it easierto work with Git in the context of Android. The repo command is an executablePython script that you can put anywhere in your path
& &&从上面可以看出,repo本身并不负责项目的管理(记录项目的更新,回退更新等),它只是一个基于git之上的工具,用来管理多个git项目的便捷工具。它是用python实现。
& & & 我们知道Android里面的各个模块是用git来管理的,Android里有大量的这种模块,多达200多个,如果用户一个一个的使用git pull/fetch去更新每个git项目,那任务量太大了,同时用户还必须知道每个git对应的branch信息。Repo工具就为解决这个问题的,它借助一个manifest.git项目列出了所有被管理的git的信息,包括目录结构,branch,获取地址等等。
Repo干了什么事
& & & & 我们执行repo时一般是使用如下命令:
& & & &repo init –u /media/itleaks/git/repositories/platform/manifest.git
& & & &-u 后面的参数是重点,当用户执行这条命令后,repo工具相当于执行了
mkdir .repo
git clone /media/itleaks/git/repositories/platform/manifest.git
& & & &我们来看下一个android repo项目的manifest.git的内容:
itleaks@Itleaks:/media/itleaks/source/4.4$ cat .repo/manifests/.git/config |more
repositoryformatversion = 0
filemode = true
[remote &origin&]
url = /media/itleaks/git/repositories/platform/manifest.git
fetch = +refs/heads/*:refs/remotes/origin/*
reference = /media/itleaks/git/mirror//
[branch &default&]
remote = origin
merge = master
itleaks@Itleaks:/media/itleaks/source/4.4$ cat .repo/manifests/default.xml |more
&?xml version=&1.0& encoding=&UTF-8&?&
&manifest&
//可以定义多个remote
name=&aosp&
review=&review.&
//这个就是获取git的服务器地址,这里是一个相对目录..
//刚刚我们提到过,manifests本身也是一个git项目,它自然就有地址
//这个..指出下面的所有git项目的根目录在manifests项目目录的上层目录,即
/media/itleaks/git/repositories/
fetch=&..& /&
//默认的remote就是上面的aosp
&default revision=&refs/tags/android-4.4_r1&
remote=&aosp&
sync-j=&4& /&
//项目路径,项目名称
//这个描述执行后,相当于用户执行如下两条命令
// cd ROOTDIR/art
// git clone /media/itleaks/git/repositories/platform/platform/art
&project path=&art& name=&platform/art& /&
&project path=&bionic& name=&platform/bionic& groups=&pdk& /&
&project path=&bootable/bootloader/legacy& name=&platform/bootable/bootloader/legacy& /&
&project path=&bootable/diskinstaller& name=&platform/bootable/diskinstaller& /&
&project path=&bootable/recovery& name=&platform/bootable/recovery& groups=&pdk& /&
&project path=&cts& name=&platform/cts& groups=&cts& /&
&project path=&dalvik& name=&platform/dalvik& /&
& & & & 然后用户执行repo sync后才开始真正按照上面描述的规则下载所有代码项目。即循环执行git clone /media/itleaks/git/repositories/platform/xx
建立repo server
&从零开始建立reposerver
&&&&&&& 从上可以看出,建立repo server的核心是建立manifest.git项目。
//创建目录
mkdir /tmp/git/repositories/platform -p
cd /tmp/git/repositories/platform
//建立测试git test
touch 1.git add .;git commit –asm “initial version”
//建立测试git test1
mkdir test1;touch 2.git add .;git commit –asm “initial version”
//建立manifest git
touch default.git add .;git commit –asm “initial version”
然后修改default.xml,输入如下信息
&?xml version=&1.0& encoding=&UTF-8&?&
&manifest&
name=&test &
review=&https://android-/& /&
&default revision=&master&
remote=&test&
sync-j=&4& /&
&project path=&test& name=&test&/&
&project path=&test1& name=&test1& /&
&/manifest&
这样就建好,提交
git commit –asm “add real content”
& & & & 执行完上面的操作后,我们就可以使用这个repo server了
& & & & 本地用户只需执行:repo –u /tmp/git/repositories/platform/manifest就可下载这个reposerver的项目代码。
& & & & &远程机器通过:repo –u ssh:ip:/tmp/git/repositories/platform/manifest
优化repo server数据内容
& & & & &上面的方法有一个很不好的就是这个server下的每个git项目是有冗余信息的。因为reposerver里是不需要直接操作git项目里的内容的,往往是repo client修改代码后提交上去来修改server的数据。因此git提供了一个—bare参数来优化git server的数据,即git server端所有内容以二进制管理。所以上面的repo server的生成应该是这样。以test git 为例:
下面的命令
cd /tmp/git/repositories/touch 1.git add .;
git commit –asm “initial version”
//建立client git
cd /touch 1.git add .;gitcommit –asm “initial version”
//建立server git
cd/tmp/git/repositories/git clone /tmp/test –
& & & &这样在server目录/tmp/git/repositories/platform下的所有git的数据都是优化过的。
利用已有repo建立自己的repo server
& & & &这个方式是很有用的,比如一家公司进行android项目开发,首先肯定是需要下载aosp的base code,然后在上面进行一些修改,公司在内部建立一个repo sever,其他所有的员工直接从公司的这个repo server下载代码,而不是从google官方下载。这首先是提高了下载速度,本地局域网下载肯定比远程下载快。
& & & & 事实上,任何一个已有的repo经过简单修改都可以变为一个reposerver.比如如果一用户通过执行下面的命令完成了android的下载。
/media/ Itleaks /source/4.4
repo init –u /media/itleaks/git/repositories/platform/manifest.git
& & & &然后他只需在根目录下建立一个manifest项目,并且拷贝文件.repo/manifest/default.xml并修改即可将这个repo项目变为reposerver。
利用repo mirror建立自己的repo server
& & & 其实repo提供一个更加好的参数用来建立repo server,即repo –mirror.&比如你想要建立一个android的repo server,只需执行如下命令即可:
repo init –u /media/itleaks/git/repositories/platform/manifest.git –mirror
/********************************
* 本文来自博客 &“爱踢门”
* 转载请标明出处:
******************************************/
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:81449次
积分:1124
积分:1124
排名:千里之外
原创:22篇
评论:69条
(3)(2)(2)(14)(9)Cocoapods 创建私有库实现项目模块化管理 - 简书
Cocoapods 创建私有库实现项目模块化管理
项目私有化目的
项目书写的时候肯定是刚开始比较简单,功能也比较少,模块比较少肯定能满足项目的需求,随着项目模块的增多,项目的代码量也逐渐增加,很有可能会有多人进行开发,提交合并代码会很头痛,模块化给我们一个很好的解决方式,让我们开始吧。
创建私有库 spec repo
spec repo 是所有的Pods的一个索引,就是一个容器,所有公开的Pods都在这个里面,他实际是一个Git仓库remote端 在GitHub上,但是当你使用了Cocoapods后他会被clone到本地的~/.cocoapods/repos目录下,可以进入到这个目录看到master文件夹就是这个官方的Spec Repo了。这个master目录的结构是这个样子的
#~/.cocoapods/repos 大致目录是这样的
├── Specs
└── [SPEC_NAME]
└── [VERSION]
└── [SPEC_NAME].podspec
所以我们需要创建一个类似master结构的spec repo
github 私有仓库是收费的, 我选择了Coding
还有其他的服务 像 gitLab、开源中国、Bitbucket、CSDN。
在terminal创建 repos
# pod repo add [Private Repo Name]
[HTTPS clone URL]
$ pod repo add WMCommon https://git.coding.net/fufu62/WSPCommon.git
此时如果成功的话进入到~/.cocoapods/repos目录下就可以看到WMCommon这个目录了。至此第一步创建私有Spec Repo完成。
创建 podspec 文件
已经有了现成的项目,需要给这个项目创建一个podspec文件,创建它需要执行Cocoapods的另外一个命令,在这里
在本地项目目录下创建
$ pod spec create WPCommon
执行完之后,就创建了一个podspec文件,他其中会包含很多内容,可以按照我之前介绍的进行编辑,没用的删掉。
Pod::Spec.new do |s|
s.name = "WPCommon"
s.version = "0.2"
s.summary = "the project for WPCommon"
s.homepage = "https://git.coding.net/fufu62/WSPCommon.git"
s.license = "MIT"
= { "ISPWang" =& "" }
s.platform = :ios, "7.1"
s.ios.deployment_target = "7.1"
s.source = { :git =& "https://git.coding.net/fufu62/WSPCommon.git", :tag =& "0.1" }
s.source_files = "CommonTest/CommonTest/Mine/Controller/**/*.{h,m}"
s.frameworks = "UIKit"
s.requires_arc = true
# 编辑完成之后使用验证命令验证一下
$ pod lib lint
WPCommon passed validation. #验证无错误
# 可以进入下一步了。没有验证过去 根据错误提示进行修改 podspec文件
本地测试pod spec文件
我们可以创建一个新的项目,在这个项目的Podfile文件中直接指定刚才创建编辑好的podspec文件,看是否可用。 在Podfile中我们可以这样编辑,有两种方式
platform :ios, '7.1'
pod ‘WPCommon', :path =& ‘~/Code/WSPCommon/CommonTest'
# 指定路径
pod 'WPCommon ', :podspec =& '~/Code/WSPCommon/CommonTest/WPCommon.podspec'
然后执行pod install命令安装依赖,打开项目工程,可以看到库文件都被加载到Pods子项目中了,不过它们并没有在Pods目录下,而是跟测试项目一样存在于Development Pods/WPCommon中,这是因为我们是在本地测试,而没有把podspec文件添加到Spec Repo中的缘故。在项目中编写代码,测试库文件无误后就可以开始下一步了,提交podspec到Spec Repo中。
# 提交代码
git add -A && git commit -m "Release 0.1"
-m “new version” ‘0.1'
# 把tag推到远程仓库
git push --tags
# 将本地的master分支推送到远程仓库
git push origin master
向Spec Repo提交pod spec
向Spec Repo提交podspec需要完成两点一个是podspec必须通过验证无误,在一个就是删掉无用的注释(这个不是必须的,为了规范还是删掉吧)。 向我们的私有Spec Repo提交podspec只需要一个命令
$ pod repo push WMCommon WPCommon.podsepc
#前面是本地Repo名字 后面是pod spec名字完成之后这个组件库就添加到我们的私有Spec Repo中了,可以进入到~/.cocoapods/repos/WTSpecs目录下查看
├── LICENSE
├── WPCommon
└── 0.1
└── WPCommon.podspec
└── 0.2
└── WPCommon.podspec
└── README.md
再去看我们的Spec Repo远端仓库,也有了一次提交,这个podspec也已经被Push上去了。
pod search WPCommon
-& WPCommon (0.2)
A short test for
of WPCommon.
pod 'WPCommon', '~& 0.2'
- Homepage: https://git.coding.net/fufu62/WSPCommon.git
https://git.coding.net/fufu62/WSPCommon.git
- Versions: 0.2, 0.1 [WMCommon repo]
使用制作好的Pod
在Pod file 文件里增加私有库文件即可
source '/CocoaPods/Specs.git'
source 'https://git.coding.net/fufu62/WSPCommon.git'
platform:ios,’8.0’
target "cocoapodsTest" do
pod 'MJRefresh'
pod 'SDWebImage', '~& 3.8.1'
pod 'WPCommon', '~& 0.2'
# 快速更新状态
pod update --no-repo-update
中间会出现警告—no-clean或者error ?
Assuming you are using git for that repo, can you run git status? If the repo is clean it would say something like nothing to commit, working directory clean.Sorry, can you run git status --porcelain, that’s the exact command it runs
pod repo push
WMCommon WMCommon.podspec --allow-warnings --verbose
// --allow-warnings : 允许 警告,有一些警告是代码自身带的。
// --use-libraries : 私有库、静态库引用的时候加上
// —verbose : lint显示详情
框架中如果使用Xib加载crash的情况出现通过mainBundle加载不了,无法获取Xib
[NSBundle bundleForClass:[self class] 获取bundle
// 这样之后,无论是通过copy文件夹方式还是CocoaPods下载安装的方式,都能正常使用xib进行初始化了
CocoaPods下载框架中图片无法正常显示通过ImageName
通过CocoaPods下载安装,如果xib中直接填写好的图片,则图片资源能直接显示,如果通过代码"[UIImage imageNamed:@""]"去设置的话,则图片资源根本显示不了//改变代码图片路径
// 图片路径
#define WMCommonSrcName(file) [@"WMCommon.bundle" stringByAppendingPathComponent:file]
#define WMCommonFrameworkSrcName(file) [@"Frameworks/WMCommon.framework/WMCommon.bundle" stringByAppendingPathComponent:file]
WMCommonSrcName(file) 为通过copy文件夹方式获取图片路径的宏
WMCommonFrameworkSrcName(file) 为通过cocoapods下载安装获取图片路径的宏
之后修改代码中设置图片的方式如下:
UIImage *img = [UIImage imageNamed:WMCommonSrcName(@"image.png")]?:[UIImage imageNamed:WMCommonFrameworkSrcName(@"image.png")];
believe you can29217人阅读
转载地址是:http://blog.csdn.net/changjiang654/article/details/6253769
Android 为企业提供一个新的市场,无论大企业,小企业都是处于同一个起跑线上。研究 Android 尤其是 Android 系统核心或者是驱动的开发,首先需要做的就是本地克隆建立一套 Android 版本库管理机制。
Android 使用 Git 作为代码管理工具,开发了 Gerrit 进行代码审核以便更好的对代码进行集中式管理,还开发了 Repo 命令行工具,对 Git 部分命令封装,将 百多个 Git 库有效的进行组织。要想克隆和管理这百多个 Git 库,还真不是一件简单的事情。
在研究 Repo 的过程中,发现很多文档在 Google Group 上,非“翻墙”不可看。非法的事情咱不干,直接阅读 repo 的代码吧。
创建本地 Android 版本库镜像的思路
如果了解了 Repo 的实现,参考
, 建立一个本地的 android 版本库镜像还是不难的:
下载 repo bootstrap 脚本
$ curl http://android.git.kernel.org/repo &~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=$PATH:~/bin
提供 –mirror 参数调用 repo init ,建立 git 版本库克隆
$ repo init -u git://android.git.kernel.org/platform/manifest.git --mirror
使用 –morror 则下一步和源同步的时候,本地按照源的版本库组织方式进行组织,否则会按照 manifest.xml 指定的方式重新组织并检出到本地
开始和源同步
$ repo sync
修改 manifest ,修改 git 库地址,指向本地的 git 服务器
修改 platform/manifest.git 库中现有的 xml 文件,或者创建一个新的 xml 文件将 git 的地址改为本地地址,提交并 push
本地 repo 镜像建立完毕之后,就可以在执行 repo init 时,使用本地更改后的 manifest 库,之后执行 repo sync 就是基于本地版本库进行同步了。也可以改造 repo,使得不必为 repo 工具初始化,也在本地网络完成操作…
Repo init 干了些什么?
实际上,得到客户使用 repo 的信息后,首先下载 repo 执行脚本开始研究。
curl http://android.git.kernel.org/repo &~/bin/repo
难道只有 600 行的 python 代码么?要是这样应该很简单的呀。可以看下来,却发现远非如此。
Shell script or python?
首先 repo 脚本使用了一个魔法:从脚本第一行的 shebang 来看应该是 shell 脚本,但是满眼却都是 python 语法,怎么回事?
1 #!/bin/sh
3 ## repo default configuration
5 REPO_URL='git://android.git.kernel.org/tools/repo.git'
6 REPO_REV='stable'
8 # Copyright (C) 2008 Google Inc.
22 magic='--calling-python-from-/bin/sh--'
23 &&&exec& python -E &$0& &$@& &&&#$magic&
24 if __name__ == '__main__':
25&& import sys
26&& if sys.argv[-1] == '#%s' % magic:
27&&&& del sys.argv[-1]
28 del magic
魔法就在第 23 行,巧妙的通过 python 三引号字串写出了一个能被 python 和 shell script 都能理解的代码,以此为界,代码由 Shell 脚本进入了 Python 的世界。
Bootstrap 和真正的 repo
通过 curl 下载的的 repo 并非完整的 repo 脚本,只是一个 bootstrap。当 repo 执行时,会负责下载完整的 repo 代码,并将控制权转移给真正的 repo。
通过 main 函数,可以看到 repo 运行的开始,就试图发现本地真正的完整的 repo 代码,以便移交控制权:
544 def main(orig_args):
545&& main, dir = _FindRepo()
586&& try:
587&&&& os.execv(main, me)
其中 545 行的 _FindRepo() 会在当前目录开始向上递归查找 “.repo/repo/main.py”,如果找到则移交控制权(587行)。
Repo bootstrap 脚本调用 init 只完成第一阶段的初始化
Repo 的 bootstrap 脚本只支持两个命令 help 和 init,而 init 也只完成 repo 版本库克隆(即安装 repo 完整工具),之后就转移控制权。
在 Repo bootstrap 执行 init 可以提供很多参数,但实际上第一阶段初始化,只用到两个参数(而且都有默认值)
参数:–repo-url=URL
repo 工具本身的 git 库地址。缺省为:git://android.git.kernel.org/tools/repo.git参数:–repo-branch=REVISION
使用 repo 的版本库,即 repo git 库的分支或者里程碑名称。缺省为 stable
第二阶段的 repo init
执行第二阶段的 repo init,控制权已经移交给刚刚克隆出来的 repo git 库的脚本。
Repo git 库被克隆/检出到执行 repo init 命令当前目录下的 .repo/repo 子目录中,主要的执行脚本为 .repo/repo/main.py。main.py 接着执行 repo init 命令。
Repo 的代码组织的非常好,在 .repo/repo/subcmds/ 子目录下,是各个 repo 命令的处理脚本。repo init 的第二阶段脚本正是由 .repo/repo/subcmds/init.py 负责执行的。第二阶段主要完成:
克隆由 -u 参数提供的 manifest Git 库,如克隆 android 库时:
$ repo init -u git://android.git.kernel.org/platform/manifest.git
如果不提供 -b REVISION 或者 –manifest-branch=REVISION参数,则检出 manifest Git 库的 master 分支如果不提供 -m NAME.xml 或者 –manifest-name=NAME.xml 参数,则使用缺省值 default.xml如果提供 –mirror 参数,则后续同步操作会有相应的体现
Repo start 干了些什么?
Android 源码网站在介绍 repo 的使用模型中,有一个图片: /images/git-repo-1.png , 介绍了 repo 的使用流程。其中 “repo start” 是紧接着 “repo sync” 后的第一个动作。那么这个动作是干什么的呢?
得益于 repo 对 git 操作的封装,”repo start” 命令的处理代码只有区区 68 行。
37&& def Execute(self, opt, args):
&41&&&& nb = args[0]
&47&&&& projects = []
48&&&& if not opt.all:
49&&&&&& projects = args[1:]
&54&&&& all = self.GetProjects(projects)
57&&&& for project in all:
59&&&&&& if not project.StartBranch(nb):
60&&&&&&&& err.append(project)
看到第 59 行了么,就是对 repo 同步下来的项目的多个 Git 版本库,逐一执行 project.StartBranch 操作。 nb 是 repo start 的第一个参数,即分支名称。
关于 StartBranch 的代码,在 project.py 中:
857&& def StartBranch(self, name):
858&&&& &&&Create a new branch off the manifest's revision.
859&&&& &&&
894&&&& if GitCommand(self,
895&&&&&&&&&&&&&&&&&& ['checkout', '-b', branch.name, revid],
896&&&&&&&&&&&&&&&&&& capture_stdout = True,
897&&&&&&&&&&&&&&&&&& capture_stderr = True).Wait() == 0:
898&&&&&& branch.Save()
899&&&&&& return True
原来如此, repo start &branch_name& 就是逐一为各个版本库创建工作分支,以便在此分支下进行工作。
读者可以按图索骥,找到 repo 各个命令的实现,破解心中的疑惑。
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 中断,每次都要手动开始。 可以用如下的命令,来自动重复
while [ $? -ne 0 ] ;&
获取帮助:
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 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 forall -c&
这个命令会遍历所有的git仓库,并在每个仓库执行-c所指定的命令(这个被执行的命令就不限于仅仅是git命令了,而是任何被系统支持的命令,比如:ls 、 pwd 、cp 等等的&)
当我想通过这个命令遍历所有的仓库并在每个仓库执行&git checkout . &用以将每个仓库的改动都清除的时候,我这么输入命令:
repo forall -c git checkout .&
我发现这样根本不行。看来repo不能遍历执行checkout这个命令。今天我终于想到了另外一个命令&git reset --hard HEAD& 哈哈
repo forall -c git&git reset --hard HEAD
再说一个新发现:以前用repo forall 执行一些命令的时候,可能再遍历到某个仓库的时候出了问题,但是我却苦于不知道这个仓库到底是哪个!一直也没有解决。今天终于找到了。。。。& 关键时候还是要看命令自己带的帮助手册呀。。。
repo help forall& 用这个命令查看下针对forall的帮助吧。说的很清楚,repo执行的时候加上-p参数就可以在遍历到每个仓库的时候先打印出当前的pwd,然后再继续执行-c所指定的命令。举例如下:
repo forall -p -c git branch&&&&
//该命令会遍历所有仓库并打印每个仓库的分支情况,由于有了-p参数,这样便会打印出每个仓库的路径!!!
11. repo status
&& & & 显示 project 中每个仓库的状态,并打印仓库名称
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:273264次
积分:2179
积分:2179
排名:第16586名
原创:18篇
转载:26篇
评论:48条
(1)(1)(1)(9)(4)(2)(1)(1)(2)(1)(1)(1)(1)(1)(2)(3)(3)(4)(1)(3)(1)

我要回帖

更多关于 repo怎么管理git仓库 的文章

 

随机推荐