2009-06-07 115 views
14

我有本地Git仓库某处我的文件系统的一堆(10-15)的所有未提交当地人回购,但所有的文件夹/数据/混帐:查找目录树

我想找到所有的/任何有未得到改变的文件夹。我怎样才能做到这一点?有点像递归全局git status变种。

所有的答案错了,我想。任何git命令只能在git控制下的文件夹中使用。我需要一些东西来搜索这样的文件夹。

所以不是我写这个剧本,这是否:


#!/usr/bin/env ruby 
require 'find' 
require 'fileutils' 

#supply directory to search in as argument 

@pat = ARGV[0] 
(puts "directory argument required"; exit) unless @pat 
Dir.chdir(@pat) 
Find.find(@pat) do |path| 
    if FileTest.directory?(path) 
    Dir.chdir(path) 
    resp = `git status 2>&1` 
    unless resp =~ /fatal|nothing to commit \(working directory clean\)/i 
     puts "#{'#'*10}\n#{Dir.pwd}#{'#'*10}\n#{resp}" 
     Find.prune 
    end 

    Dir.chdir(@pat) 
    end 
end 
 

回答

6

东西沿着这些路线?

 
$ for i in /data/*/; do (cd $i && (echo $i; git status)); done 
$ for i in /data/*/; do (cd $i \ 
> && (git status | grep -qx 'nothing to commit (working directory clean)' \ 
> || (echo $i && git status))); done 
+0

不要使用git的状态做的工作。改用git-ls-files和git-diff/git-diff-files。 – 2009-06-07 17:44:12

+0

git-status有什么问题? – Bombe 2009-06-08 08:53:36

+4

git-status是所谓的瓷器,它意味着用户,而不是脚本。其输出可能会改变,恕不另行通知 – 2009-06-09 11:05:46

0

您可以使用“git ls-files --modified --deleted --exclude标准”列出所有修改和删除文件(--exclude-standard没有可能需要在那里,但为了以防万一,你要列出所有未知文件不会被​​...忽略)。然后您可以检查该命令的输出是否为空。

或者你可以查看“git diff --quiet HEAD”的退出状态,如果你想检查“git commit -a”是否会提取任何东西,或者“git diff --cached --quiet HEAD”想要检查“git commit”是否会选择任何东西(或其管道亲属之一:git-diff-filesgit-diff-index)。

0
for rp in /srv/*/ 
do 
    printf '\ec' 
    cd "$rp" 
    git status 
    echo "${rp%/}" 
    read 
done 

Example

4

我不认为Git有此建立,因此,我(也)创建一个脚本来做到这一点:https://github.com/mnagel/clustergit

在这里张贴片段中的问题是,他们由于git status的输出格式发生变化而中断。我的脚本有同样的问题(因为它基本上以同样的方式工作),但至少你总是得到最新版本。 enter image description here

+0

我喜欢这个剧本! – ben 2017-09-12 08:22:32

0

这不是格式化很花哨但如何像

find . -iname ".git" -type d | sed -rne "s|(.+)/\.git|echo \1;cd \1;git status;cd /data|p" | bash 
10

find命令是你的朋友,与一些贝壳魔术一起。

find . -type d -name '.git' | while read dir ; do sh -c "cd $dir/../ && echo -e \"\nGIT STATUS IN ${dir//\.git/}\" && git status -s" ; done 

来自:https://gist.github.com/tafkey/664266c00387c98631b3