Как изменить автор Commit для одного конкретного фиксации?
-
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
, тогда вы бы ...
- Уточнить
git rebase -i B
(вот пример того, что вы увидите после выполненияgit rebase -i B
команда)- Если вам нужно редактировать
A
, использоватьgit rebase -i --root
- Если вам нужно редактировать
- изменить строки для обоих
C
а такжеD
отpick
кedit
- После начала ребазы это будет сначала пауза на
C
- Ты бы
git commit --amend --author="Author Name <email@address.com>"
- потом
git rebase --continue
- Это снова паузу снова в
D
- Тогда вы бы
git commit --amend --author="Author Name <email@address.com>"
опять таки git rebase --continue
- Ребазу завершится.
- Использовать
git push -f
Чтобы обновить свое начало обновленным коммитациями.
Другие советы
То принятый ответ На этот вопрос удивительно умное использование интерактивной ребазы, но к сожалению, демонстрирует конфликты, если бы совершил, мы пытаемся изменить, автор раньше находился на ветке, который впоследствии был объединен в более общем случае, он не работает при работе с грязным истории.
Поскольку я опасаюсь о запусках сценариев, которые зависят от настройки и переменных среды для переписывания истории Git, я пишу новый ответ на основе эта почта который похож на Этот ответ Но более полный.
Следующее тестируется и работает, в отличие от связанного ответа. Предположим, что ясность экспозиции, что 03f482d6
Обязательство, чья автор мы пытаемся заменить, и 42627abe
это фиксация с новым автором.
Оформить заказ Commit, мы пытаемся изменить.
git checkout 03f482d6
Сделать автор меняться.
git commit --amend --author "New Author Name <New Author Email>"
Теперь у нас новый коммит с хешем предполагается
42627abe
.Оформить заказ оригинальной ветви.
Замените старый коммит с новым локально.
git replace 03f482d6 42627abe
Перепишите все будущие коммиты на основе замены.
git filter-branch -- --all
Удалить замену для чистоты.
git replace -d 03f482d6
Нажмите на новую историю (используйте только - дела, если ниже не удается, и только после проверки здравоохранения
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
. Отказ Это покажет вам что-то подобное.
Изменить pick
ключевое слово в edit
Для комбинтов вы хотите изменить имя автора.
Затем закройте редактор. Для начинающих, хит 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
Совершать до:
Чтобы исправить автор для всех коммитов, вы можете применить команду из ответа @ Amber:
git commit --amend --author="Author Name <email@address.com>"
Или повторно использовать свое имя и адрес электронной почты, вы можете просто написать:
git commit --amend --author=Eugen
Совершать после команды:
Например, чтобы изменить все, начиная с 4025621
:
Ты должен бежать:
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 обновляется в локальном хранилище, нажмите изменения в удаленный репозиторий.
Шаги, чтобы переименовать имя автора после нажатия
- Первый тип "Git log", чтобы получить идентификатор фиксации и более подробную информацию
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.
Затем введите «GIT REBASE --Continue» или «GIT REBASE --Abort» в соответствии с вашими потребностями
- Теперь ваше окно Rebase открывается, нажмите «I» ключ от клавиатуры
- Тогда вы получите список коммитов до 10 [потому что мы прошли 10 коммит выше] вроде ниже
pick 897fe9e simplify code a little
pick abb60f9 add new feature
pick dc18f70 bugfix
Теперь вам нужно добавить ниже команду чуть ниже коммита, который вы хотите редактировать, например,
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>'
Вот и все, теперь просто нажмите ESC,: WQ, и вы все набор
Затем Git Push Origin Head: имя филиала -F [Пожалуйста, позаботитесь о -F Force Push
подобно
git push -f
илиgit push origin HEAD: dev -f