invalid author/committer line - missing space before email

后端 未结 2 716
灰色年华
灰色年华 2021-01-20 16:47

I have a git repository that was cloned from a bzr repository using git-remote-bzr as follows: git clone bzr::/repo new-repo. After

相关标签:
2条回答
  • 2021-01-20 17:21

    You can find a perfectly working example on git-scm.com. As already mentioned by torek, it uses git filter-branch to rewrite all the history affected by your problem.

    You will have to change it a bit:

    $ 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
    

    Not sure whether the $GIT_AUTHOR_NAME will work on the invalid commits, but if it does the above command should do the trick for one author.


    If all your commits have the problem, you can skip the if thing and use a regex or something like that to automatically find the border between name and email. That way you can do it completely automatically for all authors.

    0 讨论(0)
  • 2021-01-20 17:25

    The solution to my question came from a friend that asked me to write the answer on his behalf:

    1. Filter the repo, changing the bogus author with the following. Note that this should be on two separate lines (normally using 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. Since the faulty commits are still in the repository, git fsck will still fail on them. To get rid of those commits, clone the repo and then prune unused objects:

      $ git clone badrepo goodrepo && cd goodrepo
      $ git gc --prune=all
      
    3. The new repository is clean. git fsck returns no errors.

    0 讨论(0)
提交回复
热议问题