在Bash Shell中运行“git filter-branch”

3

我似乎无法在bash中使用"git filter-branch"命令:

最初的回答:

  fix_commit_date() { 
   git filter-branch --env-filter \
     'if [ $GIT_COMMIT = "${1}" ]
      then
        export GIT_AUTHOR_DATE="${2}"
        export GIT_COMMITTER_DATE="${2}"
      fi' -f
   }

这是我收到的错误信息:

最初的回答

fix_commit_date b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 "Mon Aug 12 13:03:00 2019"
Rewrite b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 (8/8) (0 seconds passed, remaining 0 predicted)    
WARNING: Ref 'refs/heads/master' is unchanged

如果我只是在bash中打出命令而不使用fix_commit_date,它可以正常工作。有什么想法可以让fix_commit_date命令在bash中工作吗?谢谢。

最初的回答:


你所说的“我只是随便打出来”具体是什么意思?真正的命令是什么? - undefined
git filter-branch --env-filter
'if [ $GIT_COMMIT = b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 ] then export GIT_AUTHOR_DATE="Mon Aug 12 13:03:00 2019" export GIT_COMMITTER_DATE="Mon Aug 12 13:03:00 2019" fi' -f
- undefined
可能是Bash中单引号和双引号的区别的重复问题。 - undefined
1个回答

5
你的shell函数使用了不恰当的引号。
尝试在git filter-branch前加上echo
echo git filter-branch --env-filter \
  'if [ $GIT_COMMIT = b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 ]
  then
    export GIT_AUTHOR_DATE="Mon Aug 12 13:03:00 2019"
    export GIT_COMMITTER_DATE="Mon Aug 12 13:03:00 2019"
  fi' -

观察输出。针对提交哈希值的测试,您看到了什么?

然后按照所写的方式尝试您的shell函数,在git前插入echo

fix_commit_date() { 
   echo git filter-branch --env-filter \
     'if [ $GIT_COMMIT = "${1}" ]
      then
        export GIT_AUTHOR_DATE="${2}"
        export GIT_COMMITTER_DATE="${2}"
      fi' -f
}

fix_commit_date b62178fd4d40e1e52a7bfef64ff2f269c3aff7f8 "Mon Aug 12 13:03:00 2019"

你看到了什么输出?

这里的技巧是要扩展参数$1$2,同时仍然将整个表达式作为单个单词提供给命令。有许多方法可以做到这一点;以下是其中一种:

fix_commit_date() { 
   git filter-branch --env-filter \
     'if [ $GIT_COMMIT = "'"${1}"'" ]
      then
        export GIT_AUTHOR_DATE="'"${2}"'"
        export GIT_COMMITTER_DATE="'"${2}"'"
      fi' -f
}

尝试先插入echo的变体。
顺便说一下,我喜欢用一个shell变量来包含双引号的技巧,以更加可读的方式编码此类内容。
DQ='"'
echo "John told me to say ${DQ}hello${DQ}"

每个 shell 扩展元字符都可以放入一个变量中:
DOL='$'
BQ='`'
SQ="'"  # not technically needed

否则,也可以设置“不可见”字符:
TAB=$'\t'
NL=$'\n'

现在,您可以写出类似以下的内容:

echo "This has some ${DOL}weird ${BQ}ch${TAB}ara${NL}cters in it, doesn't it?"

1
它有效了。非常感谢你提供的回声调试技巧! - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接