我想找到当前工作目录及其子目录下的所有目录,这些目录要么是git存储库的根目录,要么根本没有被git跟踪。
为了做到这一点,我写了这个bash脚本:#!/bin/bash
export FOUND_UNTRACKED=0
export FOUND_TRACKED=
find . -type d ( ( -exec test -d {}.git ; -exec /bin/bash -c "export FOUND_TRACKED=$1:$FOUND_TRACKED" {} ; -prune ) -o -exec echo Untracked directory: {} ; -exec /bin/bash -c "export FOUND_UNTRACKED=1" ; )
echo $FOUND_UNTRACKED
echo $FOUND_TRACKED
find工作得很好,但不幸的是,对exec内部环境变量的更改没有传播。例如,FOUND_TRACKED
总是空的,FOUND_UNTRACKED
是0。
你知道怎么让这东西工作吗?
进程从父进程继承环境。没有一种简单的机制可以影响父进程的环境:子进程可以改变它自己的环境,但是当子进程退出时,它就会被抛弃。bash脚本在一个子进程中启动find
,然后在另一个子进程中启动另一个bash
。
files="$( /bin/ls )"
if [ "$files" ]; then
echo "found some files"
else
echo "no files there"
fi
如果您需要从子进程获得更复杂的反馈,您可以在父进程中创建一个临时文件(使用mktemp
),并让子进程将其输出保存到该文件中,以便在子进程完成后可以在父进程中处理输出。
将导出移出find,因为它将在子shell中运行,因此任何导出的变量将仅位于该shell中。
虽然我同意其他答案-我找不到你的查找表达式的实用程序为一个git用户。.git目录只在根目录…所以你最终报告git的子目录为'not tracked',这是不正确的。
这与CVS等其他scm不同,CVS在每个目录级别都有一个CVS目录