Pergunta

Esta pergunta já tem uma resposta aqui:

Quero mudar algo no primeiro compromisso do meu projeto, sem perder todas as confirmações subsequentes. Há alguma maneira de fazer isso?

Listei acidentalmente meu e -mail bruto em um comentário dentro do código -fonte e gostaria de alterá -lo enquanto estou sendo enviado por spam do github indexando os bots.

Foi útil?

Solução

Como mencionado por Ecdpalma abaixo de, Git 1.7.12+ (Agosto de 2012) aprimorou a opção --root por git rebase:

"git rebase [-i] --root $tip"Agora pode ser usado para reescrever toda a história que leva a"$tip"Até o commit raiz.

Esse novo comportamento foi inicialmente discutido aqui:

Eu pessoalmente penso "git rebase -i --root"Deve ser feito apenas trabalhar sem exigir"--onto"E deixar você" editar "até o primeiro da história.
É compreensível que ninguém se incomodasse, pois as pessoas são muito menos reescrevendo perto do início da história do que o contrário.

o Patch seguido.


(Resposta original, fevereiro de 2010)

Como mencionado no Git FAQ (e isto Então pergunta), a ideia é:

  1. Crie uma nova filial temporária
  2. Rebobrie -o para o compromisso que você deseja mudar usando git reset --hard
  3. Altere esse compromisso (seria o topo da cabeça atual e você pode modificar o conteúdo de qualquer arquivo)
  4. Rebase Branch em cima do comprometimento alterado, usando:

    git rebase --onto <tmp branch> <commit after changed> <branch>`
    

O truque é ter certeza de que as informações que você deseja remover não são reintroduzidas por um comprometimento posterior em outro lugar do seu arquivo. Se você suspeitar disso, então você terá que usar filter-branch --tree-filter Para garantir que o conteúdo desse arquivo não contenha em nenhum comprometimento das informações sensatas.

Nos dois casos, você acaba reescrevendo o SHA1 de todo compromisso; portanto, tenha cuidado se você já publicar a filial da qual está modificando o conteúdo. Você provavelmente não deve fazê -lo, a menos que seu projeto ainda não seja público e outras pessoas não tenham baseado as confirmações que você está prestes a reescrever.

Outras dicas

Como afirmado em 1.7.12 Notas de liberação, você pode usar

$ git rebase -i --root

git rebase -i permite que você edite convenientemente quaisquer compromissos anteriores, Exceto pelo commit raiz. Os seguintes comandos mostram como fazer isso manualmente.

# tag the old root, "git rev-list ..." will return the hash of first commit
git tag root `git rev-list HEAD | tail -1`

# switch to a new branch pointing at the first commit
git checkout -b new-root root

# make any edits and then commit them with:
git commit --amend

# check out the previous branch (i.e. master)
git checkout @{-1}

# replace old root with amended version
git rebase --onto new-root root

# you might encounter merge conflicts, fix any conflicts and continue with:
# git rebase --continue

# delete the branch "new-root"
git branch -d new-root

# delete the tag "root"
git tag -d root

Se você deseja modificar apenas o primeiro compromisso, pode tentar o Git Rebase e alterar o commit, que é semelhante a este post:Como modificar uma confirmação especificada no Git?

E se você deseja modificar todos os compromissos que contêm o email bruto, o FilterRranch é a melhor opção. Há um exemplo de como alterar o endereço de e -mail globalmente no livro Pro git, e você pode achar este link útil http://git-scm.com/book/en/git-tools-rewriting-history

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top