是否可以为子文件夹中的所有存储库执行 Git 状态?

kra*_*r65 5 git macos bash subdirectory

我有一个文件夹,其中包含大约 10 个子文件夹,每个子文件夹都包含一个单独的 git 存储库。所以像这样:

MainFolder/:
-- GitRepoA/
-- GitRepoB/
-- GitRepoC/
-- GitRepoD/
-- etc.
Run Code Online (Sandbox Code Playgroud)

我经常想检查发生了什么,特别是我想要一个命令,该命令列出git status所有已更改子文件夹的输出。有人知道解决方案吗?(顺便说一下,我在 Mac OSX 上)。

mea*_*gar 6

遍历每个目录,并分别.git使用命令行选项和 设置工作目录--work-tree和目录--git-dir:

for x in *; do git --work-tree="$x" --git-dir="$x/.git" status; done
Run Code Online (Sandbox Code Playgroud)


gni*_*urf 6

如果你需要递归(或者如果你不需要也可以):

find . -name .git -type d -execdir git status \;
Run Code Online (Sandbox Code Playgroud)

对于命名的每个目录,.git将从git status包含它的目录中执行( -execdir)。哇,正是你想要的。

您也可以追加,-prune以免在 git 项目的子目录中进一步操作以提高效率(但可能会跳过 git 子模块——我不知道子模块如何工作,我从不使用它们):

find . -name .git -type d -execdir git status \; -prune
Run Code Online (Sandbox Code Playgroud)

  • 有同样的问题。我最终得到了“查找”。-name .git -type d -execdir sh -c 'pwd ;git status' \;` (8认同)
  • 在 git status 之前打印工作目录会很棒 (2认同)

kon*_*box 0

您可以创建一个脚本。也许也只是将其创建为函数并将其放置在.bash_profile.

#!/bin/bash

REPOS=(GitRepoA GitRepoB GitRepoC AnotherRepoA)

for R in "${REPOS[@]}"; do
    echo "Checking repo $R."
    pushd "$R" >/dev/null && {
        git status
        popd >/dev/null
    }
done
Run Code Online (Sandbox Code Playgroud)

将其放入主文件夹并运行

bash script_name.sh
Run Code Online (Sandbox Code Playgroud)

如果您的存储库是统一的,您可以执行以下操作:

shopt -s nullglob
REPOS=(GitRepo{A..Z} AnotherRepoA)
Run Code Online (Sandbox Code Playgroud)

或者也许只是

shopt -s nullglob
REPOS=(*)
Run Code Online (Sandbox Code Playgroud)

就像一个函数一样:

function check_repos {
    REPOS=(GitRepoA GitRepoB GitRepoC AnotherRepoA)

    for R in "${REPOS[@]}"; do
        echo "Checking repo $R."
        pushd "$R" >/dev/null && {
            git status
            popd >/dev/null
        }
    done
}
Run Code Online (Sandbox Code Playgroud)