是否可以对子文件夹中的所有repos都进行Git状态处理?

jslywgbw  于 2022-12-25  发布在  Git
关注(0)|答案(7)|浏览(148)

我有一个文件夹,它包含10个子文件夹,每个子文件夹包含一个单独的git repo。

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

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

ddarikpa

ddarikpa1#

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

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

对于每个名为.git的目录,将从包含它的目录(-execdir)中执行git status
你也可以附加-prune,这样就不会在git项目的子目录中更进一步,这样会更高效(但可能会跳过git子模块--我不知道子模块是如何工作的,我从来没有使用过它们):

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

t0ybt7op2#

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

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

jogvjijk3#

你可以创建一个脚本,也可以把它创建成一个函数,放在.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
}
ar5n3qh5

ar5n3qh54#

我写了一个shell脚本mgit来处理这个问题,它读取当前目录中的一个隐藏文件.mgit,这个文件包含了一系列作为独立git仓库的文件夹。

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

w46czmvw5#

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

它是递归工作的,您可以根据需要更改maxdepthmindepth

bxgwgixi

bxgwgixi6#

git status **/* *

其中:

    • /=子目录中的每个文件
    • =根目录中的每个文件
kknvjkwl

kknvjkwl7#

我尝试了这里所有的建议,由于各种原因,没有一个对我真正有效。
这是我的个人资料,我经常使用它。

gitr () {
  for f in $(find . -type d -name .git | awk -F"/.git$" '{print $1}');  do
    echo
    echo "................................ (cd $f && git $*) ........................................."
    echo
    (cd $f && git $*)
  done
}

代码文件中的代码段可以使用.“”命令轻松加载到bash中,例如:

. gitr.sh # file containing gitr() function, if not in a profile file

然后我就可以跑了

gitr status

我得到的结果是:

................................ (cd ./dir0 && git status) .........................................

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

................................ (cd ./dir1 && git status) .........................................

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

................................ (cd ./dir2 && git status) .........................................

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

................................ (cd . && git status) .........................................

On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

gitr log -c 1

gitr rev-parse --abbrev-ref HEAD

相关问题