GIT commit as different user without email / or only email
GitCommitGit Problem Overview
I'm trying to commit some changes as a different user, but i do not have a valid email address, following command is not working for me:
git commit --author="john doe" -m "some fix"
fatal: No existing author found with 'john doe'
I have the same problem when trying to commit with only an email address
git commit --author="john@doe.com" -m "some fix"
fatal: No existing author found with '[email protected]'
On the GIT man pages for the commit command it says i can use the
standard A U Thor <author@example.com> format
For the --author option.
Where is this format defined ? what does A and U stand for ? how do i commit for a different user with only a username or only an email?
Git Solutions
Solution 1 - Git
The minimal required author format, as hinted to in this SO answer, is
Name <email>
In your case, this means you want to write
git commit --author="Name <email>" -m "whatever"
Per Willem D'Haeseleer's comment, if you don't have an email address, you can use <>
:
git commit --author="Name <>" -m "whatever"
As written on the git commit
man page that you linked to, if you supply anything less than that, it's used as a search token to search through previous commits, looking for other commits by that author.
Solution 2 - Git
The specific format is:
git commit --author="John Doe <[email protected]>" -m "Impersonation is evil."
Solution 3 - Git
The
> standard A U Thor <[email protected]> format
Seems to be defined as followed: ( as far as i know, with absolutely no warranty )
A U Thor = required username
- The separation of the characters probably indicates that spaces are allowed, it could also be resembling initials.
- The username has to be followed by 1 space, extra spaces will be truncated
<[email protected]> = optional email address
- Must always be between < > signs.
- The email address format isn't validated, you can pretty much enter whatever you want
- Optional, you can omit this explicitly by using <>
If you don't use this exact syntax, git will search through the existing commits and use the first commit that contains your provided string.
Examples:
-
Only user name
Omit the email address explicitly:
git commit --author="John Doe <>" -m "Impersonation is evil."
-
Only email
Technically this isn't possible. You can however enter the email address as the username and explicitly omit the email address. This doesn't seem like it's very useful. I think it would make even more sense to extract the user name from the email address and then use that as the username. But if you have to:
git commit --author="[email protected] <>" -m "Impersonation is evil."
I ran in to this when trying to convert a repository from mercurial to git. I tested the commands on msysgit 1.7.10.
Solution 4 - Git
The --author
option doesn't do the right thing for the purpose of not leaking information between your git personalities: It doesn't bypass reading the invoking user's configuration:
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
This does:
git -c user.name='A U Thor' -c [email protected] commit
For the purpose of separating work- and private git personalities, Git 2.13 supports directory specific configuration: You no longer need to wrap git and hack this yourself to get that.
Solution 5 - Git
Just supplement:
> git commit --author="[email protected]
In some cases the commit still fails and shows you the following message:
> *** Please tell me who you are.
> Run
> git config --global user.email "[email protected]" > git config --global user.name "Your Name"
> to set your account's default identity. > Omit --global to set the identity only in this repository.
> fatal: unable to auto-detect email address (got xxxx)
So just run "git config", then "git commit"
Solution 6 - Git
Format
A U Thor <author@example.com>
simply mean that you should specify
FirstName MiddleName LastName <email@example.com>
Looks like middle and last names are optional (maybe the part before email doesn't have a strict format at all). Try, for example, this:
git commit --author="John <[email protected]>" -m "some fix"
As the docs say:
--author=<author>
Override the commit author. Specify an explicit author using the standard
A U Thor <author@example.com> format. Otherwise <author> is assumed to
be a pattern and is used to search for an existing commit by that author
(i.e. rev-list --all -i --author=<author>); the commit author is then copied
from the first such commit found.
if you don't use this format, git treats provided string as a pattern and tries to find matching name among the authors of other commits.
Solution 7 - Git
Open Git Bash.
Set a Git username:
$ git config --global user.name "name family" Confirm that you have set the Git username correctly:
$ git config --global user.name > name family
Set a Git email:
$ git config --global user.email [email protected] Confirm that you have set the Git email correctly:
$ git config --global user.email > [email protected]
Solution 8 - Git
An alternative if the concern is to hide the real email address...If you are committing to Github you don't need a real email you can use <username>@users.noreply.github.com
Regardless of using Github or not, you probably first want change your committer details (on windows use SET GIT_...
)
GIT_COMMITTER_NAME='username'
GIT_COMMITTER_EMAIL='[email protected]'
Then set the author
git commit --author="username <[email protected]>"
https://help.github.com/articles/keeping-your-email-address-private
Solution 9 - Git
It is all dependent on how you commit.
For example:
git commit -am "Some message"
will use your ~\.gitconfig
username. In other words, if you open that file you should see a line that looks like this:
[user]
email = [email protected]
That would be the email you want to change. If your doing a pull request through Bitbucket or Github etc. you would be whoever you're logged in as.
Solution 10 - Git
git -c "user.name={{ name }}" -c "user.email={{ email }}" commit -m "{{ message }}"
where {{ }} indicates YOU put the value