是否有可能在子文件夹中为所有repos执行Git状态?

时间:2014-06-24 15:01:59

标签: macos git bash subdirectory

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

MainFolder/:
-- GitRepoA/
-- GitRepoB/
-- GitRepoC/
-- GitRepoD/
-- etc.

我经常想查看最新情况,特别是我想要一个命令,列出所有子文件夹中git status的输出。有人知道解决方案吗? (顺便说一下,我在Mac OSX上)。

5 个答案:

答案 0 :(得分:3)

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

for x in *; do git --work-tree="$x" --git-dir="$x/.git" status; done

答案 1 :(得分: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

将其放在主文件夹中并运行

bash script_name.sh

如果你的回购是统一的,你可以做一些事情,如:

shopt -s nullglob
REPOS=(GitRepo{A..Z} AnotherRepoA)

或者只是

shopt -s nullglob
REPOS=(*)

就像一个功能:

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
}

答案 2 :(得分:0)

我通过编写一个shell脚本mgit来处理这个问题,该脚本在当前目录中读取一个隐藏文件.mgit,其中包含作为单独git存储库的文件夹列表。它做了类似的事情:

$ for d in */; do git -C $d status; done

答案 3 :(得分:0)

如果您需要递归(或者如果您不需要递归):

find . -name .git -type d -execdir git status \;

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

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

find . -name .git -type d -execdir git status \; -prune

答案 4 :(得分:0)

find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '(echo {} && cd {} && git status -s && echo)' \;

它可以递归工作。您可以根据自己的需求更改maxdepthmindepth