Como edito o histórico do git para corrigir um endereço de e-mail / nome incorreto [closed]

72

Quando comecei a usar o git, acabei de usar git init e comecei a chamar add e commit . Agora estou começando a prestar atenção e posso ver que meus commits estão aparecendo como cowens@localmachine , em vez do endereço que desejo. Parece que definir GIT_AUTHOR_EMAIL e GIT_COMMITTER_EMAIL fará o que eu quero, mas ainda tenho os commits antigos com o endereço / email incorreto. Como posso corrigir os commits antigos?

    
por Chas. Owens 26.05.2009 / 22:56

4 respostas

80

Você pode voltar e consertar todos os seus commits com uma única chamada para git filter-branch. Isso tem o mesmo efeito que o rebase, mas você só precisa fazer um comando para corrigir todo o seu histórico, em vez de consertar cada commit individualmente.

Você pode corrigir todos os e-mails errados com este comando:

git filter-branch --env-filter '
    oldname="(old name)"
    oldemail="(old email)"
    newname="(new name)"
    newemail="(new email)"
    [ "$GIT_AUTHOR_EMAIL"="$oldemail" ] && GIT_AUTHOR_EMAIL="$newemail"
    [ "$GIT_COMMITTER_EMAIL"="$oldemail" ] && GIT_COMMITTER_EMAIL="$newemail"
    [ "$GIT_AUTHOR_NAME"="$oldname" ] && GIT_AUTHOR_NAME="$newname"
    [ "$GIT_COMMITTER_NAME"="$oldname" ] && GIT_COMMITTER_NAME="$newname"
    ' HEAD

Mais informações estão disponíveis nos git docs

    
por 27.05.2009 / 19:51
27

O comando branch-filter do Git é poderoso, mas é terrivelmente difícil de usar para qualquer coisa não-trivial, como por exemplo, se você tiver mais de um autor para corrigir.

Aqui está uma alternativa que eu achei útil, que usa o recurso .mailmap descrito na página man do git-shortlog. Isso fornece um mecanismo de mapeamento de autor que podemos usar com o recurso de formatação do git log. Podemos usá-lo para gerar os comandos para escolher e emendar uma sequência nomeada de commits.

Por exemplo, suponha que você queira corrigir a autoria em uma filial $ BRANCH, iniciando em um commit $ START.

Você precisa criar um arquivo .mailmap no diretório superior do seu repositório, que mapeia os nomes dos autores existentes para os corretos. Você pode obter uma lista dos nomes de autores existentes com:

git shortlog -se

Você precisa acabar com um arquivo .mailmap como este (digamos):

You <[email protected]>   cowens@localmachine
You <[email protected]>   root@localmachine

Agora você pode usar o recurso de formatação do git log para gerar os comandos para reescrever $ BRANCH como $ BRANCH2.

git checkout -b $BRANCH2 $START
git log --reverse --pretty=format:"cherry-pick %H; commit --amend --author='%aN <%aE>' -C %H" $START..$BRANCH | sh - 

O primeiro comando cria uma nova ramificação vazia a partir do commit $ START. Para cada confirmação entre $ START e, em seguida, fim de $ BRANCH, o segundo comando cherry seleciona o commit original para o final da ramificação atual $ BRANCH2 e o altera para definir o autor corretamente.

Isto também é geralmente aplicável - coloque isso no seu ~ / .gitconfig:

[alias]
    # git reauthor $START..$END
    reauthor = !sh -c 'eval 'git log --reverse --topo-order --pretty=format:\"git cherry-pick %H &&  git commit --amend -C %H --author=\\"%aN <%aE>\\" && \" $0 ' "echo success" '

Então quando você precisa corrigir os autores, agora você precisa gerar um arquivo .map e fazer:

git checkout -b $BRANCH2 $START
git reauthor $START..$BRANCH

A ref. da ramificação original pode ser reatribuída à nova e a nova excluída:

git checkout $BRANCH
git reset --hard $BRANCH2 # be careful with this command
git branch -d $BRANCH2
    
por 29.07.2010 / 12:54
8

Combinando a resposta de Como corrijo a metainformação no primeiro commit do git?

### Fix the first commit ###    
# create a temporary tag for the root-most commit so we can reference it
git tag root 'git rev-list HEAD | tail -1'
# check it out on its own temporary branch
git checkout -b new-root root
# amend the commit
git commit --amend --author "Foo [email protected]"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# now you've changed the commit message, so checkout the original branch again
git checkout @{-1}
# and rebase it onto your new root commit
git rebase --onto new-root root
### Fix the rest of the commits ###
git rebase -i root
# edit the file to read "edit <commit number> for each entry
# amend the commit
git commit --amend --author "Foo [email protected]"
# (or if you've set the proper git **config** values)
git commit --amend -C HEAD --reset-author
# move to the next commit
git rebase --continue    
# continue running the last two commands until you see
# Successfully rebased and updated refs/heads/master.
### Clean up ###
# nuke the temporary branch we created
git branch -d new-root
# nuke the temporary tag we created
git tag -d root
    
por 27.05.2009 / 18:45
4

Para seguir a resposta de jedberg: Você pode usar rebase -i e escolher editar os commits em questão. Se você usa git commit --amend --author <AUTHOR DETAILS> e, em seguida, git rebase continue , pode percorrer e corrigir o histórico.

    
por 27.05.2009 / 00:02