Я хочу змінити автора одного конкретного комітету в історії. Це не останнє зобов’язання.
Я знаю про це запитання - Як змінити автора комітету в git?
Але я думаю про щось, де я ідентифікую фіксацію по хешу чи короткоштришному.
Я хочу змінити автора одного конкретного комітету в історії. Це не останнє зобов’язання.
Я знаю про це запитання - Як змінити автора комітету в git?
Але я думаю про щось, де я ідентифікую фіксацію по хешу чи короткоштришному.
Відповіді:
Інтерактивне відновлення бази даних на точці раніше, ніж історія, ніж необхідна зміна ( git rebase -i <earliercommit>
). У список коммітов час нормований, змінити текст від pick
до edit
поряд з хеш , який ви хочете змінити. Потім, коли git запропонує вам змінити команду, скористайтеся цим:
git commit --amend --author="Author Name <email@address.com>" --no-edit
Наприклад, якщо ваша історія робить це 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
:wq
).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 rebase -i <commit>
vim
. Щоб зберегти та закрити, введіть Esc: wq Enter. З іншого боку, якщо це Nano, і ви бачите такі речі, як "WriteOut: ^ O" внизу, тоді вам слід використовувати Ctrl + O, Enter, Ctrl + X.
--no-edit
варіант. git commit --amend --reset-author --no-edit
не відкриє редактор. Доступний з git 1.7.9.
git rebase -i --root
загальноприйнятий відповідь на це питання дивно розумне використання інтерактивних перебазуватися, але , до жаль , демонструє конфлікти , якщо зробити ми намагаємося змінити автор раніше на гілці , який згодом злилися в. В більш загальному плані , вона не працює при обробці брудної історії.
Оскільки я переживаю за те, щоб запускати сценарії, які залежать від встановлення та невстановлення змінних середовища для переписання історії git, я пишу нову відповідь на основі цієї публікації, яка схожа на цю відповідь але є більш повною.
Далі перевірено та працює, на відміну від відповіді, що пов'язана. Припустимо, для чіткості експозиції 03f482d6
- це комітет, автора якого ми намагаємося замінити, і 42627abe
це комітет з новим автором.
Оформити комісію, яку ми намагаємося змінити.
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
git rebase -i
. Ніколи не чув про цю git replace
річ раніше. +1
--force-with-lease
замість цього -f
. Це безпечніше.
git filter-branch -- --all
зміна комітетів у всіх гілках, в яких було зроблено оригінальний фіксатор. Якщо у вас недостатньо облікових даних (або ви просто не хочете змінювати історію гілок інших), добре бути обережними з цією відповіддю.
Документація 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
Відправити виправлену історію до GitHub:
git push --force --tags origin 'refs/heads/*'
АБО якщо ви хочете натиснути вибрані посилання гілок, тоді використовуйте
git push --force --tags origin 'refs/heads/develop'
clone
/ push
, ви отримаєте резервну область імен refs/original/
. Я не міг знайти спосіб інтелектуально видалити цей простір імен, тому я закінчив видалення каталогу .git/refs/original
, який працював.
git push -f
буде змусити натиснути зміни на репо.
Скиньте електронну пошту до конфігурації в усьому світі:
git config --global user.email example@email.com
Тепер скиньте автора свого зобов’язання без необхідних редагувань:
git commit --amend --reset-author --no-edit
It's not last commit.
То як би вони amend
це зробили?
git reset HEAD~
, провів запропоновані рядки, а потім зробив наступне вручну знову. Працювали чудово!
git config --local user.name FirstName LastName
та git config --local user.email first.last@example.com
. Потім застосуйте до останніх шести команд, використовуючи git rebase --onto HEAD~6 --exec "git commit --amend --reset-author --no-edit" HEAD~6
. Нарешті, натисніть його на віддалене використання Git repo git push --force-with-lease
.
Ви можете змінити автора останнього комітету за допомогою команди нижче.
git commit --amend --author="Author Name <email@address.com>"
Однак якщо ви хочете змінити декілька імен автора, це трохи складно. Потрібно запустити інтерактивну базу даних, після чого позначте фіксацію як редагування, потім поправка їх по черзі та закінчення.
Почніть ребалінг із git rebase -i
. Це покаже вам щось подібне.
Змініть pick
ключове слово на edit
документи, які ви хочете змінити ім'я автора.
Потім закрийте редактор. Для початківців натисніть, Escape
а потім наберіть :wq
і натиснітьEnter
.
Тоді ви побачите свій термінал так, як нічого не сталося. Насправді ви перебуваєте в середині інтерактивної бази. Тепер прийшов час змінити ім’я автора вашого комітету за допомогою команди вище. Він знову відкриється редактором. Закрийте і продовжуйте перезавантажити git rebase --continue
. Повторіть те саме для підрахунку комітів, який ви хочете відредагувати. Ви можете переконатися, що інтерактивна база даних закінчена, коли ви отримаєте No rebase in progress?
повідомлення.
pick
дії та додати після кожного рядкаexec git commit --no-edit --amend --author="MyNewAuthor <my@new-auth.or>"
Відповіді на запитання, з яким ви пов’язали, є хорошими відповідями та висвітлюють вашу ситуацію (інше питання є більш загальним, оскільки передбачає перезапис кількох комітетів).
Як привід спробувати 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 shortlog -e -s
.
У документі 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 config user.name "New User"
git config user.email "newuser@gmail.com"
git log
git rebase -i 1f1357
# change the word 'pick' to 'edit', save and exit
git commit --amend --reset-author --no-edit
git rebase --continue
git push --force-with-lease
git log
git config user.name "New User"
git config user.email "newuser@gmail.com"
git rebase -i 1f1357
# change word pick to edit, save and exit
edit 809b8f7 change code order
pick 9baaae5 add prometheus monitor kubernetes
edit 5d726c3 fix liquid escape issue
edit 3a5f98f update tags
pick 816e21c add prometheus monitor kubernetes
Stopped at 809b8f7... change code order
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
refs/heads/master.
# each continue will show you an amend message
# use git commit --amend --reset-author --no-edit to comfirm
# use git rebase --skip to skip
git commit --amend --reset-author --no-edit
git rebase --continue
git commit --amend --reset-author --no-edit
...
git rebase --continue
Successfully rebased and updated refs/heads/master.
git push --force-with-lease
Якщо комісія, яку ви хочете змінити, не є останньою, виконайте наведені нижче дії. Якщо ваш комітет перебуває в іншій галузі, то спочатку перейдіть на цю гілку.
git checkout name_name
Знайдіть фіксацію перед командою, яку потрібно змінити, і знайдіть її хеш. Потім видайте команду rebase.
git rebase -i -p хеш комітів
Тоді редактор відкриється та введе «редагувати» для зобов’язань, які потрібно змінити. Залиште інших із опцією "вибору" за замовчуванням. Після зміни введіть клавішу 'esc' та wq! для виходу.
Потім видайте команду git commit з опцією поправки.
git commit --amend --author = "Електронна адреса користувача" --no-edit
Потім видайте таку команду.
git rebase - продовжувати
Після того як автор комісій буде оновлений у локальному сховищі, натисніть зміни у віддаленому сховищі.
Існує також ледачий підхід до цієї проблеми, особливо якщо у вас є кілька зобов'язань, які ви хочете змінити. У моєму випадку у мене була нова гілка з декількома комісіями з неправильним автором, і що мені допомогло:
Перейдіть до своєї початкової філії:
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 rebase i HEAD ~ 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" відповідно до ваших потреб
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: BANCH NAME -f [будь ласка, подбайте про -f Force push]
як git push -f
абоgit push origin HEAD: dev -f
git push
команди?
Зміна вашого імені абонента та електронної пошти в усьому світі:
$ git config --global user.name "John Doe"
$ git config --global user.email "john@doe.org"
Зміна імені та послуги електронної пошти для кожного репозиторія:
$ git config user.name "John Doe"
$ git config user.email "john@doe.org"
Зміна інформації про автора лише для наступного комітету:
$ git commit --author="John Doe <john@doe.org>"
Підказка . Для іншої ситуації та ознайомлення з додатковою інформацією прочитайте посилання .
Якщо вам потрібно змінити це АВТОР ОСТАННІХ комітів, і ніхто не використовує ваше сховище, ви можете скасувати останнє зобов’язання за допомогою:
git push -f origin last_commit_hash:branch_name
змінити ім’я автора вашої комісії на:
git commit --amend --author "type new author here"
Вийдіть із редактора, який відкриється, і знову натисніть код:
git push
Для повідомлення про об'єднання об'єднань я виявив, що не можу змінити його, використовуючи rebase
принаймні на gitlab. Він показує злиття як фіксацію, але я не можу перейти на цей #sha. Я знайшов цю публікацію корисною.
git checkout <sha of merge>
git commit --amend # edit message
git rebase HEAD previous_branch
Ці три рядки коду зробили роботу для зміни повідомлення про злиття (наприклад, автора).
Ви можете використовувати ці команди з офіційної сторінки github
https://help.github.com/en/github/using-git/changing-author-info
ось команди
#!/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
тут ви можете змінити старий електронний лист, щоб ур нове ім'я користувача та адресу електронної пошти.