Diferença entre autor e committer no Git?

Eu estou tentando fazer um commit como

git commit --author="John Doe " -m "" 

onde John Doe é algum usuário em cujo nome eu quero fazer o commit.

Parece tudo bem no git log . No entanto, quando eu faço um gitk , o nome do autor está correto, mas o nome do committer é escolhido a partir das minhas configurações globais de configuração do git (e, portanto, está configurado para meu nome / email).

Questões

  1. Qual é a diferença entre os dois (committer vs author)?

  2. Devo estar configurando o committer também para o outro usuário?

  3. Se sim, como?

O cartaz original pergunta:

Qual é a diferença entre os dois (Committer vs author)?

O autor é a pessoa que originalmente escreveu o código. O committer, por outro lado, é assumido como sendo a pessoa que cometeu o código em nome do autor original. Isso é importante no Git porque o Git permite que você reescreva o histórico ou aplique patches em nome de outra pessoa. O LIVRE online Pro Git livro explica isso assim:

Você pode estar se perguntando qual é a diferença entre autor e committer . O autor é a pessoa que originalmente escreveu o patch, enquanto o committer é a pessoa que aplicou o patch pela última vez. Então, se você enviar um patch para um projeto e um dos membros principais aplicar o patch, ambos receberão crédito – você como autor e membro principal como committer.

O cartaz original pergunta:

Devo estar configurando o committer também para o outro usuário?

Não, se você quer ser honesto, você não deve estar definindo o committer para o autor, a menos que o autor e o committer sejam de fato a mesma pessoa.

Lista de discussão + git format-patch + git apply pode gerar autor! = Committer

Em projetos como o kernel do Linux, onde os patches são:

  • gerado pelo git format-patch
  • enviado por email, seja copiando, ou mais comumente com git send-email
  • aplicado por outra pessoa com git apply ou git am : Como usar o git am para aplicar correções de mensagens de e-mail?

gerando um único novo commit com diferentes autores e committers:

  • o autor é quem escreveu o patch
  • o committer é quem é um mantenedor do projeto e quem mesclou o patch

Veja por exemplo este patch selecionado aleatoriamente e o commit correspondente:

As interfaces web do Git, como o GitHub e o GitLab, podem ou não gerar autor! = Committer

Como o Git (Hub | Lab) mantém os repositorys upstream e fork em uma mesma máquina, eles podem fazer automaticamente qualquer coisa que você possa fazer localmente também, incluindo:

  • Crie um commit de mesclagem.

    Não gera autor! = Committer.

    Mantém o SHA ou o novo commit intacto e cria um novo commit:

     * Merge commit (committer == author == project maintainer) |\ | * Feature commit (committer == author == contributor) |/ * Old master (random committer and author) 

    Historicamente, este foi o primeiro método disponível no GitHub.

    Localmente, isso é feito com git merge --no-ff .

    Isso produz duas confirmações por solicitação pull e mantém uma bifurcação no histórico do git.

  • rebase no topo do master

    O GitHub também hackeia os commits para configurar committer == quem pressionou o botão de mesclagem. Isso não é obrigatório, e nem mesmo feito por padrão localmente pelo git rebase , mas dá responsabilidade ao mantenedor do projeto.

    A tree git agora se parece com:

     * Feature commit (committer == maintainer, author == contributor) | * Old master (random committer and author) 

    que é exatamente como o do git apply correções de email.

No GitHub atualmente:

  • você escolhe o método ao mesclar através da lista suspensa no botão de mesclagem
  • methods podem ser ativados ou desativados nas configurações de repo pelo proprietário

https://help.github.com/articles/about-merge-methods-on-github/

Como definir o committer de um novo commit?

O melhor que consegui encontrar foi usar as variables ​​de ambiente para replace o committer:

 GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a ' 

Como obter o committer e confirmar a data de um determinado commit?

Apenas os dados do autor são exibidos por padrão no git log .

Para ver a data do committer, você pode:

  • formatar o log especificamente para isso:

     git log --pretty='%cn %cd' -n1 HEAD 

    onde cn e cd representam Committer Name e Committer Date

  • use o formato pré-definido fuller :

     git log --format=fuller 

    Veja também: Como configurar o ‘git log’ para mostrar ‘data de commit’

  • baixe e mostre todos os dados de commit:

     git cat-file -p HEAD 

Como definir a data do committer de um novo commit?

git commit --date apenas define a data do autor: para a data do committer, o melhor que consegui encontrar foi com a variável de ambiente:

 GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000' 

Veja também: Qual é a diferença entre autor e committer no Git?

Como o Git armazena o autor vs committer internamente?

Veja: Qual é o formato de arquivo de um object commit git?

Basicamente, o commit é um arquivo de texto e contém dois campos separados por linha:

 author {author_name} < {author_email}> {author_date_seconds} {author_date_timezone} committer {committer_name} < {committer_email}> {committer_date_seconds} {committer_date_timezone} 

Isso deixa claro que ambas são inputs de dados completamente independentes no object de confirmação.