时间:2010-05-04 12:34:59

标签: git bash macos shell

我一直在寻找解决方案一段时间,并没有找到我需要的东西。

我在Mac上的一个文件夹中有几个Git存储库(OSX 10.6),并且想要一个循环遍历所有存储库的脚本或工具,让我知道它们是否需要commit

这是我的结构

Sites
  /project1
  /project2
  /project3

我希望该工具在Sites / project1,Sites / project2,Sites / project3中执行git status,并告诉我们是否有任何更改或需要暂存或提交的新文件。

我发现的最接近的脚本可能是hackable is here,,但即使该脚本也无法运行,我收到错误:

  

“意外令牌附近的语法错误`do”

可能是为* nix编写的。

10 个答案:

答案 0 :(得分:23)

似乎这个问题已经得到了很好的回答,但我想在完成同样的工作之后再投入两美分。

我使用简单的bash脚本更接近jcordasc的答案。我做了一件有点不同的事情。查看git的帮助文档,您可以设置git目录和工作目录。这消除了'cd'到目录的需要。并不是说它真的有那么大的差别......

#!/bin/bash

for gitdir in `find ./ -name .git`; 
    do 
        workdir=${gitdir%/*}; 
        echo; 
        echo $workdir; 
        git --git-dir=$gitdir --work-tree=$workdir status; 
    done

显然,他对于如何显示状态更为先进/清洁......

答案 1 :(得分:12)

有一个基于Python的程序,uncommitted听起来就像你想做的那样。它还没有git支持(只有hg和Subversion),但是你可以帮助作者在他的app中实现git支持,或者把他的想法作为如何实现你的东西(他在项目页面上记录他的发现方法)我链接到了。)

答案 2 :(得分:5)

这是一个较老的问题,但我去了更新jcordasc的答案,所以它适用于git 1.7.7.5,我想我也可以在这里做出贡献:

https://gist.github.com/3018100

此版本将任何路径或路径作为参数,并为其在参数表示的文件树中的任何位置找到的任何git存储库提供jcordasc的输出。它还支持检测未刷新和未合并的提交。

答案 3 :(得分:5)

使用jsut单个shell别名检查多个repo状态。无需安装。所有积分为:https://coderwall.com/p/grmruq/git-status-on-all-repos-in-folder

对于bash:

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

或Cshell

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

答案 4 :(得分:4)

如果您只想在本地存储库中使用状态文件,则需要执行以下操作:http://gist.github.com/389478。您需要修改for循环中的模式以拾取您想要的任何目录。

答案 5 :(得分:2)

我花了一些时间从@Andrew Roberts获取代码来处理一系列文件夹..如果你也遇到问题,请查看https://gist.github.com/3666392

感谢伟大的剧本@Andrew Roberts和@jcordasc ..正是我需要的。

答案 6 :(得分:2)

我今天也发生了同样的问题,除了这个页面,我发现非常有用并且有非常好的提示,我也遇到了following blog post。它引入了一个完全相同的python脚本:

Usage: show_status [options]

Show Status is awesome. If you tell it a directory to look in, it'll scan
through all the sub dirs looking for a .git directory. When it finds one it'll
look to see if there are any changes and let you know. It can also push and
pull to/from a remote location (like github.com) (but only if there are no
changes.) Contact mike@mikepearce.net for any support.

Options:
  -h, --help            show this help message and exit
  -d DIRNAME, --dir=DIRNAME
                        The directory to parse sub dirs from
  -v, --verbose         Show the full detail of git status
  -r REMOTE, --remote=REMOTE
                        Push to the master (remotename:branchname)
  -p PULL, --pull=PULL  Pull from the master (remotename:branchname)

整件事情都在this git repo

答案 7 :(得分:1)

聚会很晚,但我写了一个工具来为我做这件事。这是一个简单的shell脚本,可以找到on Github.

看起来像这样:

Projects/fboender/multi-git-status: Uncommitted changes; Projects/fboender/jerrybuild.tst: Needs push (doc, master); Projects/fboender/multi-git-status.bak: Needs push (master); Projects/fboender/tempita: ok; Projects/fboender/dirigent: Uncommitted changes Untracked files; Projects/flusso/boxes: ok; Projects/flusso/docker: ok; Projects/flusso/deployments: ok; Projects/flusso/backup: ok;

答案 8 :(得分:0)

这是一种简单的方法,可以在单行中完成这些操作。我错过了最后一步,一旦我找到它就会添加(除非别人知道)。

对于git status你可以这样做:

find ./Sites -name .git | awk '{ print "git --git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " status" }'

然后复制输出并执行它。

对于完整的差异,您可以运行:

find ./Sites -name .git | awk '{ print "git --git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " --no-pager diff" }'

你必须做的复制粘贴事情让我很烦。它应该也在那里使用xargs,但不知何故,git抱怨:

find ./Sites -name .git | awk '{ print "--git-dir=" $1 " --work-tree " substr($1,1,length($1) - 4) " --no-pager diff" }' | xargs git

如果有人知道如何在最后一个命令中修复git投诉,请编辑此答案。

答案 9 :(得分:0)

还有一个ruby gem用作git sub命令:https://github.com/reednj/git-status-all

# install the gem    
gem install git-status-all

# use the status-all subcommand to scan the directory
git status-all 

git status all