我一直在寻找解决方案一段时间,并没有找到我需要的东西。
我在Mac上的一个文件夹中有几个Git存储库(OSX 10.6),并且想要一个循环遍历所有存储库的脚本或工具,让我知道它们是否需要commit
。
这是我的结构
Sites
/project1
/project2
/project3
我希望该工具在Sites / project1,Sites / project2,Sites / project3中执行git status
,并告诉我们是否有任何更改或需要暂存或提交的新文件。
我发现的最接近的脚本可能是hackable is here,,但即使该脚本也无法运行,我收到错误:
“意外令牌附近的语法错误`do”
可能是为* nix编写的。
答案 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)
答案 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