电子邮件前缺少空间
我有一个git仓库,使用git-remote-bzr从bzr仓库克隆,如下所示: git clone bzr::/repo new-repo
。 经过几百次提交后,我执行了git fsck
并且所有bzr提交都出现了以下错误:
提交41bf5错误:无效的作者/提交者行 - 在电子邮件之前缺少空间
当我用git cat-file -p 41bf5
检查这些修订版时,我确实可以看到作者姓名和电子邮件没有用空格分隔。
我如何为所有不良提交添加这个缺失的空间?
我可以完全访问服务器上的回购,因此我可以毫无问题地重写历史记录。 修改后,代码的用户将不得不重新登录存储库。 我已经尝试过以下帖子中提出的解决方案,但没有成功:
我的问题的解决方案来自一位朋友,他请我代表他写答案:
筛选回购,使用以下内容更改假冒作者。 请注意,这应该在两个单独的行上(通常使用Shift + Enter):
$ git filter-branch --commit-filter 'case "$GIT_AUTHOR_NAME" in
> *author< email*) GIT_AUTHOR_NAME=author_name; GIT_AUTHOR_EMAIL=author_email;; esac; git commit-tree "$@" '
由于错误提交仍在存储库中, git fsck
仍然会失败。 为了摆脱这些提交,克隆回购,然后修剪未使用的对象:
$ git clone badrepo goodrepo && cd goodrepo
$ git gc --prune=all
新的存储库很干净。 git fsck
不会返回错误。
你可以在git-scm.com找到一个完美的例子。 正如torek已经提到的那样,它使用git filter-branch
来重写受到问题影响的所有历史记录。
你将不得不改变一下:
$ git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_NAME" = "name_and_email" ];
then
GIT_AUTHOR_NAME="name";
GIT_AUTHOR_EMAIL="email";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
不确定的天气,$ GIT_AUTHOR_NAME将处理无效的提交,但是如果它执行上述命令应该为一个作者做伎俩。
如果你所有的提交都有问题,你可以跳过if
,使用正则表达式或类似的东西来自动找到名称和电子邮件之间的边界。 这样你可以为所有作者完全自动完成。