git filter-branch在比较bash语法上失败

时间:2013-10-09 00:54:29

标签: git bash

我编写了一个脚本来重写一个repo,好像这些文件已存在于子文件夹中一样。

这个有用:

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 [];然后......; fi)应该等同于([]&& ...)不是吗?有人能解释一下原因吗?

1 个答案:

答案 0 :(得分:2)

答案可以在以下内容中找到:

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

这两者在运行方面确实相同。不同之处在于shell的退出状态,如果它在done之后立即退出。 Git的filter-branch脚本检查每个过滤器的退出状态,如果非零,则中止。

(您始终可以在; true序列的末尾添加:prog1 && prog2以强制它成功。)