在计算机上搜索所有未提交更改的 .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
(或其变体mlocate
或slocate
)并定期更新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 文件夹的主要内容,如果未能解决你的问题,请参考以下文章