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.

Carl
fonte
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 <[email protected]>" -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 <[email protected]>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.

Tim Henigan
fonte
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="[email protected]" git commit --author="New Name <[email protected]>"

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

Friederbluemle
fonte
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 = [email protected]

[alias]
  commit-x = -c user.name='My X Name' -c user.email='[email protected]' commit
  commit-y = -c user.name='My Y Name' -c user.email='[email protected]' commit
  commit-z = -c user.name='My Z Name' -c user.email='[email protected]' commit

Teste-o

git commit -m "Custom message with committer and author My Name <[email protected]>"
git commit-x -m "Custom message with committer and author My X Name <[email protected]>"
git commit-y -m "Custom message with committer and author My Y Name <[email protected]>"
git commit-z -m "Custom message with committer and author My Z Name <[email protected]>"
BeardOverflow
fonte