0

我写了一个脚本来重写一个 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 [ ]; 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

就运行的内容而言,两者确实是等价的。区别在于 shell 的退出状态,如果它在done. Git 的filter-branch脚本检查每个过滤器的退出状态,如果非零则中止。

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

于 2013-10-09T02:31:52.557 回答