Come si esegue il commit del codice come utente diverso?


112

Voglio essere in grado di farlo per uno script. Sto essenzialmente ricreando l'intera cronologia delle versioni di alcuni codici in Git - attualmente utilizza un diverso sistema di controllo della versione. Ho bisogno dello script per poter aggiungere i commit a Git preservando l'autore originale del commit (e la data).

Supponendo che conosca l'autore del commit e la data / ora in cui è stata apportata la modifica, esiste un comando Git che mi consente di farlo? Suppongo che ci sia, perché git-p4 fa qualcosa di simile. Sto solo chiedendo il modo migliore per farlo.


1
Hai provato a utilizzare l'importazione rapida?
alternativa

Sono d'accordo, l' importazione rapida è probabilmente il modo migliore per procedere. Potresti usare git commit (o più propriamente il plumbing sottostante: hash-object , update-index , write-tree , commit-tree , update-ref , ecc.), Ma l' importazione veloce sarebbe, beh, più veloce.
Chris Johnsen,

Ho pensato all'importazione rapida, ma poiché io stesso sono un principiante di git, ho deciso di usare i comandi di base. Ad essere sincero, non capisco appieno come funzioni l'importazione veloce e sono quindi un po 'titubante nell'usarlo finché non lo capisco meglio. Sì, sarà molto più lento usare il commit, ma almeno saprò cosa aspettarmi, specialmente durante il debug.
Carl

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

Risposte:


148

Controlla l' --authoropzione pergit commit :

Dalla pagina man :

--author=<author>

Sostituisci l'autore del commit. Specificare un autore esplicito utilizzando il A U Thor <author@example.com>formato standard . Altrimenti <author>si presume che sia un pattern ed è usato per cercare un commit esistente da quell'autore (cioè rev-list --all -i --author=<author>); l'autore del commit viene quindi copiato dal primo commit di questo tipo trovato.


18
Inoltre, l' --dateopzione per sovrascrivere la data.
Chris Johnsen,

Puoi fare un esempio specifico, tutto ciò che provo
studgeek

@Tim Henigan: Sembra che la documentazione sia ora ospitata su Github, quindi il collegamento alla pagina man che hai pubblicato è morto. Puoi confermare che la nuova pagina è la stessa cosa (nel caso ci siano altre risposte che necessitano di link aggiornati)?
R0MANARMY

@ R0MANARMY: ho aggiornato l'URL. Le pagine di GitHub sono corrette. Ho aggiornato il mio collegamento poiché le pagine man non sono più ospitate su kernel.org. Grazie per avermi informato del cambiamento.
Tim Henigan

1
Ecco cosa ho finito per usare:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
Carl

113

Solo per aggiungere a questo: l' --authoropzione menzionata nella risposta accettata sovrascriverà solo l' autore , non il committer informazioni del del commit.

Questo è il comportamento corretto nella maggior parte dei casi, ma se per qualche motivo è necessario sovrascrivere manualmente anche le informazioni del committer , utilizzare le variabili di ambiente GIT_COMMITTER_NAMEe GIT_COMMITTER_EMAIL(c'è anche un GIT_COMMITTER_DATE). Vedi Git-Internals-Environment-Variables

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

Questo farà sembrare il commit come se fosse stato creato e confermato dall'utente specificato.


16
... e per vedere la differenza:git log --pretty=fuller
bluenote10

2
Perfetto. Questo è quello che volevo e non avrei mai potuto trovare la pagina man di git internals.
ksp

3

Modifica il tuo file ~ / .gitconfig e aggiungi un nuovo alias in cui puoi personalizzare un utente e un indirizzo email non predefiniti.

[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

Provalo

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>"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.