在计算机上搜索所有未提交更改的 .git 文件夹

Posted

技术标签:

【中文标题】在计算机上搜索所有未提交更改的 .git 文件夹【英文标题】:Search computer for all .git-folder with uncommited changes 【发布时间】: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 是仅用于版本控制还是实际输入管道以构建应用程序。我们过去也遇到过类似的问题。 【参考方案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

【讨论】:

我没有尝试这个,因为我在上面找到了答案。

以上是关于在计算机上搜索所有未提交更改的 .git 文件夹的主要内容,如果未能解决你的问题,请参考以下文章

Git - 如何返回最后一次提交并删除所有未提交的文件?

(Git) 如何推送未做任何更改的文件?

git舍弃文件更改

如何撤消 git 中的最后一次提交,但保持我的更改未暂存?

如何处理未提交的更改

git:撤消所有工作目录更改,包括新文件