无效的作者/提交者行 - 电子邮件前缺少空格
Posted
技术标签:
【中文标题】无效的作者/提交者行 - 电子邮件前缺少空格【英文标题】:invalid author/committer line - missing space before email 【发布时间】:2014-03-25 04:21:47 【问题描述】:我有一个 git 存储库,它是使用 git-remote-bzr 从 bzr 存储库克隆的,如下所示:git clone bzr::/repo new-repo
。
经过数百次提交后,我执行了git fsck
,所有 bzr 提交都出现以下错误:
提交 41bf5 中的错误:
当我使用git cat-file -p 41bf5
检查这些修订时,我确实可以看到作者姓名和电子邮件没有用空格分隔。
如何为所有错误提交添加这个缺失的空间?
我可以完全访问服务器上的存储库,因此我可以毫无问题地重写历史记录。修改后,代码的用户将不得不重新克隆存储库。 我已经尝试过以下帖子中提出的解决方案但没有成功:
How do I change the author of a commit in git? Change commit author at one specific commit【问题讨论】:
我不知道这是否可行,但运行git filter-branch
并将 --commit-filter
设置为每次运行 git commit-tree "$@"
似乎可能会成功。 (如果没有,也许--env-filter
会这样做。)
【参考方案1】:
您可以在 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
并使用正则表达式或类似的东西来自动查找名称和电子邮件之间的边界。这样您就可以为所有作者完全自动完成。
【讨论】:
我已经尝试过该代码。它没有捕捉到“name我的问题的解决方案来自一位朋友,他让我代表他写下答案:
过滤 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 "$@" '
由于错误的提交仍在存储库中,git fsck
仍然会失败。要摆脱这些提交,请克隆 repo,然后修剪未使用的对象:
$ git clone badrepo goodrepo && cd goodrepo
$ git gc --prune=all
新的存储库是干净的。 git fsck
不返回任何错误。
【讨论】:
以上是关于无效的作者/提交者行 - 电子邮件前缺少空格的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 7.2 无效的 Swift 支持 - 缺少 SwiftSupport 文件夹
错误 ITMS-90283:配置文件无效。捆绑包中包含的配置文件无效 [缺少代码签名证书]
如何在 Git 中更改多个提交的作者和提交者姓名和电子邮件?