【问题标题】:Inverted shell globbing inside git filter-branchgit filter-branch 内的倒置 shell globbing
【发布时间】:2016-10-10 21:11:04
【问题描述】:

我正在尝试进行相当复杂的 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"

【问题讨论】:

    标签: git shell zsh git-filter-branch


    【解决方案1】:
    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-list args(在第一个 -- 之后)已经跳过所有这些。

    【讨论】:

      【解决方案2】:

      仍然不确定为什么我不能让它与 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' HEAD
      

      【讨论】:

      • 这对我有用,除了我必须使用脚本的完整路径,因为重写命令在像C:/Users/User/MyRepo/.git-rewrite/t这样的临时目录中工作
      猜你喜欢
      • 2013-03-29
      • 2020-07-22
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 2013-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多