Como você confirma o código como um usuário diferente?


112

Eu quero ser capaz de fazer isso para um script. Estou essencialmente recriando todo o histórico de versões de alguns códigos no Git - atualmente, ele usa um sistema de controle de versões diferente. Eu preciso que o script seja capaz de adicionar commits no Git enquanto preserva o autor original do commit (e data).

Supondo que eu conheça o autor do commit e a data / hora em que a alteração foi feita, existe um comando do Git que me permite fazer isso? Presumo que sim, porque git-p4 faz algo semelhante. Só estou pedindo a melhor maneira de fazer isso.


1
Você já tentou usar a importação rápida?
— alternativa

Eu concordo, a importação rápida é provavelmente o melhor caminho a percorrer. Você poderia usar o git commit (ou mais apropriadamente o encanamento subjacente: hash-object , update-index , write-tree , commit-tree , update-ref , etc.), mas a importação rápida seria, bem, mais rápida.
— Chris Johnsen

Eu pensei em importação rápida, mas como sou um iniciante em git, decidi usar os comandos básicos. Para ser totalmente honesto, não entendo totalmente como a importação rápida funciona e, portanto, estou um pouco hesitante em usá-la até entender melhor. Sim, será muito mais lento usando o commit, mas pelo menos saberei o que esperar - especialmente durante a depuração.
— Carl,

1
git commit --author = "Name <name@example.com>" -a -m "commit msg"
— Masih

Respostas:


148

Confira a --authoropção de git commit:

Na página de manual :

--author=<author>

Substitua o autor do commit. Especifique um autor explícito usando o A U Thor <author@example.com>formato padrão . Caso contrário, <author>é considerado um padrão e é usado para pesquisar por um commit existente daquele autor (ou seja rev-list --all -i --author=<author>); o autor do commit é então copiado do primeiro commit encontrado.


18
Além disso, a --dateopção de substituir a data.
— Chris Johnsen,

Você pode dar um exemplo específico, tudo o que eu tento
— studgeek de

@Tim Henigan: Parece que a documentação agora está hospedada no Github, então o link da página do manual que você postou está morto. Você pode confirmar que a nova página é a mesma (caso haja outras respostas que precisem de links atualizados)?
— R0MANARMY

@ R0MANARMY: Eu atualizei o URL. As páginas do GitHub estão corretas. Eu atualizei meu link porque as páginas do manual não estão mais hospedadas no kernel.org. Obrigado por me informar sobre a mudança.
— Tim Henigan

1
Aqui está o que acabei usando:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
— Carl

113

Só para adicionar a isso: A --authoropção mencionada na resposta aceita apenas substituirá o autor , não as informações do committer do commit.

Esse é o comportamento correto na maioria dos casos, mas se por algum motivo você precisar substituir manualmente as informações do committer também, use as variáveis ​​de ambiente GIT_COMMITTER_NAMEe GIT_COMMITTER_EMAIL(também existe uma GIT_COMMITTER_DATE). Consulte Git-Internals-Environment-Variables

$ GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="name@email.com" git commit --author="New Name <name@email.com>"

Isso fará com que o commit pareça ter sido criado e confirmado pelo usuário especificado.


16
... e para ver a diferença:git log --pretty=fuller
— bluenote10

2
Perfeito. Isso é o que eu queria e nunca poderia encontrar a página do manual do git internals.
— ksp

3

Edite seu arquivo ~ / .gitconfig e acrescente um novo alias onde você pode personalizar um usuário e e-mail não padrão.

[user]
  name = My Name
  email = default@email.com

[alias]
  commit-x = -c user.name='My X Name' -c user.email='mr_x@email.com' commit
  commit-y = -c user.name='My Y Name' -c user.email='mr_y@email.com' commit
  commit-z = -c user.name='My Z Name' -c user.email='mr_z@email.com' commit

Teste-o

git commit -m "Custom message with committer and author My Name <default@email.com>"
git commit-x -m "Custom message with committer and author My X Name <mr_x@email.com>"
git commit-y -m "Custom message with committer and author My Y Name <mr_y@email.com>"
git commit-z -m "Custom message with committer and author My Z Name <mr_z@email.com>"
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.