当我的开发团队使用 git 提交时,有时他们会在新环境中进行提交。发生这种情况时,他们的 git 配置没有正确设置,他们使用默认的“root@localhost. localdomain”作者姓名。就 git log 而言,这非常烦人。我们可以通过流程消除这种情况,但有时人为错误是不可避免的。
有没有办法更改那些不正确的作者姓名,或者有办法在提交之前强制执行正确的作者姓名?例如,我可以设置授权作者列表,任何不使用作者姓名的人都不能提交。
当我的开发团队使用 git 提交时,有时他们会在新环境中进行提交。发生这种情况时,他们的 git 配置没有正确设置,他们使用默认的“root@localhost. localdomain”作者姓名。就 git log 而言,这非常烦人。我们可以通过流程消除这种情况,但有时人为错误是不可避免的。
有没有办法更改那些不正确的作者姓名,或者有办法在提交之前强制执行正确的作者姓名?例如,我可以设置授权作者列表,任何不使用作者姓名的人都不能提交。
像这样重写 git 历史记录的问题在于,一旦您更改了一个提交,所有依赖于它的提交也会更改。换句话说,如果您想在尝试更改的提交 ID 之后保留所有提交 ID,则无法更改要更改的提交。
如果您可以在更改的提交之后弄乱提交的 ID,则可以使用这样的方法来更改提交的详细信息:
git filter-branch -f --env-filter '
if [ $GIT_COMMIT = %COMMITID% ]
then
export GIT_AUTHOR_DATE="YYYY-MM-DD hh:mm:ss z"
export GIT_COMMITTER_DATE="YYYY-MM-DD hh:mm:ss z"
export GIT_AUTHOR_NAME="Name"
export GIT_AUTHOR_EMAIL="email@address"
export GIT_COMMITTER_NAME="Name"
export GIT_COMMITTER_EMAIL="email@address"
fi
' -- %COMMITID%~..HEAD
其中 `%COMMITID% 替换为您要更改的提交的 ID。例子:
git filter-branch -f --env-filter '
if [ $GIT_COMMIT = 1234567890ABCD ]
then
export GIT_AUTHOR_DATE="2000-01-01 00:00:00 -0500"
export GIT_COMMITTER_DATE="2000-01-01 00:00:00 -0500"
export GIT_AUTHOR_NAME="Name"
export GIT_AUTHOR_EMAIL="email@address"
export GIT_COMMITTER_NAME="Name"
export GIT_COMMITTER_EMAIL="email@address"
fi
' -- 1234567890ABCD~..HEAD
警告!同样,您不仅要更改该提交,还要更改其上的每一个提交。
由于上述原因,现在“邪恶双胞胎”“幽灵”“旧”提交树仍然存在。您可以使用以下方法进行清理:
git filter-branch -f --env-filter "" -- %COMMITID%~..HEAD
您将不得不用新的提交覆盖远程分支,因为简单地推送它是行不通的——远程服务器会抱怨。在将重写的分支向上推送之前“强制”它,或者删除远程分支:
git push remote_address_or_name :branch_name
例子:
git push origin :feature_a
git fetch --all -p
清理重写远程分支的本地历史,然后才能在它之上重新建立基础。基于上述内容,您最好查看一些停止包含违规提交的服务器端 pre-receive
钩子,push
并告知团队成员如何使用上述filter-branch
魔法来消除他们提交的违规消息。