【问题标题】:Search computer for all .git-folder with uncommited changes在计算机上搜索所有未提交更改的 .git 文件夹
【发布时间】:2018-01-01 22:14:03
【问题描述】:

我的机器上有几个项目文件夹,都包括一个.git-目录。我假设所有程序员都处于这种情况,他们忘记将某些东西推送到服务器。那么有没有办法在所有子目录中搜索未提交/未暂存的更改并列出它们?

这是我的情况的一个例子:

MainFolder
     |
     |-Project1
     |     |-.git # containing uncommitted changes
     |     |-index.php
     |     |-page_one.php
     |
     |-Project2
     |     |-.git # This git-status is clean
     |     |-index.php
     |     |-another_page.php
     |
     |-Project3
     |     |-.git # containing unstaged changes
     |     |-index.php
     |     |-some_page.php
     |
     |-Project4
           |-.git # containing uncommited changes
           |-index.php
           |-some_page.php

我想要一份清单,说:

You need to check these .git-files:
 - MainFolder/Project1/.git 
 - MainFolder/Project3/.git 
 - MainFolder/Project4/.git 

【问题讨论】:

  • 你的问题的困难在于我怀疑你真正想知道的是工作目录和/或舞台是否有任何变化。所以我认为任何答案都必须检查这两个地方,因为这可能是 Git 本身在运行 git status 时必须做的事情。
  • 是的。理想情况下,我想要一个 bash 脚本(或其他东西),如果有 git 文件,则遍历所有子目录并执行“git init”,如果有任何未提交/未阶段的更改,则输出该名称git 文件。我只是希望有一些更简单的解决方案。我尝试在 .git 文件夹中四处查看,但我不知道我在寻找什么。
  • 未分阶段/未提交的更改与忘记推送无关。
  • 公平地说,它可以做到,这取决于 git 是仅用于版本控制还是实际输入管道以构建应用程序。我们过去也遇到过类似的问题。

标签: git bash


【解决方案1】:

find 做你想做的事吗?

find MainFolder -name .git -print -execdir git status \;
  • -name <name> 您要搜索的文件名
  • -print 打印所有匹配项
  • -execdir <command> 在您获得命中执行命令的子目录中;结尾的分号是必需的,并且需要转义,以在查找循环中构建命令

更多详细信息请见man page

【讨论】:

    【解决方案2】:

    我有一个小 bash 脚本用于执行此操作。它不会得到你想要的树,但它会告诉你 git repo 以及是否有任何未提交的更改。

    function runCmd
    {
      echo `basename $dir` "repository:"
      eval $@
      echo
    }
    
    for dir in `ls -d */`
    do
      pushd $dir >> /dev/null
      if [ -d ".git" ]
      then
        runCmd $@
      fi
      popd >> /dev/null
    done
    

    将其保存在名为 allRepo 的文件中。然后你可以从文件树的顶层运行你想要的任何命令:

    allRepo git fetch
    allRepo git status
    

    这个脚本很好,因为它不仅限于 git 命令。

    【讨论】:

    • 听起来不错。我刚刚尝试实现它,但我得到了这四行错误:./allRepo: line 12: pushd: [FOLDERNAME]: No such file or directory ./allRepo: line 17: popd: directory stack empty ./allRepo: line 12: pushd: [FOLDERNAME2]: No such file or directory ./allRepo: line 17: popd: directory stack empty 你知道它为什么会给出这个错误吗?我需要先运行git fetch,然后才能运行git status(我希望不需要,因为这几乎违背了脚本的目的)。
    • 老实说,我不是 bash 专家,根据我的经验,你只需要摆弄它,直到愉快地返回。在这种情况下,“ls -d *”命令似乎没有返回正确的文件夹结构。这个问题似乎还有其他很好的答案,但如果你仍然想搞砸这个,我会从那里开始。
    【解决方案3】:

    您是否使用locate(或其变体mlocateslocate)并定期更新locate.db?我使用以下脚本:

    locate -b \*.git | sed 's!/\.git$!!'| while read d; do
        test -d "$d"/.git || continue
        cd "$d" && test -n "`git status --short`" && echo "$d"
    done
    

    PS。 locate 可以返回裸 (xxx.git) 和非裸 (xxx/.git) 目录,因此我剥离 /.git 并仅测试非裸仓库。

    【讨论】:

    • 我没有尝试这个,因为我在上面找到了答案。
    【解决方案4】:
    find /Mainfolder -name ".git" -type d | awk -F\/ '{ printf "cd ";for ( i=2;i<=NF-1;i++ ) { printf "%s/",$i } printf "; git status | grep -q \"new file\" && echo \"$(pwd) Needs checking\""}' | sh
    

    在一行中使用 awk 查找,找到所有由 git 控制的目录,然后使用 awk 构建目录名称。然后将其打印并执行 git-status 并将结果 grepped 用于“新文件”。这个构造的命令然后通过 sh 管道来执行它。

    需要相应地更改文本“新文件”。

    输出:

    /Mainfolder/Project1 Needs checking
    

    【讨论】:

    • 我没有尝试这个,因为我在上面找到了答案。
    猜你喜欢
    • 1970-01-01
    • 2011-03-22
    • 2014-10-26
    • 2011-06-02
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 2011-03-09
    相关资源
    最近更新 更多