Jak zatwierdzasz kod jako inny użytkownik?

112

Chcę móc to zrobić dla scenariusza. Zasadniczo odtwarzam całą historię wersji jakiegoś kodu w Git - obecnie używa on innego systemu kontroli wersji. Potrzebuję skryptu, aby móc dodawać zatwierdzenia do Git, zachowując pierwotnego autora (i datę) zatwierdzenia.

Zakładając, że znam autora zatwierdzenia i datę / godzinę wprowadzenia zmiany, czy istnieje polecenie Git, które pozwala mi to zrobić? Zakładam, że tak, ponieważ git-p4 robi coś podobnego. Po prostu proszę o najlepszy sposób na zrobienie tego.

Carl
źródło
1
Czy próbowałeś użyć szybkiego importu?
alternatywny
Zgadzam się, szybki import to prawdopodobnie najlepsza droga. Mógłbyś użyć git commit (lub dokładniej podstawowa instalacja hydrauliczna: hash-object , update-index , write-tree , commit-tree , update-ref , etc.), ale szybki import byłby, no cóż, szybszy.
Chris Johnsen,
Myślałem o szybkim imporcie, ale ponieważ sam jestem początkującym gitem, zdecydowałem się użyć podstawowych poleceń. Szczerze mówiąc, nie do końca rozumiem, jak działa szybki import i dlatego trochę się waham przed jego użyciem, dopóki nie zrozumiem go lepiej. Tak, użycie commit będzie znacznie wolniejsze, ale przynajmniej będę wiedział, czego się spodziewać - szczególnie podczas debugowania.
Carl
1
git commit --author = "Name <[email protected]>" -a -m "commit msg"
Masih

Odpowiedzi:

148

Sprawdź --authoropcję dla git commit:

Od strony man :

--author=<author>

Zastąp autora zatwierdzenia. Określ wyraźnego autora, używając standardowego A U Thor <[email protected]>formatu. W przeciwnym razie <author>przyjmuje się, że jest to wzorzec i służy do wyszukiwania istniejącego zatwierdzenia tego autora (tj. rev-list --all -i --author=<author>); autor zatwierdzenia jest następnie kopiowany z pierwszego znalezionego zatwierdzenia.

Tim Henigan
źródło
18
Również --dateopcja nadpisania daty.
Chris Johnsen,
Czy możesz podać konkretny przykład, wszystko, czego próbuję
studgeek
@Tim Henigan: Wygląda na to, że dokumentacja jest teraz przechowywana na Github, więc link do strony podręcznika, który opublikowałeś, jest martwy. Czy możesz potwierdzić, że nowa strona jest taka sama (na wypadek, gdyby były inne odpowiedzi, które wymagają aktualizacji linków)?
R0MANARMY
@ R0MANARMY: Zaktualizowałem adres URL. Strony GitHub są poprawne. Zaktualizowałem swój link, ponieważ strony podręcznika nie są już hostowane na kernel.org. Dziękuję za poinformowanie mnie o zmianie.
Tim Henigan
1
Oto, czego ostatecznie użyłem:git commit -a --author="$user_details" --date="submit_date $submit_time" --file=/tmp/commit_msg
Carl
113

Wystarczy dodać do tak: --authoropcja wymienionych w przyjętym odpowiedź zastąpi tylko autora , a nie committer Informacyjnym popełnić.

W większości przypadków jest to poprawne zachowanie, ale jeśli z jakiegoś powodu musisz ręcznie nadpisać również informacje o inicjatorze, użyj zmiennych środowiskowych GIT_COMMITTER_NAMEi GIT_COMMITTER_EMAIL(jest GIT_COMMITTER_DATEteż). Zobacz Git-Internals-Environment-Variables

$ GIT_COMMITTER_NAME="New Name" GIT_COMMITTER_EMAIL="[email protected]" git commit --author="New Name <[email protected]>"

To sprawi, że zatwierdzenie będzie wyglądało tak, jakby zostało utworzone i zatwierdzone przez określonego użytkownika.

friederbluemle
źródło
16
... i zobaczyć różnicę:git log --pretty=fuller
bluenote10
2
Idealny. To jest to, czego chciałem i nigdy nie mogłem znaleźć strony podręcznika man git internals.
ksp
3

Edytuj swój plik ~ / .gitconfig i dołącz nowy alias, w którym możesz dostosować niestandardowego użytkownika i adres e-mail.

[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

Sprawdź to

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
źródło