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

Я хочу изменить автора одной конкретной фиксации в истории. Это не последняя фиксация.

Я знаю об этом вопросе – Как изменить автора фиксации в git?

Но я думаю о чем-то, где я идентифицирую фиксацию хешем или коротким хешем.

    Интерактивная перезагрузка точки ранее в истории, чем фиксация, которую необходимо изменить ( git rebase -i ). В списке переустановленных коммитов измените текст из пункта pick для edit рядом с хешем того, который вы хотите изменить. Затем, когда git предложит вам изменить фиксацию, используйте следующее:

     git commit --amend --author="Author Name " 

    Например, если ваша история фиксации ABCDEF с F как HEAD , и вы хотите изменить автора C и D , вы бы …

    1. Укажите git rebase -i B ( вот пример того, что вы увидите после выполнения команды git rebase -i B )
      • если вам нужно отредактировать A , используйте git rebase -i --root
    2. измените линии для C и D чтобы pick для edit
    3. Как только начнется перебаза, он сначала остановится на C
    4. Вы бы git commit --amend --author="Author Name "
    5. Затем git rebase --continue
    6. Он снова остановится в D
    7. Затем вы снова git commit --amend --author="Author Name "
    8. git rebase --continue
    9. Перестановка будет завершена.

    Принятый ответ на этот вопрос – это удивительно умное использование интерактивной переадресации, но, к сожалению, оно вызывает конфликты, если коммит, который мы пытаемся изменить, автор использовал для того, чтобы быть на ветке, которая впоследствии была объединена. В более общем плане это не работает при обработке грязных историй.

    Поскольку я опасаюсь запускать скрипты, которые зависят от установки и отключения переменных среды для перезаписи истории git, я пишу новый ответ, основанный на этом сообщении, который похож на этот ответ, но является более полным.

    В отличие от связанного ответа проверяется и работает следующее. Предположим для ясности изложения, что 03f482d6 является фиксацией, автором которой мы пытаемся заменить, и 42627abe является фиксацией с новым автором.

    1. Оформить покупку, которую мы пытаемся изменить.

       git checkout 03f482d6 
    2. Измените автора.

       git commit --amend --author "New Author Name " 

      Теперь у нас есть новая фиксация с хешем, предполагаемым 42627abe .

    3. Оформить оригинальную ветку.

    4. Замените старый commit на новый локально.

       git replace 03f482d6 42627abe 
    5. Перепишите все будущие фиксации на основе замены.

       git filter-branch -- --all 
    6. Снимите замену на чистоту.

       git replace -d 03f482d6 
    7. Нажмите новую историю (используйте только -force, если ниже не удается, и только после проверки git log с помощью git log и / или git diff ).

       git push --force-with-lease 

    Вместо 4-6 вы можете просто переустановить новую фиксацию:

     git rebase -i 42627abe 

    Документация Github содержит скрипт, который заменяет информацию коммиттера для всех коммитов в ветке .

     #!/bin/sh git filter-branch --env-filter ' OLD_EMAIL="[email protected]" CORRECT_NAME="Your Correct Name" CORRECT_EMAIL="[email protected]" if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] then export GIT_COMMITTER_NAME="$CORRECT_NAME" export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" fi if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] then export GIT_AUTHOR_NAME="$CORRECT_NAME" export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" fi ' --tag-name-filter cat -- --branches --tags 

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

    git commit --amend --author="Author Name "

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

    Начните переустанавливать с помощью git rebase -i . Он покажет вам что-то вроде этого.

    http://sofru.miximages.com/git/2908150343-77gex.png

    Измените ключевое слово pick чтобы edit для коммитов, которые вы хотите изменить имя автора.

    http://sofru.miximages.com/git/2908150344-ii246.png

    Затем закройте редактор. Для новичков нажмите Escape затем введите :wq и нажмите Enter .

    Тогда вы увидите свой терминал, как будто ничего не случилось. На самом деле вы находитесь в середине интерактивной перестановки. Теперь пришло время изменить имя автора сообщения, используя команду выше. Он снова откроет редактор. Выйти и продолжить rebase с git rebase --continue . Повторите то же самое для количества фиксации, которое вы хотите отредактировать. Вы можете убедиться, что интерактивная перебаза закончилась, когда вы получаете « No rebase in progress? сообщение.

    • Сбросьте электронную почту в конфигурацию по всему миру:

      git config --global user.email [email protected]

    • Теперь перезагрузите автора вашей фиксации без необходимости редактирования:

      git commit --amend --reset-author --no-edit

    Ответы на вопрос, на который вы связаны, являются хорошими ответами и охватывают вашу ситуацию (другой вопрос более общий, поскольку он включает переписывание нескольких коммитов).

    В качестве предлога попробовать git filter-branch я написал сценарий для перезаписи имени автора и / или электронной почты автора для данной фиксации:

     #!/bin/sh # # Change the author name and/or email of a single commit. # # change-author [-f] commit-to-change [branch-to-rewrite [new-name [new-email]]] # # If -f is supplied it is passed to "git filter-branch". # # If  is not provided or is empty HEAD will be used. # Use "--all" or a space separated list (eg "master next") to rewrite # multiple branches. # # If  (or ) is not provided or is empty, the normal # user.name (user.email) Git configuration value will be used. # force='' if test "x$1" = "xf"; then force='-f' shift fi die() { printf '%s\n' "[email protected]" exit 128 } targ="$(git rev-parse --verify "$1" 2>/dev/null)" || die "$1 is not a commit" br="${2:-HEAD}" TARG_COMMIT="$targ" TARG_NAME="${3-}" TARG_EMAIL="${4-}" export TARG_COMMIT TARG_NAME TARG_EMAIL filt=' if test "$GIT_COMMIT" = "$TARG_COMMIT"; then if test -n "$TARG_EMAIL"; then GIT_AUTHOR_EMAIL="$TARG_EMAIL" export GIT_AUTHOR_EMAIL else unset GIT_AUTHOR_EMAIL fi if test -n "$TARG_NAME"; then GIT_AUTHOR_NAME="$TARG_NAME" export GIT_AUTHOR_NAME else unset GIT_AUTHOR_NAME fi fi ' git filter-branch $force --env-filter "$filt" -- $br 

    Когда вы делаете git rebase -i есть этот интересный бит в документе:

    Если вы хотите сбросить две или более коммитов в одну, замените команду "pick" для второй и последующих "fixup" "squash" или "fixup" . Если у коммитов были разные авторы, сложенный фиксаж будет приписан автору первого коммита. Предлагаемое сообщение фиксации для сложенного коммита – это объединение сообщений фиксации первого коммита и тех, у кого есть команда "squash" , но опускает сообщения фиксации коммитов с помощью команды "fixup" .

    • Если у вас есть история ABCDEF ,
    • и вы хотите изменить коммиты B и D (= 2 фиксации),

    то вы можете сделать:

    • git config user.name "Correct new name"
    • git config user.email "[email protected]"
    • создавать пустые коммиты (по одному для каждой фиксации):
      • вам нужно сообщение для целей переустановки
      • git commit --allow-empty -m "empty"
    • запустить операцию переадресации
      • git rebase -i B^
      • B^ выбирает родительский элемент B
    • вам нужно будет поместить одну пустую фиксацию перед каждой фиксацией для изменения
    • вы захотите изменить pick для squash для них.

    Пример того, что git rebase -i B^ даст вам:

     pick sha-commit-B some message pick sha-commit-C some message pick sha-commit-D some message pick sha-commit-E some message pick sha-commit-F some message # pick sha-commit-empty1 empty # pick sha-commit-empty2 empty 

    измените это на:

     # change commit B's author pick sha-commit-empty1 empty squash sha-commit-B some message # leave commit C alone pick sha-commit-C some message # change commit D's author pick sha-commit-empty2 empty squash sha-commit-D some message # leave commit EF alone pick sha-commit-E some message pick sha-commit-F some message 

    Он предложит вам отредактировать сообщения:

     # This is a combination of 2 commits. # The first commit's message is: empty # This is the 2nd commit message: ...some useful commit message there... 

    и вы можете просто удалить первые несколько строк.

    Еще один шаг к ответу Янтаря, если вы используете централизованный repository:

    git push -f чтобы принудительно обновить центральный repository.

    Будьте осторожны, что в одной и той же отрасли не так много людей, потому что это может испортить последовательность.

    Зафиксировать до:

    введите описание изображения здесь

    Чтобы исправить автора для всех коммитов, вы можете применить команду из ответа @ Amber:

     git commit --amend --author="Author Name " 

    Или для повторного использования своего имени и электронной почты вы можете просто написать:

     git commit --amend --author=Eugen 

    Зафиксировать команду:

    введите описание изображения здесь

    Например, чтобы изменить все, начиная с 4025621 :

    введите описание изображения здесь

    Ты должен бежать:

     git rebase --onto 4025621 --exec "git commit --amend --author=Eugen" 4025621 

    или добавьте этот псевдоним в ~/.gitconfig :

     [alias] reauthor = !bash -c 'git rebase --onto $1 --exec \"git commit --amend --author=$2\" $1' -- 

    А затем запустите:

     git reauthor 4025621 Eugen 
    Interesting Posts

    Как подождать в bash для нескольких subprocessов, чтобы закончить и вернуть код выхода! = 0, когда какой-либо subprocess заканчивается кодом! = 0?

    Вызов статического метода с использованием отражения

    Извлечение имени носителя с iPhone

    Как сделать Ubuntu VM в VirtualBox доступным из Интернета?

    Разница между char * str = “STRING” и char str = “STRING”?

    Разница между classами, объектами и экземплярами

    Как использовать установленный Vim в Git Bash вместо того, который был с Git?

    Как я могу прочитать внутреннее создание / изменение PDF в Windows PowerShell?

    Google Chrome автоматически добавляет сайты в список поисковых систем?

    Каков самый простой способ генерации xml в c ++?

    Загружать файлы размером более 1 М из папки с файлами

    Могу ли я автоматически генерировать субтитры из видеофайла?

    Панель навигации Outlook 2010 – отображение непрочитанного числа в почтовом ящике

    Что означает android: layout_weight?

    SecurityException: caller uid XXXX отличается от идентификатора аутентификатора

    Давайте будем гением компьютера.