git-repos-tool
git-repos-tool
基于
GitPython
的多仓库 Git 命令行脚本,支持多仓库克隆代码、更新、分支切换、创建分支,删除分支,查看分支,查看分支状态,推送到远端等功能。支持多仓库的 submodule 更新、切换分支等功能
Installation
- 安装 Python3
- 下载 GitPython
1
2
3
4
5
6
7
8
9
10
> 基于`GitPython`的多个Git命令行脚本,支持克隆代码、更新、分支切换、创建分支,删除分支,查看分支,查看分支状态,推送到远端等功能。支持submodule更新、切换分支等功能
## Installation
1. 安装Python3
2. 下载GitPython
```shell
$pip3 install gitpython
- clone 本项目
执行git-repos-tool.py -h
查看使用说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ git-repos-tool.py -h
usage: Git多仓库批处理工具
多个仓库执行Git命令
positional arguments:
{clone,pull,checkout,co,new,delete,query,push,status,delete,convert}
批量执行任务, clone, pull, checkout[co], new, delete, query, push, status, delete, convert
options:
-h, --help show this help message and exit
-d, --debug 是否输出详细log
-f FILTER_FILE, --filter_file FILTER_FILE
clone项目的目标文件/需要create的仓库,每个仓库一行;如果带了--xxx,传settings.gradle路径,会自动解析出需要clone的仓库
--xxx 是否是clone xxx项目,需要-f参数传settings.gradle路径
-b [BRANCH], --branch [BRANCH]
指定target分支
-p PATH, --path PATH 批处理目录,默认为当前目录
-r REMOTE, --remote REMOTE
是否操作远端分支,默认为False
Feature
查看帮助文档
1
python3 git-repos-tool.py -h
clone 克隆代码
- clone
python3 git-repos-tool.py clone [-f clone.txt/–filter clone.txt] [-p path/–path path]
其中 clone.txt 形如
1
2
git@github.com:hacket/AppInit.git
git@github.com:hacket/ActivityResultHelper.git
示例:
python3 git-repos-tool.py clone -f ~/py/git-repos-tool/clone.txt -p
/hacket 从 clone.txt 将配置的仓库 clone 到/hacket 路径
python3 git-repos-tool.py clone –filter ~/py/git-repos-tool/clone.txt 从 clone.txt 将配置的仓库 clone 到当前路径
- clone xxx
python3 git-repos-tool.py clone –xxx -f settings.gradle 路径 [-p path]
如:
1
python3 git_repos_tool.py clone --xxx -f settings.gradle路径 -p xxx/xxx/path
示例:
gits clone -f /Users/xxx/WorkSpace/xxx/xxx_android/settings.gradle -p /Users/xxx/temp/ –xxx
checkout 切换分支
将所有仓库切换到指定分支;没有指定分支名的仓库切换到 master;checkout 的过程,如果存在 dirty,会先 stash save,checkout 成功后,会 stash pop,如果有冲突会失败
python3 git-repos-tool.py checkout [-b branch/–branch branch]
1
2
3
python3 git-repos-tool.py checkout -b maseter
python3 git-repos-tool.py checkout --branch maseter
python3 git-repos-tool.py co -b maseter
pull 更新代码
会先切换到 master 分支,并 pull branch 的最新代码;未指定就 pull 当前分支;pull 的过程,如果存在 dirty,会先 stash,然后再 pull,最后 stash pop
python3 git-repos-tool.py pull [-b branch/–branch branch]
1
2
3
4
5
# 基于当前分支pull
python3 git_repos_tool.py pull
# 切换到dev分支并执行pull拉取最新代码
python3 git_repos_tool.py pull -b dev
python3 git_repos_tool.py pull --branch dev
query 查询当前分支
查询所有 repo 当前分支 (区分 local/remote);红色表示只有本地分支,黄色的表示存在远端分支
python3 git-repos-tool.py query [-b branch/–branch branch]
1
2
python3 git_repos_tool.py query -b 9.9.0/user 查看当前仓库所在分支如果存在就标红9.9.0/user
python3 git_repos_tool.py query 查看当前仓库所在分支
push 推送到远端
push 指定 branch 到 remote,如果指定 branch 本地没有,那么该 repo 就不会 push 会跳过
python3 git-repos-tool.py push [-b branch/–branch branch]
1
2
# 将9.5.4/user-zfs分支push到remote
python3 git_repos_tool.py --branch 9.5.4/user-zfs
status 查看所有仓库当前分支的 status
python3 git-repos-tool.py status
1
python3 git_repos_tool.py status
new 创建新分支
python3 git-repos-tool.py [-b branch/–branch branch] [-f create.txt/–filter create.txt]
1
2
3
4
# 从master创建新分支dev
python3 git_repos_tool.py new -b dev
# 从filter.txt中指定的
python3 git_repos_tool.py new -b 10.0.2/user-zfs-test -f ~/py/git-repos-tool/create.txt
创建新分支,也可以提供 create.txt 文件,只对 create.txt 文件中匹配的项目名创建新的分支
1
python3 repos-tool.py new 10.0.2/user-zfs-test -f create.txt
create.txt 如下:
1
2
lib1
lib2
删除分支
python3 git-repos-tool.py delete [-b branch/–branch branch]
1
2
# 删除所有仓库的dev分支(local和remote)
python3 git_repos_tool.py delete dev
注意:
- 如果仓库是 dirty 的,会抛出异常
- TODO: dirty 删除时要二次确认
多仓库 submodule 支持
submodule pull 更新代码 (会更改跟踪的 commitId)
python3 git_submodule.py pull –repo repo_path –branch branch_name –debug
- –repo 带 submodule 的工程 必选
- –branch 要 pull 的 branch 必选
- –debug 是否输出详细的 log
案例,所有 submodule 切换到 master,并拉取最新代码
1
python3 git_submodule.py pull --repo /Users/xxx/WorkSpace/xxx/yyy_flutter_module --branch master --debug
submodule checkout 切换分支
python3 git_submodule.py checkout –repo repo_path –branch branch_name –debug
- –repo 带 submodule 的工程 必选
- –branch 要 pull 的 branch 必选
- –debug 是否输出详细的 log
案例:所有 submodule 切换到 master
1
python3 git_submodule.py checkout --repo /Users/xxx/WorkSpace/xxx/yyy_flutter_module --branch master --debug
TODO: push 支持,其他支持
TODO
- rename 分支重命名
- convert 将 https 的 git 仓库转换为 ssh; 互相转换
简化操作
封装成 shell function,配置到 ~/.zshrc
(用的 zsh shell) 或者 ~/.bashrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
WORKSPACE_MAIN=~/Workspace/xxx #
GITS=/Users/xxx/py/git-repos-tool/git_repos_tool.py # git多仓库拉取的py脚本
GITS_SUBMODULE=/Users/xxx/py/git-repos-tool/git_submodule.py # git submodule多仓库拉取的py脚本
## gits 批量处理git仓库
alias py='python3' # 默认使用Python3
alias gits="python3 $GITS"
#### 将~/py/git-batch/clone.txt目录下的repo全部clone下到当前位置,clone.txt替换成自己的目录
function gits:clone() {
cd $WORKSPACE_MAIN
pwd
python3 $GITS clone -c ~/py/git-batch/clone.txt -p $WORKSPACE_MAIN
}
#### 主工程 gits:checkout master 所有分支切换到master
function gits:co() {
gits:checkout $1
}
function gits:checkout() {
cd $WORKSPACE_MAIN
pwd
echo $0 $1
python3 $GITS checkout --branch $1
}
#### 主工程 gits:pull master 所有分支先切换到master,然后pull,不传递参数pull当前分支
function gits:pull() {
cd $WORKSPACE_MAIN
pwd
echo "[$GITS] $0 $1 $2"
branch=$1
python3 $GITS pull --branch $branch $2
}
#### 主工程 push指定分支,如果指定分支本地没有,就不会push python3 git-batch.py branch 9.5.4/user-zfs
function gits:push() {
cd $WORKSPACE_MAIN
pwd
echo $0 $1
python3 $GITS push --branch $1
}
#### 查看主工程 所有仓库当前分支名
function gits:query() {
cd $WORKSPACE_MAIN
pwd
echo $0 $1
python3 $GITS query --branch $1
}
function gits:status() {
cd $WORKSPACE_MAIN
pwd
python3 $GITS status
}
function gits:del() {
gits:delete $1
}
function gits:delete() {
cd $WORKSPACE_MAIN
pwd
python3 $GITS delete --branch $1
}