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

Posted

技术标签:

【中文标题】是否可以为子文件夹中的所有存储库执行 Git 状态?【英文标题】:Is it possible to do Git status for all repos in subfolders? 【发布时间】:2014-08-14 22:00:12 【问题描述】:

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

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

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

【问题讨论】:

Check status of all git repositories at once 的副本。说真的,就像一个精确副本。 没关系,这是 Windows 解决方案,但如果其他人已经在其他地方要求 OS X 或 *nix 解决方案,我不会感到惊讶。 【参考方案1】:
find . -maxdepth 1 -mindepth 1 -type d -exec sh -c '(echo  && cd  && git status -s && echo)' \;

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

【讨论】:

【参考方案2】:

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

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

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

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

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

【讨论】:

在 git status 之前打印工作目录就好了 遇到了同样的问题。我最终得到了find . -name .git -type d -execdir sh -c 'pwd ;git status' \;【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

您可以创建一个脚本。也许也只是将它创建为一个函数并放在.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=(GitRepoA..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

【讨论】:

有没有办法为每个子文件夹执行此操作,这样我就不必手动定义所有文件夹?

以上是关于是否可以为子文件夹中的所有存储库执行 Git 状态?的主要内容,如果未能解决你的问题,请参考以下文章

管理 svn、git 或 cvs 的工具

git:比较更改

如何还原某些用户在 GIT 存储库中所做的更改

监视Jenkins中的存储库,但不要拉

Git中的最大文件大小和最大存储库大小?

Git排除不需要加入文档库的文件