1

現在の作業ディレクトリとそのサブディレクトリで、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

検索は正常に機能しますが、残念ながら、exec 内の環境変数への変更は反映されません。つまり、FOUND_TRACKED常に空で、FOUND_UNTRACKED0 です。

これを機能させる方法はありますか?

4

3 に答える 3

1

プロセスは、親から環境を継承します。親の環境に影響を与える簡単なメカニズムはありません。子プロセスはそれ自体の環境を変更できますが、子プロセスが終了すると、それは単純に破棄されます。find子プロセスでスクリプトを起動するbashと、さらに別のサブプロセスで別のスクリプトが起動されます。

この問題を回避する 1 つの方法は、子プロセスに出力を作成させ、それを親が解釈することです。簡単な例を次に示します。

files="$( /bin/ls )"
if [ "$files" ]; then
    echo "found some files"
else
    echo "no files there"
fi

子プロセスからのより複雑なフィードバックが必要な場合mktempは、親で (を使用して) 一時ファイルを作成し、子プロセスにその出力を保存させて、子プロセスが完了したら親で出力を処理できるようにすることができます。 .

于 2011-04-17T10:12:37.890 に答える
0

私は他の答えに同意しますが、gitユーザーのfind式の有用性を見つけることができません。.git dirはルートにのみ存在するため、gitのサブディレクトリを「追跡されていない」として報告することになります。これは正しくありません。

これは、すべてのディレクトリレベルにCVSディレクトリがあるCVSのような他のSCMとは異なります。

于 2011-04-17T13:25:24.493 に答える
0

サブシェルで実行されるため、エクスポートを find の外に移動して、エクスポートされた変数がそのシェルにのみ存在するようにします。

于 2011-04-17T10:12:54.307 に答える