How do you commit code as a different user?

GitCommand LineCommit

Git Problem Overview


I want to be able to do this for a script. I'm essentially re-creating the entire version history of some code in Git - it currently uses a different version control system. I need the script to be able to add in the commits to Git while preserving the commit's original author (and date).

Assuming I know the commit author and the date/time the change was made, is there a Git command that allows me to do this? I'm assuming there is, because git-p4 does something similar. I'm just asking for the best way to do it.

Git Solutions


Solution 1 - Git

Check out the --author option for git commit:

From the man page:

> --author=<author> > > Override the commit author. Specify an explicit author > using the standard A U Thor <[email protected]> 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.

Solution 2 - Git

Just to add to this: The --author option mentioned in the accepted answer will only override the author, not the committer information of the commit.

That is the correct behavior in most cases, but if for some reason you need to manually override the committer information as well, use the GIT_COMMITTER_NAME and GIT_COMMITTER_EMAIL environment variables (there is a GIT_COMMITTER_DATE as well). See Git-Internals-Environment-Variables

$ GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="[email protected]" git commit --author="New Name <[email protected]>"

This will make the commit look like it was authored and committed by the specified user.

Solution 3 - Git

Use -c option along with git-commit to override any previous configuration. It will not touch your global/project configuration. For example, to override name and email:

git -c user.name='My Name' -c user.email='[email protected]' commit -m "Custom message"

However, if you intend to keep it as an additional setting, I would suggest to use an alias. Edit your ~/.gitconfig file and append a new alias for each non-default user and email.

[user]
  name = My Name
  email = [email protected]

[alias]
  commit-x = -c user.name='My X Name' -c user.email='[email protected]' commit
  commit-y = -c user.name='My Y Name' -c user.email='[email protected]' commit
  commit-z = -c user.name='My Z Name' -c user.email='[email protected]' commit

Alias will be applied globally. Test it.

git commit -m "Custom message with committer and author My Name <[email protected]>"
git commit-x -m "Custom message with committer and author My X Name <[email protected]>"
git commit-y -m "Custom message with committer and author My Y Name <[email protected]>"
git commit-z -m "Custom message with committer and author My Z Name <[email protected]>"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCarlView Question on Stackoverflow
Solution 1 - GitTim HeniganView Answer on Stackoverflow
Solution 2 - GitfriederbluemleView Answer on Stackoverflow
Solution 3 - GitBeardOverflowView Answer on Stackoverflow