是否可以通过一次if..fi clause
批量重命名两个或多个电子邮件地址?
我尝试通过复制git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name 1>" ];
then
GIT_COMMITTER_NAME="<New Name 1>";
GIT_AUTHOR_NAME="<New Name 1>";
GIT_COMMITTER_EMAIL="<New Email 1>";
GIT_AUTHOR_EMAIL="<New Email 1>";
git commit-tree "$@";
else
git commit-tree "$@";
fi
if [ "$GIT_COMMITTER_NAME" = "<Old Name 2>" ];
then
GIT_COMMITTER_NAME="<New Name 2>";
GIT_AUTHOR_NAME="<New Name 2>";
GIT_COMMITTER_EMAIL="<New Email 2>";
GIT_AUTHOR_EMAIL="<New Email 2>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
来调整answer中的代码:
error: duplicate parent bc8f9924c33558a275b8f694969529cf56232c80 ignored
但它在过滤器分支期间给了我错误,如下所示:
{{1}}
然后分支历史全都纠缠在一起:
答案 0 :(得分:2)
在根据需要设置所有环境变量后,您只需要一个git commit-tree
命令。例如,您的提交过滤器可能会显示如下内容:
git filter-branch -f --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name 1>" ]; then
GIT_COMMITTER_NAME="<New Name 1>";
GIT_AUTHOR_NAME="<New Name 1>";
GIT_COMMITTER_EMAIL="<New Email 1>";
GIT_AUTHOR_EMAIL="<New Email 1>";
fi;
if [ "$GIT_COMMITTER_NAME" = "<Old Name 2>" ]; then
GIT_COMMITTER_NAME="<New Name 2>";
GIT_AUTHOR_NAME="<New Name 2>";
GIT_COMMITTER_EMAIL="<New Email 2>";
GIT_AUTHOR_EMAIL="<New Email 2>";
fi;
git commit-tree "$@"
'
(虽然如果要更改的名称更改次数我可能会通过映射文件而不是一系列容易错误的if ... then
来运行,这可能更有意义分别映射作者和提交者。)
请记住,filter-branch
只需复制您要复制的所有提交(使用git commit-tree
制作新副本),同时构建&lt; old的地图-sha1,新-SHA1&GT;对。这就是为什么进行两次提交并不好:一个现有的(旧)SHA-1现在必须映射到两个新副本,根据filter-branch
对提交图的作用,这是不允许的。 (如果您在复制过程中选择省略某些提交,则多个旧SHA-1可以映射到单个新SHA-1。也就是说,新图可以是双射的或满射的,但是过滤器 - 分支并不真正相信内射,因为它会尝试将旧引用映射到新图。)