3

我有一个使用git-remote-bzrbzr存储库克隆的git存储库,如下所示:经过数百次提交后,我执行了所有bzr提交,但出现以下错误:git clone bzr::/repo new-repogit fsck

提交 41bf5 中的错误:无效的作者/提交者行 - 电子邮件前缺少空格

当我检查这些修订时,git cat-file -p 41bf5我确实可以看到作者姓名和电子邮件没有用空格分隔。

如何为所有错误提交添加这个缺失的空间?

我可以完全访问服务器上的存储库,因此我可以毫无问题地重写历史记录。修改后,代码的用户将不得不重新克隆存储库。我已经尝试过以下帖子中提出的解决方案但没有成功:

4

2 回答 2

3

我的问题的解决方案来自一位朋友,他让我代表他写下答案:

  1. 过滤 repo,使用以下内容更改虚假作者。请注意,这应该在两个单独的行上(通常使用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 "$@" '
    
  2. 由于错误的提交仍在存储库中,git fsck因此仍然会失败。要摆脱这些提交,请克隆 repo,然后修剪未使用的对象:

    $ git clone badrepo goodrepo && cd goodrepo
    $ git gc --prune=all
    
  3. 新的存储库是干净的。git fsck不返回错误。

于 2014-03-16T22:22:16.130 回答
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件事并使用正则表达式或类似的东西来自动找到名称和电子邮件之间的边界。这样,您就可以为所有作者完全自动完成。

于 2014-02-23T21:26:51.277 回答