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

StackOverflow https://stackoverflow.com/questions/3042437

  •  27-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

git commit --amend --author="Author Name <email@address.com>"

Например, если ваша история фиксации A-B-C-D-E-F с участием 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 <email@address.com>"
  5. потом git rebase --continue
  6. Это снова паузу снова в D
  7. Тогда вы бы git commit --amend --author="Author Name <email@address.com>" опять таки
  8. git rebase --continue
  9. Ребазу завершится.
  10. Использовать git push -f Чтобы обновить свое начало обновленным коммитациями.

Другие советы

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

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

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

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

    git checkout 03f482d6
    
  2. Сделать автор меняться.

    git commit --amend --author "New Author Name <New Author Email>"
    

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

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

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

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

    git filter-branch -- --all
    
  6. Удалить замену для чистоты.

    git replace -d 03f482d6
    
  7. Нажмите на новую историю (используйте только - дела, если ниже не удается, и только после проверки здравоохранения 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="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"

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 config --global user.email example@email.com

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

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

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

git commit --amend --author="Author Name <email@address.com>"

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

Начать переназнавать git rebase -i. Отказ Это покажет вам что-то подобное.

https://monosnap.com/file/G7sdn66k7JWpT91uiOUAQWMhPrMQVT.png

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

https://monosnap.com/file/dsq0AfopQMVskBNknz6GZZwlWGVwWU.png

Затем закройте редактор. Для начинающих, хит Escape Затем типа :wq и ударил Enter.

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

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

Как оправдание, чтобы попробовать 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 <branch-to-rewrite> is not provided or is empty HEAD will be used.
#     Use "--all" or a space separated list (e.g. "master next") to rewrite
#     multiple branches.
#
#     If <new-name> (or <new-email>) is not provided or is empty, the normal
#     user.name (user.email) Git configuration value will be used.
#

force=''
if test "x$1" = "x-f"; then
    force='-f'
    shift
fi

die() {
    printf '%s\n' "$@"
    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

Совершать до:

enter image description here

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

git commit --amend --author="Author Name <email@address.com>"

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

git commit --amend --author=Eugen

Совершать после команды:

enter image description here

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

enter image description here

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

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

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

git rebase --onto 4025621 --exec "git commit --amend --author=\"Foo Bar <foo@bar.com>\"" 4025621

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

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

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

git reauthor 4025621 Eugen

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

git push -f заставить обновление центрального хранилища.

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

При исполнении git rebase -i Есть этот интересный бит в док:

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

  • Если у вас есть история A-B-C-D-E-F,
  • и вы хотите изменить коммиты B а также D (= 2 коммитариев),

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

  • git config user.name "Correct new name"
  • git config user.email "correct@new.email"
  • Создайте пустые коммиты (один для каждого фиксации):
    • Вам нужно сообщение для мобазы цели
    • 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 E-F 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...

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

В дальнейшем Евген Конков Ответ, чтобы начать с корневой коммиты, использовать --root флаг. То --no-edit Флаг тоже полезен

git rebase --root --exec "git commit --amend --author='name <email>' --no-edit"

Если то, что вам нужно изменить, является автором последнего коммита, а никто другой не использует ваш репозиторий, вы можете отменить свой последний коммит с:

git push -f origin last_commit_hash:branch_name 

Измените имя автора вашего Commit с:

git commit --amend --author "type new author here"

Выйдите из редактора, который открывается и нажмите снова ваш код:

git push

Существует также ленивый подход к этой проблеме, особенно если у вас есть более одного коммита, который вы хотите изменить. В моем случае у меня была новая ветвь с несколькими коммитами с неправильным автором, так что мне помогло:

Перейти к своей первоначальной ветке:

git checkout develop

Создать новую ветвь от нее:

git checkout -b myFeature develop 

Объединить его без получения информации как один коммит:

git merge --no-commit --squash branchWrongAuthor

Вы также можете потратить изменения:

git stage .

Измените название автора и зафиксируйте изменения:

git commit --amend --author "New Author Name <New Author Email>" -m "new feature added"

И вот и все, вы можете подтолкнуть изменения.

git push

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

Если вы хотите измениться, не является последним коммитаром, затем выполните следующие шаги. Если ваш коммит находится в другом ветви, сначала переключитесь на эту ветку.

Git Checkout Friend_name.

Найдите совершение до совершенствования, которые вы хотите изменить и найти его хеш. Затем выпустите команду ребазы.

Git Rebase -I -P хэш фиксации

Затем редактор откроется и введет «редактировать» для коммитов, которые вы хотите изменить. Оставьте других по умолчанию «Pick». После изменения введите клавишу «Esc» и WQ! выйти.

Затем выпустите команду git commit с вариантом поправок.

Git Compry --Amend --author = "Имя пользователя электронной почты" --no-редактировать

Затем выпустите следующую команду.

GIT REBASE --Континую

После того, как автор Compute обновляется в локальном хранилище, нажмите изменения в удаленный репозиторий.

Шаги, чтобы переименовать имя автора после нажатия

  1. Первый тип "Git log", чтобы получить идентификатор фиксации и более подробную информацию
  2. GIT REBASE I Глава ~ 10 (10 - общий коммит для отображения на ребазе)

    If you Get anything like below

    fatal: It seems that there is already a rebase-merge directory, and I wonder if you are in the middle of another rebase. If that is the case, please try

    git rebase (--continue | --abort | --skip) If that is not the case, please rm -fr ".git/rebase-merge" and run me again. I am stopping in case you still have something valuable there.

  3. Затем введите «GIT REBASE --Continue» или «GIT REBASE --Abort» в соответствии с вашими потребностями

    • Теперь ваше окно Rebase открывается, нажмите «I» ключ от клавиатуры
    • Тогда вы получите список коммитов до 10 [потому что мы прошли 10 коммит выше] вроде ниже

    pick 897fe9e simplify code a little

    pick abb60f9 add new feature

    pick dc18f70 bugfix

  4. Теперь вам нужно добавить ниже команду чуть ниже коммита, который вы хотите редактировать, например,

    pick 897fe9e simplify code a little exec git commit --amend --author 'Author Name <author.name@mail.com>' pick abb60f9 add new feature exec git commit --amend --author 'Author Name <author.name@mail.com>' pick dc18f70 bugfix exec git commit --amend --author 'Author Name <author.name@mail.com>'

    1. Вот и все, теперь просто нажмите ESC,: WQ, и вы все набор

    2. Затем Git Push Origin Head: имя филиала -F [Пожалуйста, позаботитесь о -F Force Push

    подобно git push -f или git push origin HEAD: dev -f

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top