Как вы фиксируете код от имени другого пользователя?

112

Я хочу сделать это для сценария. По сути, я воссоздаю всю историю версий некоторого кода в Git - в настоящее время он использует другую систему контроля версий. Мне нужен сценарий, чтобы можно было добавлять коммиты в Git, сохраняя при этом первоначального автора (и дату) коммита.

Предполагая, что я знаю автора фиксации и дату / время внесения изменений, существует ли команда Git, которая позволяет мне это сделать? Я предполагаю, что да, потому что git-p4 делает нечто подобное. Я просто спрашиваю, как лучше это сделать.

деревенщина
источник
1
Вы пробовали использовать быстрый импорт?
альтернатива
Я согласен, быстрый импорт , вероятно, будет лучшим вариантом. Вы можете использовать git commit (или, точнее, базовую сантехнику: hash-object , update-index , write-tree , commit-tree , update-ref и т.д.), но быстрый импорт будет, ну, быстрее.
Крис Джонсен,
Я думал о быстром импорте, но, поскольку я сам достаточно новичок в git, я решил использовать основные команды. Честно говоря, я не совсем понимаю, как работает быстрый импорт, и поэтому немного не решаюсь использовать его, пока не пойму лучше. Да, использование фиксации будет намного медленнее, но, по крайней мере, я буду знать, чего ожидать, особенно во время отладки.
Карл,
1
git commit --author = "Name <name@example.com>" -a -m "commit msg"
Масих

Ответы:

148

Оцените --authorвариант для git commit:

На странице руководства :

--author=<author>

Переопределить автора фиксации. Укажите явного автора в стандартном A U Thor <author@example.com>формате. В противном случае <author>предполагается, что это шаблон и используется для поиска существующей фиксации этого автора (т.е. rev-list --all -i --author=<author>); затем автор фиксации копируется из первой найденной такой фиксации.

Тим Хениган
источник
18
Также есть --dateвозможность переопределить дату.
Крис Джонсен,
Можете ли вы привести конкретный пример, все, что я пробую?
Studgeek
@ Тим Хениган: Похоже, что документация теперь размещена на Github, поэтому опубликованная вами ссылка на страницу руководства мертва. Можете ли вы подтвердить, что новая страница - это то же самое (если есть другие ответы, требующие обновления ссылок)?
R0MANARMY
@ R0MANARMY: Я обновил URL. Страницы GitHub верны. Я обновил свою ссылку, так как страницы руководства больше не размещаются на kernel.org. Спасибо, что сообщили мне об изменении.
Тим Хениган
1
Вот что я в итоге использовал:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
Карл
113

Просто чтобы добавить так: --authorвариант упоминается в общепринятом ответе будет только переопределить автор , а не зафиксировавшую информацию фиксации.

В большинстве случаев это правильное поведение, но если по какой-то причине вам нужно вручную переопределить информацию о коммиттере, используйте переменные среды GIT_COMMITTER_NAMEи GIT_COMMITTER_EMAIL(также есть GIT_COMMITTER_DATE). См. Git-Internals-Environment-Variables

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

В результате фиксация будет выглядеть так, как будто она была создана и зафиксирована указанным пользователем.

friederbluemle
источник
16
... и чтобы увидеть разницу:git log --pretty=fuller
bluenote10 03
2
Отлично. Это то, что я хотел, и я никогда не смог бы найти справочную страницу git internals.
ksp
3

Для конкретного сценария вы можете использовать -c user.name='My Name' -c user.email='my@email.com'аргументы в своей команде cli, чтобы переопределить любую предыдущую конфигурацию.

git commit -c user.name='My Name' -c user.email='my@email.com' -m "Custom message"

Однако, если вы намерены сохранить его как дополнительную настройку, вы можете использовать псевдоним. В этом случае отредактируйте файл ~ / .gitconfig и добавьте новый псевдоним, в котором вы можете настроить пользователя и адрес электронной почты, отличные от стандартных.

[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

Попробуй это

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>"
Борода
источник