是否可以为子文件夹中的所有存储库执行 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)' \;
它以递归方式工作。您可以根据自己的要求更改maxdepth
和mindepth
【讨论】:
【参考方案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 状态?的主要内容,如果未能解决你的问题,请参考以下文章