我想创建一个git脚本,在指定的提交范围(abcd..dcba)中将作者“ A”替换为作者“ B”。我怎样才能做到这一点?这是我到目前为止的内容:
#!/bin/sh
#
# git-myCommand
#
#
git filter-branch --commit-filter '
if [ git rev-list --boundary 02e60c8..dc4c65f ]; then
if [ "$GIT_AUTHOR_NAME" = "A" ];then
GIT_AUTHOR_NAME="B";
fi;
fi;
git commit-tree "$@"'
问题是git说
Rewrite $SHA1-Number git commit-tree: line 48: [: too many arguments
git rev-list --boundary命令在if语句中是否合法?如果我删除if [git rev-list ...]语句,它将起作用。
理想的情况是我可以添加输入变量。所以命令看起来像
git myCommand $AuthorExpression $AuthorReplace $CommitA..$CommitB
编辑:有人认为这个问题已经被提出。对于那些人,请再次阅读上面的问题,并将其与以前的问题进行比较。AFAIK这个问题(测试提交是否在提交A和提交B之间)尚未提出。如果我错了,很抱歉浪费您的时间。感谢那些试图回答这个问题的人!
其他人解决了参数引用问题。剩下的最大问题是测试:
if [ git-rev-list ... ]
提交过滤器只是一个shell脚本片段,所以这告诉Shell运行命令:
[ git-rev-list ... ]
并测试该命令的退出状态是否为零(真)或否(假)。该[
命令也称为test
,没有任何git
内置函数。
您似乎想要知道的是,要过滤的原始提交是否属于范围A
..B
包含在内的成员。让我们首先从分支过滤器文档中注意到这一点:
过滤器的应用顺序如下。始终在shell上下文中使用eval命令评估<command>参数(出于技术原因,commit过滤器明显例外)。在此之前,
$GIT_COMMIT
环境变量将设置为包含要重写的提交的ID。
因此,您可以编写如下内容:
A=$(git rev-parse $3) || exit 1
B=$(git rev-parse $4) || exit 1
git filter-branch --commit-filter "
if git merge-base --is-ancestor \$GIT_COMMIT $B &&
! git merge-base --is-ancestor \$GIT_COMMIT $A^; then
第一个merge-base
测试是否$GIT_COMMIT
是较高转速的祖先($B
在拓扑上等于或高于转速)。第二个$A
使用帽子后缀来排除较低的rev()之前的提交,以避免$A
自身被排除。
这是Brian Campbell脚本使用此技术的一种变体(嗯,我也更改了引号扩展技术)。
#! /bin/sh
case $# in
4) ;;
*) echo "usage: $0 oldauthor newauthor firstrev lastrev" >&2; exit 1;;
esac
AuthorExpression=$1
AuthorReplace=$2
A=$(git rev-parse --verify $3^{commit}) || exit 1
B=$(git rev-parse --verify $4^{commit}) || exit 1
git filter-branch --commit-filter "
if git merge-base --is-ancestor \$GIT_COMMIT $B &&
! git merge-base --is-ancestor \$GIT_COMMIT $A^; then
if [ \"\$GIT_AUTHOR_NAME\" = '$AuthorExpression' ]; then
GIT_AUTHOR_NAME='$AuthorReplace'
fi
fi
git commit-tree \"\$@\""
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句