Дополнительно
Как изменить имя автора и коммиттера и e-mail нескольких коммитов в Git?
Я писал простой скрипт на школьном компьютере и фиксировал изменения в Git (в репозитории, который находился на моем pendrive, клонированном с моего домашнего компьютера). После нескольких фиксаций я понял, что фиксирую изменения как пользователь root.
Есть ли способ изменить автора этих коммитов на мое имя?
2267
20
С Использованием Интерактивной Перебазирования
Вы могли бы сделать
Затем Марк все свои плохие совершает как "редактировать" в перебазировать файл. Если вы также хотите изменить свой первый коммит, вы должны вручную добавить его в качестве первой линии в переместить файл (формат других линий). Потом, когда ГИТ просит вас внести изменения каждого коммита, сделать
редактировать или просто закрыть редактор, который открывает, а потом делать
продолжить перебазироваться.
Вы могли бы пропускать отверстия здесь редакторе, добавляя
- нет-редактирование
так что команда будет:Один Коммит
Как некоторые комментаторы уже отметили, если вы просто хотите изменить последней фиксации, команда перебазироваться не надо. Вобще
Это позволит изменить автора на имя, указанное, но комиссия будет установлена на ваш настроенного пользователя в ГИТ конфигурации пользователя.имя
и
Git для пользователей конфигурации.электронной почты`. Если вы хотите установить коммиттер на что-то указать, это позволит установить автора и исполнителя:Обратите внимание на слияния коммитов
Был небольшой изъян в мой оригинальный ответ. Если есть какие-то коммитов слияния между текущим
голова
и свой<некоторые головы, прежде чем все ваши плохие совершает>
, затемGit для перебазирования
будет расплющить (и кстати, если вы используете GitHub запросы тянуть, там будет куча коммитов слияния в вашей истории). Это может очень часто привести к очень разную историю (как повторяющиеся изменения могут быть "перебазированы из"), и в худшем случае, это может привести кGit для перебазирования
прошу Вас разрешить сложные конфликты слияния (которые скорее всего уже решен в коммитов слияния). Решение: использовать флаг-п
вGit для перебазирования
, которая позволит сохранить структуру слияния вашей истории. На странице справочникаGit для перебазирования
предупреждает, что, используя-P
ия
может привести к проблемам, но в разделебаги
он пишет "редактирования коммитов и переформулировать их сообщения должны нормально работать&.и"Я'вэ добавил
-п
В приведенной выше команде. Для случая, когда вы're просто изменение самой последней фиксации, это не проблема.Изменение автора (или коммиттера) потребует переписывания всей истории. Если вы не против этого и считаете, что это того стоит, то вам стоит ознакомиться с git filter-branch. На странице man есть несколько примеров для начала работы. Также обратите внимание, что вы можете использовать переменные окружения для изменения имени автора, коммиттера, даты и т.д. -- см. раздел "Переменные окружения" на странице git man page.
В частности, вы можете исправить все неправильные имена авторов и электронные адреса для всех веток и тегов с помощью этой команды (источник: GitHub help):
Вы также можете:
Обратите внимание, если вы используете эту команду в командной строке Windows, то вам нужно использовать
"
вместо'
:Один лайнер, но будьте осторожны, если у вас многопользовательский репозиторий - это изменит все коммиты, чтобы они имели одного и того же (нового) автора и коммиттера.
С разрывами строк в строке (что возможно в bash):
Это происходит, когда у вас нет $дома/.gitconfig хранит настройки инициализации. Вы можете исправить это:
протестировано с версий Git 1.7.5.4
На один коммит:
(извлечено из asmeurer'ы ответ)
В том случае, когда только несколько топ совершает плохие авторы, Вы можете выполнить Git это все внутри
перебазировать -я
с помощью командыметод Exec
и `--изменить-дерзайте, следующим образом:что представлена вам с редактируемый список коммитов:
Затем добавить
метод exec ... --автор=" от..."
в строках после всех строк с плохой авторов:сохраните и выйдите из редактора (для запуска).
Такое решение может быть дольше, чем некоторые другие, но это'ы очень управляема - я точно знаю, что совершает его хиты.
Спасибо @asmeurer для вдохновения.
GitHub есть простое решение, которое является следующий сценарий:
Как docgnome отметил, переписывание истории-это опасно и будут ломать других людей'с репозиториев.
Но если вы действительно хотите сделать это, и вы находитесь в bash среды (никаких проблем в Linux, в Windows, вы можете использовать git Баш, который предоставляется при установке ЖКТ), использовать в Git фильтр-ветвь:
Чтобы ускорить процесс, вы можете указать диапазон изменения вы хотите переписать:
При заступлении необъединенное совершить от другого автора, есть легкий способ справиться с этим.
`коммитов --изменения --сброс автора
Вы можете использовать это в качестве псевдоним так что вы можете сделать:
или за последние 10 коммитов:
Добавить в ~/.gitconfig хранит настройки:
Источник: https://github.com/brauliobo/gitconfig/blob/master/configs/.gitconfig
Надеюсь, что это полезно.
Это более разработанная версия @Брайан's версии:
Чтобы изменить автором и коммитером, вы можете сделать это (с разрывом строк в строки, которые можно в bash):
Вы можете сделать одну из этих ошибок:
Если вы хотите заставить работать несмотря на эти ошибки, добавить
- сила
флаг:Небольшое пояснение `-- --все может быть нужно: это делает фильтр-филиала работать на всех редакций на все рефы (включая все филиалы). Это означает, например, что теги-это также переписан и видна на переписать филиалы.
В общем-то "ошибку" это использовать
голова
, что означает фильтрацию всех редакций на просто ветки. И тогда никакие теги (или другие ссылки) будет существовать в измененном филиала.git перебазирования -я <SHA1 или Реф отправная точка>
в Git коммит --изменения --повторное использование-сообщение=глава --автор="по-новому автор <new@author.email>"
в ; `Git для перебазирования --продолжитьЭто будет держать все другие фиксации информации (включая даты). В `--повторное использование-сообщения параметр=голова мешает редактора сообщений от запуска.
Я использую следующие действия, чтобы переписать автора для всего репозитория, включая теги и все филиалы:
Затем, как описано в man-страницы фильтра-филиала, Все ссылки подкрепленные
фильтр-филиал
(это губительный, сначала сделайте резервную копию):Я адаптировал это решение, которая работает путем проглатывания простой автор-сопу-файл (формат тот же, что и для с Git-cvsimport). Она работает путем изменения всех пользователей, как определено в `автор-сопу-файл по всем отраслям.
Мы использовали это в сочетании с
cvs2git
чтобы перенести наш репозиторий с CVS на Git.т. е. образец
автор-сопу-файл
Сценарий:
А одна команда изменить автора за последние N коммитов:
Примечания
--no-изменить флаг
гарантируетв Git коммит --изменить
не'т задать дополнительные подтвержденияфайл редактирования будет выглядеть следующим образом:
Тогда еще можно изменить несколько строк, чтобы увидеть, где вы хотите изменить автора. Это дает вам отличное компромиссное решение между автоматика и управление: вы видите действия, которые будут выполняться и после того, как вы сохраните все будут применены одновременно.
Я обнаружил, представлены версии как для агрессивной, особенно если вы совершаете патчи от других разработчиков, эта, по сути, украсть их код.
Ниже версия работает на все ветви и изменения, автор и comitter отдельно, чтобы предотвратить это.
Престижность leif81 для всех вариант.
; по электронной почте
поизменить
, то замена старого фиксации с новыми-один`:ГИТ кассе $ <фиксации хэш - > # извлечение для фиксации нужно изменить $ коммитов --изменения --автор "имя author@email.com" и # изменить имя автора и адрес электронной почты
$ git будет заменить на <старая фиксации-хэш> <новое фиксации-хэш> # заменить старый коммит новый фильтр-филиала $ ЖКТ -- --все # переписать все фьючерсы совершает на основе замены
$ Git на замену -д <старая фиксации-хэш> # снимите замена для чистоты $ Git с пуш-Ф происхождения глава # толчок силы
перебазировка
:$ Git для перебазирования -я <хорошей фиксации-хэш> # вернуться к последней удачной фиксации
Редактор откроет, заменить 'выбор' с 'редактировать' перед фиксацией хотите изменить автора
$ коммитов --изменить --автор="у автора имя author@email.com" и # изменить имя автора & электронная почта
Сохранить изменения и выйти из редактора
$ Git для перебазирования --продолжение # закончить перебазироваться
Я должен отметить, что если проблема только в том, что автор/электронной почты отличается от обычного, это не проблема. Правильным решением является создание файл с названием `.mailmap на базе каталога с линиями как
Если вы являетесь единственным пользователем этого репозитория, вы можете переписать историю используя [
в Git фильтр-ветвь
][в Git фильтр-ветвь] (как svick писал), илиГИТ фаст-экспорт
/ГИТ фаст-импорт
плюс фильтр скрипт (как описано в статье, на которую ссылается в docgnome ответить), или интерактивные смещение. Но ни один из этих бы изменить ревизии из первых изменил совершить года; это означает, проблема для кого что на основе его/ее изменения на вашей ветке предварительно переписать.Восстановление
Если другие разработчики не'т основывают свою работу на предварительно переписать версию, простейшим решением было бы заново-клон (опять же клон).
В качестве альтернативы они могут попробовать
ГИТ тянуть --перебазировать, которые бы вперед, если бы'т-либо изменения в свой репозиторий, или перебазировать свои ветви поверх переписать совершает (мы хотим избежать слияния, так как он будет держать предварительно переписать comits навсегда). Все это при условии, что они не имеют не поручено работать; используйте заначка ГИТ
, чтобы спрятать изменения в противном случае.Если другие разработчики используют функцию филиалы, и/или
ГИТ тянуть --перебазировать
не'т работу, например, потому что против течения не установлено, что они [перебазировка][в git-rebase и] свою работу на пост-переписать совершает. Например, сразу после извлечения новых изменений (Git для выборки
), на мастер-ветке основе / раздвоенной отпроисхождения/мастер
, один должен работатьЗдесь
происхождения/мастер@{1}
предварительно переписать государства (до выборки), см. gitrevisions.Альтернативным решением могло бы быть использование рефов/заменить/ механизм доступен в Git начиная с версии 1.6.5. В этом решении вам выдадут дубликат для коммиты, которые имеют неправильный электронный адрес; затем, кто выбирает 'заменить' ссылки (что-то вроде
выборка = +рефы/заменить/*:рефы/заменить/*
refspec в соответствующем месте в их.в git/config файл
) будет сделать замены прозрачно, и те, кто не извлечет эти рефов увидеть старых коммитов.Процедура проходит примерно так:
$ ГИТ лог --author=user@wrong.email -все
$ ЖКТ кота-файл -Р <идентификатор неверной фиксации> | СЭД -э 's/user@wrong.email/user@example.com/g' > tmp.txt $ Git с хэш-объект -Т совершить -з tmp.txt <код исправлены фиксации>
заменить на Git
команда:ЖКТ $ заменить на <идентификатор неверной фиксации> <идентификатор исправлены фиксации>
$ Git на замену -л
и проверить, если замены происходят
$ ГИТ лог --author=user@wrong.email -все
Можно конечно автоматизировать эту процедуру... ну, все, кроме, используя
ГИТ заменить
, который не'т иметь (еще) пакетном режиме, так что вам придется использовать Shell петля Для то или замены "под рукой".НЕ ПРОВЕРЯЛ! YMMV.
<суп>обратите внимание, что вы можете столкнуться с некоторыми грубых углов при использовании ссылок/заменить механизм/`: он новый, и еще не очень хорошо проверены на</SUP-серфинг>.