我正在学校的计算机上写一个简单的脚本,并将更改提交给Git(在我的pendrive中的repo中,从我家里的计算机克隆)。经过几次提交,我意识到我是以root用户身份提交的东西。
有没有办法将这些提交的作者改成我的名字?
我正在学校的计算机上写一个简单的脚本,并将更改提交给Git(在我的pendrive中的repo中,从我家里的计算机克隆)。经过几次提交,我意识到我是以root用户身份提交的东西。
有没有办法将这些提交的作者改成我的名字?
更改作者(或提交者)将需要重写所有历史记录。如果您对此感到满意并认为值得,那么您应该退房 git filter-branch。手册页包含几个示例以帮助您入门。另请注意,您可以使用环境变量来更改作者,提交者,日期等的名称 - 请参阅“环境变量”部分。 git手册页。
具体来说,您可以修复所有错误的作者姓名和电子邮件 适用于所有分支和标签 使用此命令(来源: GitHub帮助):
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
你可以做到
git rebase -i -p <some HEAD before all of your bad commits>
然后将所有错误提交标记为rebase文件中的“edit”。如果您还想更改第一次提交,则必须手动将其添加为rebase文件中的第一行(遵循其他行的格式)。然后,当git要求你修改每个提交时,做
git commit --amend --author "New Author Name <email@address.com>"
编辑或只关闭打开的编辑器,然后执行
git rebase --continue
继续坚持。
您可以通过附加跳过这里完全打开编辑器 --no-edit
这样命令将是:
git commit --amend --author "New Author Name <email@address.com>" --no-edit && \
git rebase --continue
正如一些评论者所指出的,如果您只想更改最近的提交,则不需要rebase命令。做就是了
git commit --amend --author "New Author Name <email@address.com>"
这会将作者更改为指定的名称,但提交者将设置为您配置的用户 git config user.name
和 git config user.email
。如果要将提交者设置为您指定的内容,则会设置作者和提交者:
git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author
我最初的反应存在轻微缺陷。如果当前之间有任何合并提交 HEAD
和你的 <some HEAD before all your bad commits>
, 然后 git rebase
将它们弄平(顺便说一句,如果你使用GitHub拉取请求,你的历史将会有大量的合并提交)。这通常会导致非常不同的历史(因为重复的更改可能会“重新出现”),而在最坏的情况下,它可能导致 git rebase
要求您解决困难的合并冲突(可能已在合并提交中解决)。解决方案是使用 -p
国旗 git rebase
,这将保留您的历史的合并结构。的联机帮助页 git rebase
警告说使用 -p
和 -i
可以导致问题,但在 BUGS
它说“编辑提交和重写他们的提交消息应该可以正常工作”。
我已经添加 -p
到上面的命令。对于刚刚更改最新提交的情况,这不是问题。
你也可以这样做:
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
注意,如果在Windows命令提示符下使用此命令,则需要使用 "
代替 '
:
git filter-branch --commit-filter "
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi" HEAD
一个班轮,但如果你有一个多用户存储库,要小心 - 这将改变 所有 承诺拥有相同的(新的)作者和提交者。
git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD
使用字符串中的换行符(可以在bash中使用):
git filter-branch -f --env-filter "
GIT_AUTHOR_NAME='Newname'
GIT_AUTHOR_EMAIL='new@email'
GIT_COMMITTER_NAME='Newname'
GIT_COMMITTER_EMAIL='new@email'
" HEAD
当您没有初始化$ HOME / .gitconfig时会发生这种情况。你可以解决这个问题:
git config --global user.name "you name"
git config --global user.email you@domain.com
git commit --amend --reset-author
用git版本1.7.5.4测试
对于单个提交:
git commit --amend --author="Author Name <email@address.com>"
(从asmeurer的答案中提取)
如果只有前几个提交有不好的作者,你可以在里面完成这一切 git rebase -i
使用 exec
命令和 --amend
提交,如下:
git rebase -i HEAD~6 # as required
它为您提供了可编辑的提交列表:
pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2
然后加 exec ... --author="..."
所有与坏作者的行后的行:
pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <email@address.com>" -C HEAD
保存并退出编辑器(运行)。
这个解决方案可能比其他解决方案更长,但它是高度可控的 - 我确切知道它所提交的提交内容。
感谢@asmeurer的灵感。
Github有一个 好的解决方案,这是以下shell脚本:
#!/bin/sh
git filter-branch --env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [ "$GIT_COMMITTER_EMAIL" = "your@email.to.match" ]
then
cn="Your New Committer Name"
cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "your@email.to.match" ]
then
an="Your New Author Name"
am="Your New Author Email"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
正如docgnome所提到的,重写历史是危险的,并将打破其他人的存储库。
但是如果你真的想这样做并且你处于一个bash环境中(在Linux上没有问题,在Windows上,你可以使用git bash,它随git的安装一起提供),使用 git filter-branch:
git filter-branch --env-filter '
if [ $GIT_AUTHOR_EMAIL = bad@email ];
then GIT_AUTHOR_EMAIL=correct@email;
fi;
export GIT_AUTHOR_EMAIL'
为了加快速度,您可以指定要重写的一系列修订:
git filter-branch --env-filter '
if [ $GIT_AUTHOR_EMAIL = bad@email ];
then GIT_AUTHOR_EMAIL=correct@email;
fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD
当接管来自另一位作者的未合并提交时,有一种简单的方法来处理这个问题。
git commit --amend --reset-author