12

再帰的な深さ優先git submodule foreachコマンドを実行する堅牢な方法はありますか? foreach --recursive幅優先であることを除いて、仕事をするコマンドを使用しています。次の構造がある場合、これは問題です。

    • B

そして、3つすべてにコミットがあり、aforeach --recursive add -A && git commit ...はA、B、Cにヒットします。これは、その時点でスーパーモジュールにBのコミットをキャプチャさせたい場合に問題になります。

このディスカッションは 2008 年に見つかりましたが、提案された機能のいずれも、私が使用している Git の現在のバージョン (1.7.9.5) には含まれていないようです。

これを行うための小さな bash 関数を作成しました (省略形の命名をお許しください)。

function git-sfed() { git submodule foreach "git submodule foreach '$*' && $*"; }

そして、次の空想的なコマンドでテストするとうまくいくようです:

git-sfed 'python -c "import sys; print sys.argv" $path'

このコマンドは堅牢に見えますか、それとも他の一般的な既存の方法はありますか?

4

2 に答える 2

15

これを試すことができます

git submodule  foreach --recursive  |  tail  -r | sed 's/Entering//' | xargs -I% cd % ; git add -A \& git commit

このリストは(再帰的に)すべてのサブモジュールをリストし、次にリストを逆にtail -rするため、必要な順序でディレクトリを取得し(子が最初)、ディレクトリに入り、その中で必要なことを行います。

于 2013-02-13T14:58:40.047 に答える
3

foreach深さ優先コマンドを実行する関数以外の方法は見つかりませんでした。

テストは、複数の深さで再帰を達成するかどうかを確認することです。

A
  B
    D
  C

一重引用符を入れようとすると、あなたと私のコマンドで問題が発生しました(それらを書くことができないのはちょっとひどいです)-複数レベルのbashコマンドでエスケープするのは少し混乱します。

この (引用符の問題) は、Git 1.9/2.0 (2014 年第 1 四半期) で、Anders Kaseorg (andersk)からのコミット 1c4fb13で簡素化される必要があります。

' eval "$@"' は、シェル解釈の追加レイヤーを作成します。これは、複数の引数を git サブモジュール foreach に渡すユーザーにはおそらく期待されていません。

 $ git grep "'"
 [searches for single quotes]
 $ git submodule foreach git grep "'"
 Entering '[submodule]'
 /usr/lib/git-core/git-submodule: 1: eval: Syntax error: Unterminated quoted string
 Stopping at '[submodule]'; script returned non-zero status.

これを修正するには、ユーザーが複数の引数$@を渡す場合、 に渡す代わりに " " を直接実行しevalます。

例:

  • 余分なレベルの引用符を追加する場合の一般的な使用法は、シェルに渡されるコマンド全体を表す単一の引数を渡すことです。
    これはそれを変更しません。
  • 誰かが信頼できない入力を引数として与えることを想像できます:
    git submodule foreach git grep "$variable"

これにより、現在、明らかではないシェル コード インジェクションの脆弱性が発生しています。
このパッチのように、引数で指定されたコマンドを直接実行すると、修正されます。


Git 2.21 (2017 年第 2 四半期) 以降、git grep -e "bar" --recurse-submodules

于 2013-02-13T07:50:07.840 に答える