0

当我的开发团队使用 git 提交时,有时他们会在新环境中进行提交。发生这种情况时,他们的 git 配置没有正确设置,他们使用默认的“root@localhost. localdomain”作者姓名。就 git log 而言,这非常烦人。我们可以通过流程消除这种情况,但有时人为错误是不可避免的。

有没有办法更改那些不正确的作者姓名,或者有办法在提交之前强制执行正确的作者姓名?例如,我可以设置授权作者列表,任何不使用作者姓名的人都不能提交。

4

1 回答 1

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魔法来消除他们提交的违规消息。

于 2013-02-01T05:04:27.333 回答