当我的开发团队使用git提交时,他们会从他们新用的环境中执行此操作。当发生这种情况时,他们的git配置尚未正确设置并且他们使用默认的“root”提交到代码库@ localhost.localdomain“作者姓名。就git日志而言,这非常烦人。我们可以通过流程消除这种情况,但有时人为错误是不可避免的。
有没有办法在提交之前更改那些不正确的作者姓名或者有办法强制执行正确的作者姓名?例如,我可以设置授权作者列表,不使用作者姓名的任何人都不能提交。
答案 0 :(得分:0)
重写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
魔法,以摆脱他们犯下违规信息的行为。