Git 在多个筛选提交中更改作者

Git 在多个筛选提交中更改作者,git,svn,visual-sourcesafe,Git,Svn,Visual Sourcesafe,我只是将旧的存储库SVN&VSS转换为Git,其中有很多错误信息我想更正。在某些时间段,我有错误的作者/提交人,因为相同的用户使用了2次登录,这里使用了同事的登录 我使用带有-after选项的git过滤器来查找相应的提交ID,现在有了一个文本文件,其中提交ID必须逐行存储,其中只需替换作者 我现在已经试过了 git commit --amend --author="<my new author>" --no-edit <commit hash> 据我所知,我首先必须检查

我只是将旧的存储库SVN&VSS转换为Git,其中有很多错误信息我想更正。在某些时间段,我有错误的作者/提交人,因为相同的用户使用了2次登录,这里使用了同事的登录

我使用带有-after选项的git过滤器来查找相应的提交ID,现在有了一个文本文件,其中提交ID必须逐行存储,其中只需替换作者

我现在已经试过了

git commit --amend --author="<my new author>" --no-edit <commit hash>
据我所知,我首先必须检查提交,然后更改它,然后重新设置它的基础。只有这样,所有过滤的提交ID才会更改

我需要一个解决方案,在该解决方案中,我遍历文本文件的每一行,然后为每个ID设置作者,并在末尾重新设置基础:

for i in $(cat /tmp/commitids.txt); do 
    <I dont know the correct git command to replace the author of the commit in $1> 
done; 
<I don't know the correct rebase command for all the changes>

如果需要筛选器分支,它将为您处理id重写,您只需提供内容和元数据更改。在您的例子中,假设您的CommitID文件是标签分隔的哈希代码、作者姓名、作者电子邮件,它将非常接近键盘到文本框的警告

git filter-branch --setup '
        declare -A authors; while read id auth; do authors[$id]=$auth; done <commitids
    ' --env-filter '
        [[ -v authors[$GIT_COMMIT] ]] && {
                GIT_AUTHOR_NAME=${authors[$GIT_COMMIT]}     
                GIT_AUTHOR_EMAIL=${authors[$GIT_COMMIT]}
                GIT_AUTHOR_NAME=${GIT_AUTHOR_NAME%$'\t'*}
                GIT_AUTHOR_EMAIL=${GIT_AUTHOR_EMAIL#*$'\t'}
        }
    '

您试图修改修订版,但没有实际签出。那不能就这样做。我认为如果再次执行svn获取,并提供一个authors文件,您会得到更好的服务。。。。或者使用筛选器分支来修复作者修订。使用git筛选器分支,我无法筛选时间范围,但这是必要的。使用这段代码,我只是用我配置的用户设置替换所有authors项,但在我的情况下,这是错误的。我当前的过滤器是git log-after={2018-05-01}-author=,我需要用git commit-amend-author=-no editWell替换它。一旦我修复了替换中的输入错误,它将只替换commitds中列出的提交中的作者。@jthill这是我见过的最复杂的过滤器分支!它似乎可以做到这一点,但为了理解您的答案,您必须是bash和git方面的专家。@jpaugh我想我已经失去了所有透视图,我看到它将文件读入数组,然后用制表符将字段从字符串值项中拆分出来,这有什么复杂之处?编辑:spelling@jthill可能最大的挑战是推断CommitDS文件的格式。在能够做到这一点之前,我们必须推断出-setup和read的含义。哦,还有如何过滤和生成提交ID。如果我以后再考虑,我会回来添加一个git日志或rev parse,或者为此添加什么。
git filter-branch --setup '
        declare -A authors; while read id auth; do authors[$id]=$auth; done <commitids
    ' --env-filter '
        [[ -v authors[$GIT_COMMIT] ]] && {
                GIT_AUTHOR_NAME=${authors[$GIT_COMMIT]}     
                GIT_AUTHOR_EMAIL=${authors[$GIT_COMMIT]}
                GIT_AUTHOR_NAME=${GIT_AUTHOR_NAME%$'\t'*}
                GIT_AUTHOR_EMAIL=${GIT_AUTHOR_EMAIL#*$'\t'}
        }
    '