0

ファイルがサブフォルダーにあるかのようにリポジトリを書き換えるスクリプトを作成しました。

これはうまくいきました:

git filter-branch --tree-filter 'd="subfolder"; [ ! -f "$d" ] && mkdir -p "$d" && for file in *; do if [ "$file" != "$d" ]; then mv "$file" "$d"; fi; done' -- test

これはエラーを返しましたが、Rewrite a92e7d6bd57d523fdffa227bffdc76d7b9eb7c7a (1/5)tree filter failed

git filter-branch --tree-filter 'd="subfolder"; [ ! -f "$d" ] && mkdir -p "$d" && for file in *; do [ "$file" != "$d" ] && mv "$file" "$d"; done' -- test

リビジョン a92e7d6bd57d523fdffa227bffdc76d7b9eb7c7a でさらにテストを行ったところ、期待どおりに動作しました。

d="subfolder"; [ ! -f "$d" ] && mkdir -p "$d" && for file in *; do [ "$file" != "$d" ] && mv "$file" "$d"; done

私は混乱しています: (if [ ]; then ...; fi) は ([ ] && ...) と同等でなければなりませんね? 誰かが理由を説明できますか?

4

1 に答える 1

3

答えは次のとおりです。

bash$ for i in a; do false && mv foo bar; done; echo $?
1
bash$ for i in a; do if false; then mv foo bar; fi; done; echo $?
0

この 2 つは、実行される内容に関してはまったく同じです。違いは、シェルが の直後に終了する場合の終了ステータスにありますdone。Git のfilter-branchスクリプトは各フィルターの終了ステータスをチェックし、それがゼロでない場合は中止します。

(いつでも:をシーケンス; trueの最後に追加して、強制的に成功させることができます。)prog1 && prog2

于 2013-10-09T02:31:52.557 に答える