2009-04-09 2 views
60

Я не установил имя пользователя на своем компьютере разработки и сделал несколько коммитов. Могу ли я ретроактивно изменить имя пользователя, чтобы было ясно, кто совершил эти изменения?Могу ли я изменить имя пользователя на Mercurial changeet?

+0

Ознакомьтесь со следующим документом. Существует немало недостатков, связанных с переписыванием истории, которая рассматривается в документе, поэтому она обычно не одобряется. Однако, похоже, это возможно. - [Редактирование истории] (http://www.selenic.com/mercurial/wiki/index.cgi/EditingHistory) –

ответ

75

Если вы не опубликовали свой репозиторий, тогда это не должно быть слишком сложно. Вы должны использовать Convert extension для Mercurial, что позволит вам «фильтровать» ваш существующий репозиторий для создания нового. переключатель --authors позволяет редактировать автора для каждого фиксации по мере его фильтрации.

Если у вас есть, опубликуйте ваш репозиторий, пожалуйста, подумайте о влиянии на ваших пользователей, у mercurial wiki есть reasons not to edit history.

Включить расширение, добавив следующие строки в ваш .hgrc:

[extensions] 
hgext.convert= 

Написать файл на карту старого названия на новое имя (authors.convert.list):

[email protected][email protected] 

Запустите преобразование:

hg convert --authors authors.convert.list SOURCE DEST 

Я только что проверил, это работает для меня :).

+0

Очень красивый и полный ответ. –

+0

@ Андрю Айлетт: как вы это проверили? «$ hg clone myWrongRep name», внесены изменения, а затем «$ hg convert --authors thefile myWrongLocalRep». Теперь он генерирует файл «.-Hg», и сайт говорит, что должно быть что-то с «статусом hg», но я ничего не могу найти (хотя есть. У меня был неверный авторский коммит с именем «hh», поэтому я создал строку «hh» = hhh ', но после нажатия, теперь меняются и после «$ hg update» и «$ hg push», никаких изменений. Что мне не хватает? – hhh

+0

Вы можете проверить авторов/проверить, работают ли команды с этой командой '$ hg log --template '{author} \ n' | less', еще не получил работу - не понимая authormap -thing. – hhh

11

Я пробовал несколько разных методов (включая Convert Extension, который я нашел, создал несвязанный репозиторий). Рекомендации Mercurial wiki для editing history using MQ были теми, которые я нашел наиболее полезными. (Есть, конечно, обычные предостережения о том, что всякая история является плохой идеей, но локальные изменения, которые только у вас есть, являются ОК для редактирования).

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

Включить MQ, добавив в $ HOME/.hg/hgrc

[extensions] 
hgext.mq= 

Преобразовать последние ревизии в пластырей:

$ hg qimport -r BAD:tip 

(Они теперь могут быть найдены в .hg/patches)

«Исключить» все патчи (предположим, что они были применены, и обратный их), чтобы получить ваше хранилище в состоянии ревизией перед BAD:

$ hg qpop -a 

Если вы посмотрите на ваши патчи, вам» увидят, что автор кодируются в своеобразной строке комментария во всех пластырях:

$ grep User .hg/patches/* 
.hg/patches/102.diff:# User Firstname Lastname <[email protected]> 

Теперь используйте ваш любимый поиск/замену инструмента для фиксации заплаты (я использую Perl здесь).Давайте предположим, что вы хотите, чтобы имя совершить быть [email protected]:

$ perl -pi -e 's/f\.lastname\@oops\.wrongurl\.example\.com/f.lastname\@righturl.example.com/' .hg/patches/*.diff 

Теперь убедитесь, что вы успешно изменили имя автора, и повторно применить патчи:

$ hg qpush -a 

Затем преобразовать примененные патчи в надлежащее changeets:

$ hg qfinish -a 

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

+0

Got «abort: не могу импортировать версию слияния [номер редакции] –

+1

Работал для меня. Однако мне пришлось изменить статус моих коммитов с« опубликованных »на« черновик ». – user2428118

+0

Перед закрытием нужно было использовать трейлинг-код'/' цитата, в противном случае команда 'perl' дала ошибку' замена замещения, не заканчивающаяся на -e строке 1'. В противном случае отлично, спасибо! – ederag

6

Я использовал расширение histedit, которое позволило мне изменить автора, не создавая новых репозиций, таких как «конвертировать», или прибегая к «mq».

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

[ui] 
username = Your Name <[email protected]> 

[extensions] 
histedit = 

Затем, если вы хотите изменить версию 40, используйте:

hg histedit -r 40 

В появившемся файле в строке, соответствующей ревизии 40, измените слово pick на номер edit. Сохраните и закройте файл.

Теперь, hg commit. Вам нужно будет повторно ввести сообщение о фиксации и сохранить его.

И наконец, hg histedit --continue.

Конец появится с вашим новым username. Кроме того, обновляется временная метка фиксации.

7

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

$ hg ci --amend --user "My Name <[email protected]>" -X "**" 

Опция -X "**" может быть опущена, если у вас нет каких-либо локальных изменений.

+0

Он сделал работайте! (Бог знает, что я только что делал :)) –

Смежные вопросы