使用git filter-repo拆分字符串时出现“unexpected character after line continuation character”

ny6fqffe  于 2023-04-04  发布在  Git
关注(0)|答案(2)|浏览(261)

我正在使用git filter-repo重写git仓库中提交作者的电子邮件。
commit.author_email字段的格式如下:
AA01\myuserid
是的,我知道这并不像一个电子邮件地址,但它是它是什么.我需要实现的是设置提交作者的电子邮件到commit.author_email字段的第二部分(例如myuserid
这是我执行的命令

git filter-repo --force --refs master --commit-callback '
>>   commit.author_email_split = commit.author_email.split("\\")
>> '

现在,我只想让拆分工作,但它失败了,错误如下:

Traceback (most recent call last):
  File "C:\git-filter-repo\git-filter-repo", line 4005, in <module>
    main()
  File "C:\git-filter-repo\git-filter-repo", line 4001, in main
    filter = RepoFilter(args)
  File "C:\git-filter-repo\git-filter-repo", line 2760, in __init__
    self._handle_arg_callbacks()
  File "C:\git-filter-repo\git-filter-repo", line 2865, in _handle_arg_callbacks
    handle('commit')
  File "C:\git-filter-repo\git-filter-repo", line 2858, in handle
    setattr(self, callback_field, make_callback(type, code_string))
  File "C:\git-filter-repo\git-filter-repo", line 2841, in make_callback
    '  '+'\n  '.join(str.splitlines()), globals())
  File "<string>", line 3
    commit.author_email_split = commit.author_email.split(\)
                                                           ^
SyntaxError: unexpected character after line continuation character

我试着重新检查命令语法,隐藏字符的存在等等,但是没有任何效果。这里有什么问题吗?

e0bqpujr

e0bqpujr1#

我的问题是我使用的是Powershell,这导致了行延续字符的问题(感谢Joachim Sauer的提示,非常有用!)。
在解决这个问题后,Python抱怨错误%b requires a bytes-like object, or an object that implements __bytes__, not 'str',所以我也添加了encode()decode()。你可以在git bash中找到最终的解决方案(我认为在任何类似bash的提示符中)。

git filter-repo --force --refs master --commit-callback '
  commit.committer_email = commit.committer_email.decode().split("\\")[1].encode()
  commit.author_email = commit.author_email.decode().split("\\")[1].encode()
  if commit.author_name:
    commit.author_name = commit.author_email
  if commit.committer_name:
    commit.committer_name = commit.committer_email
'
i2byvkas

i2byvkas2#

以下是解决问题的方法,如果您的目标是:
在git仓库中重写提交作者的电子邮件。
1.首先获取list of all emails in your repo
1.创建一个.mailmap file,列出所有的新邮件,然后列出它们的旧邮件(这在大多数编辑器中应该很容易快速完成,即使你有很多邮件要更新)。你可以用git log测试你的.mailmap文件。
1.现在您可以使用--mailmap option to git filter-repo使更改永久化。

相关问题