我有一个 git 存储库,它使用 git-remote-bzr 从 bzr 存储库克隆,如下所示:git clone bzr::/repo new-repo
。
在几百次提交之后,我执行了git fsck
并且我的所有 bzr 提交都出现以下错误:
提交41bf5中的错误:无效的作者/提交者行 - 在电子邮件之前缺少空格
当我使用git cat-file -p 41bf5
检查这些修订时,我确实可以看到作者姓名和电子邮件没有用空格分隔。
如何为所有错误提交添加此缺少的空间?
我可以完全访问服务器上的repo,因此我可以毫无问题地重写历史记录。修改后,代码的用户将不得不重新放入存储库。 我已经尝试过以下帖子中提出的解决方案,但没有成功:
答案 0 :(得分:3)
我的问题的解决方案来自一位朋友,他让我代表他写下答案:
过滤回购,使用以下内容更改虚假作者。请注意,这应该在两个单独的行上(通常使用 shift + 输入):
$ 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
仍然会失败。要删除这些提交,请克隆repo,然后修剪未使用的对象:
$ git clone badrepo goodrepo && cd goodrepo
$ git gc --prune=all
新的存储库很干净。 git fsck
不会返回任何错误。
答案 1 :(得分:0)
你可以在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
事件并使用正则表达式或类似内容自动查找名称和电子邮件之间的边界。这样你就可以为所有作者完全自动完成。