Wie schreibt man Code als anderer Benutzer fest?


112

Ich möchte dies für ein Skript tun können. Ich erstelle im Wesentlichen den gesamten Versionsverlauf eines Codes in Git neu - derzeit wird ein anderes Versionskontrollsystem verwendet. Ich benötige das Skript, um die Commits zu Git hinzufügen zu können, während der ursprüngliche Autor (und das Datum) des Commits beibehalten werden.

Angenommen, ich kenne den Commit-Autor und das Datum / die Uhrzeit der Änderung. Gibt es einen Git-Befehl, mit dem ich dies tun kann? Ich gehe davon aus, dass dies der Fall ist, da git-p4 etwas Ähnliches tut. Ich frage nur nach dem besten Weg, es zu tun.


1
Haben Sie versucht, den Schnellimport zu verwenden?
Alternative

Ich bin damit einverstanden, dass der schnelle Import wahrscheinlich der beste Weg ist. Sie könnten git commit verwenden (oder besser gesagt die zugrunde liegende Installation: Hash-Objekt , Update-Index , Schreibbaum , Commit-Baum , Update-Ref usw.), aber ein schneller Import wäre natürlich schneller.
Chris Johnsen

Ich habe an Fast-Import gedacht, aber da ich selbst ein ziemlicher Anfänger bin, habe ich mich für die grundlegenden Befehle entschieden. Um ganz ehrlich zu sein, verstehe ich nicht ganz, wie der schnelle Import funktioniert, und zögere daher ein wenig, ihn zu verwenden, bis ich ihn besser verstehe. Ja, mit Commit wird es viel langsamer, aber zumindest weiß ich, was mich erwartet - insbesondere beim Debuggen.
Carl

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

Antworten:


148

Überprüfen Sie die --authorOption für git commit:

Von der Manpage :

--author=<author>

Überschreiben Sie den Commit-Autor. Geben Sie einen expliziten Autor im Standardformat an A U Thor <author@example.com>. Andernfalls <author>wird angenommen, dass es sich um ein Muster handelt, und es wird verwendet, um nach einem vorhandenen Commit dieses Autors zu suchen (dh rev-list --all -i --author=<author>). Der Commit-Autor wird dann von dem ersten gefundenen Commit kopiert.


18
Auch die --dateOption, das Datum zu überschreiben.
Chris Johnsen

Können Sie ein konkretes Beispiel geben, alles, was ich versuche
studgeek

@ Tim Henigan: Es sieht so aus, als ob die Dokumentation jetzt auf Github gehostet wird, sodass der von Ihnen gepostete Manpage- Link tot ist. Können Sie bestätigen, dass die neue Seite dasselbe ist (falls es andere Antworten gibt, für die Links aktualisiert werden müssen)?
R0MANARMY

@ R0MANARMY: Ich habe die URL aktualisiert. Die GitHub-Seiten sind korrekt. Ich habe meinen Link aktualisiert, da die Manpages nicht mehr auf kernel.org gehostet werden. Vielen Dank, dass Sie mich über die Änderung informiert haben.
Tim Henigan

1
Hier ist, was ich am Ende verwendet habe:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
Carl

113

Nur um dies hinzuzufügen: Die --authorin der akzeptierten Antwort erwähnte Option überschreibt nur den Autor , nicht die Committer- Informationen des Commits.

Dies ist in den meisten Fällen das richtige Verhalten. Wenn Sie jedoch aus irgendeinem Grund die Committer-Informationen auch manuell überschreiben müssen , verwenden Sie die Variablen GIT_COMMITTER_NAMEund und die GIT_COMMITTER_EMAILUmgebungsvariablen (es gibt auch eine GIT_COMMITTER_DATE). Siehe Git-Internals-Umgebungsvariablen

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

Dadurch sieht das Commit so aus, als ob es vom angegebenen Benutzer erstellt und festgeschrieben wurde.


16
... und um den Unterschied zu sehen:git log --pretty=fuller
bluenote10

2
Perfekt. Dies ist, was ich wollte und ich hätte die Manpage von git internals nie finden können.
ksp

3

Bearbeiten Sie Ihre ~ / .gitconfig-Datei und fügen Sie einen neuen Alias ​​hinzu, in dem Sie einen nicht standardmäßigen Benutzer und eine E-Mail-Adresse anpassen können.

[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

Probier es aus

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>"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.