基于这个问题,我想出了这个命令来找出我机器上的所有.git
存储库。
find / -type d -name .git 2>&-
而且它的工作速度相对较快。虽然我听到了一点CPU的风扇声,这表明我的机器做了一些工作。
现在我希望能够遍历结果并在每个结果上运行 git 命令。例如,我想获取他们的状态以查看应该管理的内容。
我试过了:
find / -type d -name .git 2>&- | xargs git status
但它没有用:
致命:不是 git 存储库(或任何父目录):.git
我也试过:
find / -type d -name .git 2>&- | xargs dirname | xargs git status
同样,同样的错误。
我应该使用什么命令?
你的问题很简单:假设你的 cwd 是$HOME
,并且你的仓库在$HOME/my/repo
中,git status $HOME/my/repo
不会寻找存储在my/repo
中的 git 仓库,它会搜索一个从$HOME
开始向上的仓库(它可能不会找到一个)。
有几种方法可以解决此问题:
-
在运行
git status
之前cd
到目标目录:cd <path/to/repo>; git status
-
使用
git -C
命名目标.git
存储库:git -C <path/to/repo> status
要将find
命令与xargs
结合使用:
- 用
dirname
把/path/to/repo/.git
变成/path/to/repo
, - 使用
xargs -i
允许将参数放置在"最后一个位置"以外的其他位置:
find . -name .git | xargs dirname | xargs -i git -C {} status
# or :
find . -name .git | xargs dirname |
xargs -i bash -c "echo ===== {}; git -C {} status"
您也可以尝试使用dirk-thomas/vcstool
(基于python)
Vcstool 是一个版本控制系统 (VCS) 工具,旨在更轻松地使用多个存储库。
vcs status /path/to/several/repos /path/to/other/repos /path/to/single/repo
其他方法(基于外壳):sascha-andres/devenv
devenv
是一种用于管理包含多个 git 存储库的项目的工具。> 使用配置,您可以使用一个命令设置所有存储库,甚至可以使用本地存储库,就好像它们使用 shell 一样(例如在所有引用项目中创建分支)。
我使用这个:
find .
-type d
-exec sh -c '[ -e "$1/.git" ]' - {} ;
-prune
-exec git -C {} status ;
它:
- 不是很快。
- 将跳过嵌套存储库(例如子模块)。
- 适用于工作树,但不适用于裸存储库。
下面是一个应该适用于裸存储库的替代方法:
find .
-type d
-exec sh -c 'git -C "$1" rev-parse --git-dir >/dev/null 2>&1' - {} ;
-prune
-exec git -C {} status ;