我编写了一个脚本来重写一个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)应该等同于([]&& ...)不是吗?有人能解释一下原因吗?
答案 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
以强制它成功。)