[英]Running "git filter-branch" from bash shell
我似乎无法让“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
}
这是我收到的错误消息:
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
如果我只是输入它而不使用 fix_commit_date,它在 bash 中工作正常。 任何想法如何让 fix_commit_date bash 命令工作? 谢谢。
您的 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' -
观察输出。 您对提交哈希 ID 的测试有何看法?
然后尝试编写您的 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?"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.