如何在机器上的所有 git 存储库上运行命令?



基于这个问题,我想出了这个命令来找出我机器上的所有.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 ;

相关内容

  • 没有找到相关文章

最新更新