2013-02-01 114 views
0

当我的开发团队使用git进行提交时,有时他们会在新环境中执行此操作。发生这种情况时,他们的git配置没有正确设置,并且他们使用默认的“root @ localhost.localdomain“作者姓名。这在git日志方面非常烦人。我们可以通过流程消除这种情况,但有时人为错误是不可避免的。如何修复git log作者姓名?

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

+0

阅读[Git Hooks](http://git-scm.com/book/en/Customizing-Git-Git-Hooks)。你甚至可以找到那些已经做到了你想要的。 – vanza

+0

你也可以使用[git filter-branch](http://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html)更改提交的作者。 –

回答

0

像这样重写git历史的问题是,一旦你改变了一次提交,所有依赖它的提交也会改变。换句话说,如果你想保留所有的提交ID在你试图改变的后面,你不能改变你想改变的提交。

如果你是搞乱了提交的标识下面要更改的一个,你可以使用这样的配方改变的细节OK的承诺:

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 protected]" 
    export GIT_COMMITTER_NAME="Name" 
    export GIT_COMMITTER_EMAIL="[email protected]" 
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 protected]" 
    export GIT_COMMITTER_NAME="Name" 
    export GIT_COMMITTER_EMAIL="[email protected]" 
fi 
' -- 1234567890ABCD~..HEAD 

警告!同样,你不仅要改变那个提交,还要改变每一个提交。

  • 因为上面你会有现在的“邪恶双胞胎”“鬼”“老”的提交树仍然四处游走。您可以清理与:

    git的过滤分支-f --env过滤器“​​” - %的commitid%〜..HEAD

  • 你将不得不改写新提交远程分支,简单地推它不会工作 - 远程服务器会抱怨。无论是 “力”,或者你把之前改写分支了删除远程分支:

    混帐推remote_address_or_name:branch_name

例子:

git push origin :feature_a 
  • 你将不得不作出所有其他团队成员都在新树之上重新组合。而且他们可能不得不采取类似git fetch --all -p的行动来清理其重写的远程分支的本地历史记录,然后才能在其上进行重新绑定。

基于上述,你在一些服务器端pre-receive的钩子停止push包含违规承诺,并告知团队成员如何使用上述filter-branch魔法摆脱其犯罪的提交更好看消息。