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.

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

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

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

friederbluemle
quelle
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 = [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

Probier es aus

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
quelle