文章

git-repos-tool

git-repos-tool

git-repos-tool

基于 GitPython 的多仓库 Git 命令行脚本,支持多仓库克隆代码、更新、分支切换、创建分支,删除分支,查看分支,查看分支状态,推送到远端等功能。支持多仓库的 submodule 更新、切换分支等功能

Installation

  1. 安装 Python3
  2. 下载 GitPython
1
2
3
4
5
6
7
8
9
10
> 基于`GitPython`的多个Git命令行脚本,支持克隆代码、更新、分支切换、创建分支,删除分支,查看分支,查看分支状态,推送到远端等功能。支持submodule更新、切换分支等功能


## Installation
1. 安装Python3

2. 下载GitPython
```shell
$pip3 install gitpython
  1. 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

s5iue

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

ls66n

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

vukh9

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 查看当前仓库所在分支

lcbct

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

  1. rename 分支重命名
  2. 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
}
本文由作者按照 CC BY 4.0 进行授权