从 bash shell 运行“git filter-branch”

Lin*_*han 3 git bash

我似乎无法让“git filter-branch”在 bash 中工作:

  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
   }
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息:

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
Run Code Online (Sandbox Code Playgroud)

如果我只是输入它而不使用 fix_commit_date ,它在 bash 中工作得很好。有什么想法可以让 fix_commit_date bash 命令起作用吗?谢谢。

tor*_*rek 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' -
Run Code Online (Sandbox Code Playgroud)

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

然后尝试编写 shell 函数,再次echo在前面插入git

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"
Run Code Online (Sandbox Code Playgroud)

你看到什么输出?

这里的技巧是扩展参数$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
}
Run Code Online (Sandbox Code Playgroud)

首先尝试插入此变体echo


顺便说一句,我最喜欢的以更易读的方式编码此类内容的技巧之一是设置 shell 变量以包含双引号:

DQ='"'
echo "John told me to say ${DQ}hello${DQ}"
Run Code Online (Sandbox Code Playgroud)

每个 shell 扩展的元字符都可以放入一个变量中:

DOL='$'
BQ='`'
SQ="'"  # not technically needed
Run Code Online (Sandbox Code Playgroud)

否则,也可以设置“不可见”字符:

TAB=$'\t'
NL=$'\n'
Run Code Online (Sandbox Code Playgroud)

现在你可以写这样的东西:

echo "This has some ${DOL}weird ${BQ}ch${TAB}ara${NL}cters in it, doesn't it?"
Run Code Online (Sandbox Code Playgroud)