我正在尝试一个相当复杂的git历史记录,但没有找到一个与git filter-branch一起工作的命令。本质上,我想删除所有的东西,除了几个匹配的文件和目录。
我想要运行的命令是有效的
git filter-branch -f --prune-empty --tree-filter 'rm -rf ^(FileA.java|dirB)' HEAD但是git-filter-branch脚本会在父母身上出现。
/usr/local/Cellar/git/HEAD/libexec/git-core/git-filter-branch: eval: line 360: syntax error near unexpected token `('
/usr/local/Cellar/git/HEAD/libexec/git-core/git-filter-branch: eval: line 360: `rm -rf ^(FileA.java|dirB)'
tree filter failed: rm -rf ^(FileA.java|dirB)我本来希望eval能够很好地处理嵌入的父类,但这也超出了我对shell/zsh的理解。
和git-filter-branch中的违规代码
if [ "$filter_tree" ]; then
git checkout-index -f -u -a ||
die "Could not checkout the index"
# files that $commit removed are now still in the working tree;
# remove them, else they would be added again
git clean -d -q -f -x
eval "$filter_tree" < /dev/null ||
die "tree filter failed: $filter_tree"发布于 2016-06-10 04:39:39
git filter-branch -f --index-filter '
git read-tree --empty
git reset $GIT_COMMIT fileA.java dirB dirC
' -- --all -- fileA.java dirB dirC只会看到接触到这些路径的提交,并且(b)不会费心地签出永远不会被检查的内容。唯一需要--prune-empty的时间是当您遇到或生成不改变任何内容的提交时,rev列表args (在第一个--之后)跳过了所有这些。
发布于 2016-06-10 03:10:53
仍然不确定为什么我不能让它与zsh一起工作,所以不得不用bash脚本包装。
$ cat ../purge.sh
#!/bin/bash
shopt -s extglob
rm -rf -- !(FileA.java|dirB|dirC)
$ git filter-branch -f --prune-empty --tree-filter '../purge.sh' HEADhttps://stackoverflow.com/questions/37739109
复制相似问题