it-swarm.com.ru

Как изменить автора, имя коммиттера и адрес электронной почты нескольких коммитов в Git?

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

Есть ли способ изменить автора этих коммитов на мое имя?

2181
Flávio Amieiro

Смена автора (или коммиттера) потребует переписывания всей истории. Если вы согласны с этим и считаете, что оно того стоит, вам следует проверить git filter-branch . Страница man содержит несколько примеров, с которых можно начать. Также обратите внимание, что вы можете использовать переменные окружения для изменения имени автора, коммиттера, дат и т.д. - см. Раздел "Переменные среды" на man-страница git .

В частности, с помощью этой команды вы можете исправить все неправильные имена авторов и электронные письма для всех веток и тегов (источник: GitHub help ):

#!/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
993
Pat Notz

Использование интерактивной ребазы

Вы могли бы сделать

git rebase -i -p <some HEAD before all of your bad commits>

Затем пометьте все ваши плохие коммиты как "edit" в файле rebase. Если вы также хотите изменить свой первый коммит, вы должны вручную добавить его в качестве первой строки в файле rebase (следуйте формату других строк). Затем, когда git просит вас внести изменения в каждый коммит, выполните

 git commit --amend --author "New Author Name <[email protected]>" 

отредактируйте или просто закройте открывшийся редактор, а затем выполните

git rebase --continue

продолжить ребаз.

Вы можете вообще пропустить открытие редактора, добавив --no-edit, чтобы команда была:

git commit --amend --author "New Author Name <[email protected]>" --no-edit && \
git rebase --continue

Single Commit

Как отмечают некоторые из комментаторов, если вы просто хотите изменить самый последний коммит, команда rebase не нужна. Просто делать

 git commit --amend --author "New Author Name <[email protected]>"

Это изменит автора на указанное имя, но для коммиттера будет настроен ваш настроенный пользователь в git config user.name и git config user.email. Если вы хотите установить для коммиттера что-то, что вы укажете, это установит и автора, и коммиттера:

 git -c user.name="New Author Name" -c [email protected] commit --amend --reset-author

Примечание о слиянии коммитов

В моем первоначальном ответе был небольшой недостаток. Если есть какие-либо коммиты слияния между текущим HEAD и вашим <some HEAD before all your bad commits>, тогда git rebase сгладит их (и, между прочим, если вы используете GitHub pull-запросов, в вашей истории будет тонна коммитов слияний). Это может очень часто приводить к очень разной истории (поскольку повторяющиеся изменения могут быть "перебазированы"), а в худшем случае это может привести к git rebase, в котором вас попросят разрешить сложные конфликты слияния (которые, вероятно, уже были разрешены в коммитах слияния) , Решение заключается в использовании флага -p для git rebase, который сохранит структуру слияния вашей истории. Страница man для git rebase предупреждает, что использование -p и -i может привести к проблемам, но в разделе BUGS говорится: "Редактирование коммитов и переписывание их сообщений коммитов должно работать нормально".

Я добавил -p в приведенную выше команду. Для случая, когда вы просто изменяете самый последний коммит, это не проблема.

1497
asmeurer

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

git filter-branch --commit-filter '
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "[email protected]";
        else
                git commit-tree "[email protected]";
        fi' HEAD

Обратите внимание: если вы используете эту команду в командной строке Windows, вам нужно использовать " вместо ':

git filter-branch --commit-filter "
        if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
        then
                GIT_COMMITTER_NAME="<New Name>";
                GIT_AUTHOR_NAME="<New Name>";
                GIT_COMMITTER_EMAIL="<New Email>";
                GIT_AUTHOR_EMAIL="<New Email>";
                git commit-tree "[email protected]";
        else
                git commit-tree "[email protected]";
        fi" HEAD
578
Rognon

Один вкладыш, но будьте осторожны, если у вас есть многопользовательский репозиторий - это изменится все фиксирует наличие одинакового (нового) автора и коммиттера.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='[email protected]'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='[email protected]';" HEAD

С переводом строки в строку (что возможно в bash):

git filter-branch -f --env-filter "
    GIT_AUTHOR_NAME='Newname'
    GIT_AUTHOR_EMAIL='[email protected]'
    GIT_COMMITTER_NAME='Newname'
    GIT_COMMITTER_EMAIL='[email protected]'
  " HEAD
514
Brian Gianforcaro

Это происходит, когда у вас нет инициализированного $ HOME/.gitconfig. Вы можете исправить это как:

git config --global user.name "you name"
git config --global user.email [email protected]
git commit --amend --reset-author

протестировано с версией git 1.7.5.4

212
lrkwz

Для одного коммита:

git commit --amend --author="Author Name <[email protected]>"

(извлечено из ответа asmeurer)

181
blueyed

В случае, когда только у нескольких верхних коммитов есть плохие авторы, вы можете сделать все это внутри git rebase -i, используя команду exec и --amend, следующим образом:

git rebase -i HEAD~6 # as required

который предоставляет вам редактируемый список коммитов:

pick abcd Someone else's commit
pick defg my bad commit 1
pick 1234 my bad commit 2

Затем добавьте exec ... --author="..." строки после всех строк с плохими авторами:

pick abcd Someone else's commit
pick defg my bad commit 1
exec git commit --amend --author="New Author Name <[email protected]m>" -C HEAD
pick 1234 my bad commit 2
exec git commit --amend --author="New Author Name <[email protected]>" -C HEAD

сохранить и выйти из редактора (для запуска).

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

Спасибо @asmeurer за вдохновение.

167
Alex Brown

Github имеет Хорошее решение , что является следующим сценарием Shell:

#!/bin/sh

git filter-branch --env-filter '

an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"

if [ "$GIT_COMMITTER_EMAIL" = "[email protected]" ]
then
    cn="Your New Committer Name"
    cm="Your New Committer Email"
fi
if [ "$GIT_AUTHOR_EMAIL" = "[email protected]" ]
then
    an="Your New Author Name"
    am="Your New Author Email"
fi

export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
108
Olivier Verdier

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

Но если вы действительно хотите это сделать и находитесь в среде bash (без проблем в Linux, в Windows вы можете использовать git bash, который поставляется вместе с git), используйте git filter-branch :

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = [email protected] ];
    then [email protected];
  fi;
export GIT_AUTHOR_EMAIL'

Чтобы ускорить процесс, вы можете указать диапазон ревизий, которые вы хотите переписать:

git filter-branch --env-filter '
  if [ $GIT_AUTHOR_EMAIL = [email protected] ];
    then [email protected];
  fi;
export GIT_AUTHOR_EMAIL' HEAD~20..HEAD
80
svick

Принимая нефиксированный коммит от другого автора, есть простой способ справиться с этим.

git commit --amend --reset-author

47
Ryanmt

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

git change-commits GIT_AUTHOR_NAME "old name" "new name"

или за последние 10 коммитов:

git change-commits GIT_AUTHOR_EMAIL "[email protected]" "[email protected]" HEAD~10..HEAD

Добавьте в ~/.gitconfig:

[alias]
    change-commits = "!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" [email protected]; }; f "

Источник: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig

Надеюсь, это полезно.

40
brauliobo

Это более сложная версия версии @ Brian's:

Чтобы изменить автора и коммиттера, вы можете сделать это (с переносом строки в строке, что возможно в bash):

git filter-branch --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

Вы можете получить одну из этих ошибок:

  1. Временный каталог уже существует
  2. Ссылки, начинающиеся с ссылки/оригинал уже существуют
    (это означает, что другая ветвь фильтра была ранее запущена в хранилище, и тогда исходная ссылка на ветку резервируется в refs/original )

Если вы хотите форсировать запуск, несмотря на эти ошибки, добавьте флаг --force:

git filter-branch --force --env-filter '
    if [ "$GIT_COMMITTER_NAME" = "<Old name>" ];
    then
        GIT_COMMITTER_NAME="<New name>";
        GIT_COMMITTER_EMAIL="<New email>";
        GIT_AUTHOR_NAME="<New name>";
        GIT_AUTHOR_EMAIL="<New email>";
    fi' -- --all

Может понадобиться небольшое объяснение опции -- --all: она заставляет ветвь фильтра работать со всеми ревизиями всех ссылок (включая все ветки). Это означает, например, что теги также переписаны и видны в переписанных ветвях.

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

38
stigkj
  1. запустить git rebase -i <sha1 or ref of starting point>
  2. пометьте все коммиты, которые вы хотите изменить, с помощью edit (или e)
  3. выполните следующие две команды, пока не обработаете все коммиты:

    git commit --amend --reuse-message=HEAD --author="New Author <[email protected]>"; git rebase --continue

Это сохранит всю остальную информацию о коммите (включая даты). Параметр --reuse-message=HEAD запрещает запуск редактора сообщений.

23
sporsh

Я использую следующее, чтобы переписать автора для всего хранилища, включая теги и все ветви:

git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='New name';
  export GIT_AUTHOR_EMAIL='New email'
" -- --all

Затем, как описано в страница MAN в filter-branch , удалите все исходные ссылки, подкрепленные filter-branch (это разрушительно, сначала сделайте резервную копию):

git for-each-ref --format="%(refname)" refs/original/ | \
xargs -n 1 git update-ref -d
21
Ton van den Heuvel

Я адаптировал это решение , которое работает путем приема простого author-conv-file (формат такой же, как и для git-cvsimport ). Он работает путем изменения всех пользователей, как определено в author-conv-file во всех ветвях.

Мы использовали это вместе с cvs2git для переноса нашего хранилища из cvs в git.

т.е. образец author-conv-file

john=John Doe <[email protected]>
jill=Jill Doe <[email protected]>

Сценарий:

 #!/bin/bash

 export $authors_file=author-conv-file

 git filter-branch -f --env-filter '

 get_name () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=\(.*\) <.*>$/\1/"
 }

 get_email () {
     grep "^$1=" "$authors_file" |
     sed "s/^.*=.* <\(.*\)>$/\1/"
 }

 GIT_AUTHOR_NAME=$(get_name $GIT_COMMITTER_NAME) &&
     GIT_AUTHOR_EMAIL=$(get_email $GIT_COMMITTER_NAME) &&
     GIT_COMMITTER_NAME=$GIT_AUTHOR_NAME &&
     GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL &&
     export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL &&
     export GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
 ' -- --all
21
Leif Gruenwoldt

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

Версия ниже работает на всех ветках и меняет автора и комитера отдельно, чтобы предотвратить это.

Престижность к leif81 для всего варианта.

#!/bin/bash

git filter-branch --env-filter '
if [ "$GIT_AUTHOR_NAME" = "<old author>" ];
then
    GIT_AUTHOR_NAME="<new author>";
    GIT_AUTHOR_EMAIL="<[email protected]>";
fi
if [ "$GIT_COMMITTER_NAME" = "<old committer>" ];
then
    GIT_COMMITTER_NAME="<new commiter>";
    GIT_COMMITTER_EMAIL="<[email protected]>";
fi
' -- --all
18
drahnr
  1. Измените коммит author name & email на Amend, затем заменив old-commit with new-one:

    $ git checkout <commit-hash>                            # checkout to the commit need to modify  
    $ git commit --amend --author "name <[email protected]>" # change the author name and email
    
    $ git replace <old-commit-hash> <new-commit-hash>      # replace the old commit by new one
    $ git filter-branch -- --all                           # rewrite all futures commits based on the replacement                   
    
    $ git replace -d <old-commit-hash>     # remove the replacement for cleanliness 
    $ git Push -f Origin HEAD              # force Push 
    
  2. Другой способ Rebasing:

    $ git rebase -i <good-commit-hash>      # back to last good commit
    
    # Editor would open, replace 'pick' with 'edit' before the commit want to change author
    
    $ git commit --amend --author="author name <[email protected]>"  # change the author name & email
    
    # Save changes and exit the editor
    
    $ git rebase --continue                # finish the rebase
    
17
Sajib Khan

Я должен отметить, что если единственная проблема заключается в том, что автор/электронная почта отличается от вашего обычного, это не проблема. Правильное исправление заключается в создании файла с именем .mailmap в основании каталога с такими строками, как

Name you want <email you want> Name you don't want <email you don't want>

И с тех пор такие команды, как git shortlog, будут считать эти два имени одинаковыми (если вы специально не скажете им не делать этого). Смотрите http://schacon.github.com/git/git-shortlog.html для получения дополнительной информации.

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

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

16
asmeurer

Предположим, вы хотите сменить автора за последние N коммитов:

git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <[email protected]>' --no-edit"

ЗАМЕТКИ

  • флаг --no-edit гарантирует, что git commit --amend не запрашивает дополнительного подтверждения
  • когда вы используете git rebase -i, вы можете вручную выбрать коммиты, где сменить автора,

файл, который вы редактируете, будет выглядеть так:

pick 897fe9e simplify code a little
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick abb60f9 add new feature
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit
pick dc18f70 bugfix
exec git commit --amend --author 'Author Name <[email protected]>' --no-edit

Затем вы можете изменить некоторые строки, чтобы увидеть, где вы хотите сменить автора. Это дает вам хорошее промежуточное звено между автоматизацией и управлением: вы видите шаги, которые будут выполняться, и после сохранения все будет применено сразу.

10
Chris Maes

Если вы являетесь единственным пользователем этого хранилища, вы можете переписать историю , используя либо git filter-branch (как svick писал ), или git fast-export / git fast-import плюс сценарий фильтра (как описано в статье, на который ссылается ответ docgnome ), или интерактивный перебазироваться . Но любой из них изменил бы ревизии с первого измененного коммита и далее; это означает проблемы для любого, кто основывал свои изменения на предварительной ветке вашей ветки.

ВОССТАНОВЛЕНИЕ

Если бы другие разработчики не основывали свою работу на версии перед перезаписью, самым простым решением было бы переклонировать (снова клонировать).

В качестве альтернативы они могут попробовать git rebase --pull, который ускорил бы перемотку, если бы в их хранилище не было никаких изменений, или перебазировал их ветку поверх переписанных коммитов (мы хотим избежать слияния, поскольку это сохранит пре-переписанные комиты навсегда) , Все это при условии, что они не имеют работы; используйте git stash, чтобы скрыть изменения в противном случае.

Если другие разработчики используют функциональные ветви и/или git pull --rebase не работает, например поскольку восходящий поток не настроен, они должны rebase свою работу поверх коммитов после перезаписи. Например, сразу после извлечения новых изменений (git fetch) для ветви master, основанной на/разветвленном из Origin/master, нужно выполнить

$ git rebase --onto Origin/master Origin/[email protected]{1} master

Здесь Origin/[email protected]{1} - это состояние предварительной перезаписи (до выборки), см. gitrevisions .


Альтернативным решением будет использование refs/replace/ механизма, доступного в Git начиная с версии 1.6.5. В этом решении вы предоставляете замену для коммитов, которые имеют неправильный адрес электронной почты; тогда любой, кто получит ссылки "заменить" (что-то вроде fetch = +refs/replace/*:refs/replace/* refspec в соответствующем месте в их .git/config), получит прозрачные замены, а те, кто не выбирает эти ссылки, увидят старые коммиты.

Процедура идет примерно так:

  1. Найти все коммиты с неправильным адресом электронной почты, например, используя

    $ git log [email protected] --all
    
  2. Для каждого неправильного коммита создайте коммит замены и добавьте его в базу данных объектов.

    $ git cat-file -p <ID of wrong commit> | 
      sed -e 's/[email protected]\.email/[email protected]/g' > tmp.txt
    $ git hash-object -t commit -w tmp.txt
    <ID of corrected commit>
    
  3. Теперь, когда вы исправили коммит в объектной базе данных, вы должны указать git автоматически и прозрачно заменить неправильный коммит на исправленный с помощью команды git replace :

    $ git replace <ID of wrong commit> <ID of corrected commit>
    
  4. Наконец, перечислите все замены, чтобы проверить, успешно ли прошла эта процедура.

    $ git replace -l
    

    и проверьте, есть ли замены

    $ git log [email protected] --all
    

Конечно, вы можете автоматизировать эту процедуру ... ну, все, кроме использования git replace, который не имеет (пока) пакетного режима, поэтому вам придется использовать цикл Shell для этого или заменить "вручную".

НЕ ИСПЫТАНО! YMMV.

Обратите внимание, что при использовании механизма refs/replace/ вы можете столкнуться с некоторыми грубыми углами: он новый и еще не очень хорошо протестирован,.

9
Jakub Narębski

Если коммиты, которые вы хотите исправить, являются самыми последними и содержат только пару коммитов, вы можете использовать комбинацию git reset и git stash для повторного коммита после настройки правильного имени и адреса электронной почты.

Последовательность будет выглядеть примерно так (для 2-х неправильных коммитов нет ожидающих изменений):

git config user.name <good name>
git config user.email <good email>
git reset HEAD^
git stash
git reset HEAD^
git commit -a
git stash pop
git commit -a
6
djromero

Ваша проблема действительно распространена. Смотрите " Использование Mailmap для исправления списка авторов в Git "

Для простоты я создал скрипт для упрощения процесса: git-changemail

Поместив этот скрипт в свой путь, вы можете выполнить такие команды:

  • Изменить совпадения авторов в текущей ветке

    $ git changemail -a [email protected] -n newname -m [email protected]
    
  • Измените совпадения авторов и коммиттеров для <branch> и <branch2>. Передайте -f в фильтр-ветвь, чтобы разрешить перезапись резервных копий

    $ git changemail -b [email protected] -n newname -m [email protected] -- -f &lt;branch> &lt;branch2>
    
  • Показать существующих пользователей в репо

    $ git changemail --show-both
    

Кстати, после внесения изменений очистите резервную копию из ветви фильтра с помощью: git-backup-clean

5
albfan

Сегодня мы столкнулись с проблемой, когда символ UTF8 в имени автора вызывал проблемы на сервере сборки, поэтому нам пришлось переписать историю, чтобы исправить это. Предпринятые шаги:

Шаг 1: Измените свое имя пользователя в git для всех будущих коммитов, следуя инструкциям здесь: https://help.github.com/articles/setting-your-username-in-git/

Шаг 2: Запустите следующий скрипт bash:

#!/bin/sh

REPO_URL=ssh://path/to/your.git
REPO_DIR=rewrite.tmp

# Clone the repository
git clone ${REPO_URL} ${REPO_DIR}

# Change to the cloned repository
cd ${REPO_DIR}

# Checkout all the remote branches as local tracking branches
git branch --list -r Origin/* | cut -c10- | xargs -n1 git checkout

# Rewrite the history, use a system that will preseve the eol (or lack of in commit messages) - preferably Linux not OSX
git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
CORRECT_NAME="New Me"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$CORRECT_NAME"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$CORRECT_NAME"
fi
' --tag-name-filter cat -- --branches --tags

# Force Push the rewritten branches + tags to the remote
git Push -f

# Remove all knowledge that we did something
rm -rf ${REPO_DIR}

# Tell your colleagues to `git pull --rebase` on all their local remote tracking branches

Краткий обзор: извлеките свой репозиторий во временный файл, извлеките все удаленные ветви, запустите сценарий, который перезапишет историю, сделайте принудительное нажатие на новое состояние и скажите всем своим коллегам, чтобы получить изменения, чтобы получить изменения.

У нас были проблемы с запуском этого на OS X, потому что он как-то испортил окончания строк в сообщениях коммита, поэтому нам пришлось потом перезапускать его на машине Linux.

5
Miloš Ranđelović

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

Информация о коммитере не отображается в большинстве мест, но вы можете увидеть ее с помощью git log -1 --format=%cn,%ce (или использовать show вместо log для указания конкретного коммита).

Хотя смена автора вашего последнего коммита так же проста, как и git commit --amend --author "Author Name <[email protected]>", нет единой строки или аргумента для того, чтобы сделать то же самое с информацией о коммитере.

Решение состоит в том, чтобы (временно или нет) изменить вашу пользовательскую информацию, а затем изменить коммит, который обновит коммиттера до вашей текущей информации:

git config user.email [email protected] 
git commit --amend
5
Sir Athos

Самый быстрый и простой способ сделать это - использовать аргумент --exec в git rebase:

git rebase -i -p --exec 'git commit --amend --reset-author --no-edit'

Это создаст список задач, который выглядит следующим образом:

pick ef11092 Blah blah blah
exec git commit --amend --reset-author --no-edit
pick 52d6391 Blah bloh bloo
exec git commit --amend --reset-author --no-edit
pick 30ebbfe Blah bluh bleh
exec git commit --amend --reset-author --no-edit
...

и это будет работать все автоматически, что работает, когда у вас есть сотни коммитов.

5
Lie Ryan

Используя интерактивную перебазировку, вы можете поместить команду исправления после каждого коммита, который вы хотите изменить. Например:

pick a07cb86 Project tile template with full details and styling
x git commit --amend --reset-author -Chead
5
j16r

Если вы используете Eclipse с EGit, то есть довольно простое решение.
Предположение: у вас есть коммиты в локальной ветке 'local_master_user_x', которые нельзя отправить в удаленную ветку 'master' из-за недопустимого пользователя.

  1. Оформить заказ на удаленную ветку "Мастер"
  2. Выберите проекты/папки/файлы, для которых "local_master_user_x" содержит изменения
  3. Щелкните правой кнопкой мыши - Замените на - Ветвь - 'local_master_user_x'
  4. Подтвердите эти изменения снова, на этот раз как правильный пользователь и в локальную ветку 'master'
  5. Нажмите на удаленный "мастер"
5
paphko

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

Эта страница http://inputvalidation.blogspot.com/2008/08/how-to-change-git-commit-author.html описывает, как это сделать. (Я не пробовал это так, YMMV)

2
baudtack

Я тоже хочу добавить свой пример. Я хочу создать bash_function с заданным параметром.

это работает в Mint-Linux-17.3

# $1 => email to change, $2 => new_name, $3 => new E-Mail

function git_change_user_config_for_commit {

 # defaults
 WRONG_EMAIL=${1:-"[email protected]"}
 NEW_NAME=${2:-"your name"}
 NEW_EMAIL=${3:-"[email protected]"}

 git filter-branch -f --env-filter "
  if [ \$GIT_COMMITTER_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_COMMITTER_NAME='$NEW_NAME'
    export GIT_COMMITTER_EMAIL='$NEW_EMAIL'
  fi
  if [ \$GIT_AUTHOR_EMAIL = '$WRONG_EMAIL' ]; then
    export GIT_AUTHOR_NAME='$NEW_NAME'
    export GIT_AUTHOR_EMAIL='$NEW_EMAIL'
  fi
 " --tag-name-filter cat -- --branches --tags;
}
2
stephanfriedrich

Попробуйте это. Это будет сделано так же, как указано выше, но в интерактивном режиме.

bash <(curl -s  https://raw.githubusercontent.com/majdarbash/git-author-change-script/master/run.sh)

Ссылка: https://github.com/majdarbash/git-author-change-script

1
Majd Arbash
git rebase -i YOUR_FIRTS_COMMIT_SHA^

while true; do git commit --amend --author="Name Surname <[email protected]>" --no-edit && git rebase --continue; done

Нажмите ^ C # после завершения ребазирования (цикл будет обновлять последний коммит)

0
Vojtech Vitek