git - 在一次 git-filter-branch 中重命名多个姓名和电子邮件

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

是否可以通过一次 git filter-branch 批量重命名 2 个或更多电子邮件地址?

我尝试改编 this answer 中的代码只需复制 if..fi 子句:

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

但是它在过滤器分支期间给了我错误,如下所示:

error: duplicate parent bc8f9924c33558a275b8f694969529cf56232c80 ignored

然后分支历史就变得困惑起来:

enter image description here

最佳答案

你只想要一个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 制作新副本),同时构建 对的映射。这就是为什么进行两次提交并不好:一个现有的(旧的)SHA-1 现在必须映射到两个新副本,这在 filter-branch 方面是根本不允许的。与提交图一起做。 (如果您选择在复制过程中省略一些提交,多个旧的 SHA-1 可以映射到一个新的 SHA-1。也就是说,新图可以是双射的或满射的,但过滤器 -分支并不真正相信单射,因为它将尝试将旧引用映射到新图。)

关于git - 在一次 git-filter-branch 中重命名多个姓名和电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33866185/

相关文章:

git - 如何在不丢失历史记录的情况下将大型 Perforce 存储库导出到不同的版本控制系统?

visual-studio - 了解文件的当前修订版本或 AnkhSVN 的项目/解决方案

git - 如何在git中 merge 和更新文件时解决冲突?

git 说我有未暂存的更改,但我看不到它们

.net - 远程代理与本地代理的持续集成和部署

git - 加速 bash 脚本将 git repo 转换为 LFS

version-control - 在源代码控制中存储自动化测试的位置

git - 如何更改多个提交的作者和提交者姓名/电子邮件?

git - 为什么大文件在用 filter-branch 清理后仍然存在于我的 packfile 中?

git - 在公开共享的分支上 git reset --HARD 的后果?