【问题标题】:git: Find all uncommitted locals repos in a directory treegit:在目录树中查找所有未提交的本地存储库
【发布时间】:2010-10-31 23:00:23
【问题描述】:

我的文件系统中某处有一堆 (10-15) 本地 git 存储库,但都在文件夹 /data/ 中

我想查找所有/任何具有未提交更改的文件夹。我怎样才能做到这一点?有点像递归全局 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

【问题讨论】:

    标签: git scripting file


    【解决方案1】:

    改编自这篇关于如何print git status of all repositories under the current folder的要点:

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

    find 命令是你的朋友,还有一些 shell 魔法。

    【讨论】:

    • 在这里稍微挖掘一下过去,但是你能解释一下它是如何工作的吗?
    • @GPPK 查找当前文件夹下的所有 .git 目录,管道到 while 循环以获取命名变量,cd 到每个 $dir 并回显其 git status 同时还显示该目录
    【解决方案2】:

    类似的东西?

    $ for i in /data/*/;做 (cd $i && (echo $i; git status));完毕 $ for i in /data/*/;做 (cd $i \ > && (git status | grep -qx '没有提交(工作目录干净)' \ > || (echo $i && git status)));完毕

    【讨论】:

    • 不要使用 git-status。请改用 git-ls-files 和 git-diff / git-diff-files。
    • git-status 是所谓的瓷器,它意味着用户,而不是脚本。它的输出可以更改,恕不另行通知。
    【解决方案3】:

    我认为 git 没有这个构建,因此我(也)创建了一个脚本来执行此操作:https://github.com/mnagel/clustergit

    这里发布的 sn-ps 的问题是它们会随着 git status 的输出格式的变化而中断。我的脚本有同样的问题(因为它基本上以相同的方式工作),但至少你总是得到最新版本。

    【讨论】:

    • 我喜欢这个脚本!
    • 您可以通过使用--porcelain 标志来避免在git status 的输出中发生破坏性更改。有关详细信息,请参阅手册页。
    【解决方案4】:

    还有一个名为 multi-git-status 的 shell 脚本可以执行此操作。

    只需使用mgitstatus 命令(带有可选的目录名称参数):

    【讨论】:

      【解决方案5】:

      我认为这将为每个 repo 完成工作

      git status -uall
      

      https://git-scm.com/docs/git-status

      【讨论】:

      • 这只完成了一半的工作。 OP 想要为每个 repo 运行 status 命令。
      【解决方案6】:

      仅使用查找

      真的不需要花哨的 bash 愚蠢,只需使用 find。

      find . -type d -name .git -print -execdir git status \;
      
      • find . -type d -name .git 递归查找所有 .git 存储库
      • -print打印.git目录的路径
      • -execdir git status \; 在该目录(包含 git 目录的目录)中运行 git status

      【讨论】:

        【解决方案7】:

        您可以使用 "git ls-files --modified --deleted --exclude-standard" 列出所有修改和删除的文件(--exclude-standard 可能不需要,但以防万一您想列出所有未知文件--other... 不会忽略这些内容。然后您可以检查此命令的输出是否为空。

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

        【讨论】:

          【解决方案8】:
          for rp in /srv/*/
          do
            printf '\ec'
            cd "$rp"
            git status
            echo "${rp%/}"
            read
          done
          

          Example

          【讨论】:

            【解决方案9】:

            格式化不是很花哨,但是像这样的东西怎么样

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

            【讨论】:

              【解决方案10】:

              我现在意识到这是一个相当老的线程,但在 Windows 10 中,我无法让 @Tasos 解决方案中的 WHILE/DO 循环正常工作,因此我将其转换为 PowerShell。

              此版本还打印出每个未提交更改的状态以及一些格式设置,以便按文件夹名称进行分组。

              cd C:\Projects
              
              $msgs = @()
              gci ".git" -Directory -Recurse -Hidden | % {
                  $dir = $_
                  cd $dir\..
              
                  $gitMsgs = (git status -s)
                  if ( $gitMsgs ) {
                      $msgs += "$dir ****************************"
                      $msgs += $gitMsgs
                      $msgs += ""
                  } 
              }
              $msgs | % { Write-Host $_ }
              
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-02-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多