在git-filter-branch的一次传递中重命名多个名称和电子邮件

时间:2015-11-23 08:07:37

标签: git version-control git-filter-branch git-rewrite-history

是否可以通过一次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}}

然后分支历史全都纠缠在一起:

this answer

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。也就是说,新图可以是双射的或满射的,但是过滤器 - 分支并不真正相信内射,因为它会尝试将旧引用映射到新图。)