Hg Mercurial меняет адрес электронной почты на уже отправленный коммит - PullRequest
0 голосов
/ 03 июля 2018

На работе я использую свой рабочий адрес электронной почты при создании сообщений о коммитах, а дома я использую свою личную учетную запись для создания коммитов.
Я забыл изменить свой рабочий адрес электронной почты перед фиксацией и отправкой, а затем понял, что отправил коммит Merge со своим личным адресом электронной почты, и я хотел бы в основном изменить это сообщение о фиксации на свой рабочий адрес электронной почты.
В Git это очень легко, когда мне нужно сделать ребаз из определенного дочернего коммита, а затем принудительно нажать на него, и он прекрасно работает, но в Mercurial это кажется более ограниченным, и я почти уверен, что должен быть способ, Поскольку я видел много похожих вопросов в Stackoverflow, таких как внесение изменений в коммит, я также прочитал некоторые статьи, используя некоторые из известных расширений Mercurial, таких как: histedit, evolve и rebase.
Некоторые другие вещи, которые я пробовал, также не помогли:

  • Использование hgext.convert создает новый репозиторий, который мне не нужен и он также не смог завершиться в одном из моих наборов изменений.
  • Использование histedit приводит к ошибке, что он не может изменять публичные изменения.
  • Использование hgext.mq выдает ошибку, что не может импортировать слияние пересмотр.

Почему это так сложно в ртути?
Одна из статей, которые я также проверил:
https://book.mercurial -scm.org / read / change-history.html

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

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

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

Есть ли такой же способ, как в Git, чтобы в основном перебазировать с определенного коммита и принудительного толчка, чтобы я мог изменить свою электронную почту на свой рабочий адрес электронной почты?

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

РЕДАКТИРОВАТЬ 1:
Моя попытка воспроизвести его в общедоступном тестовом хранилище с внесенными изменениями на основе @DaveInCaz Solution, но не удалась:
Шаги:

// Updating to the wrong commit message.
hg update -r B

// Throwing all changes that has been made on the wrong commit.
hg strip B

// Re-creating the Merge again with the correct mail address.
hg merge new-feature

// Assuming now it creates revision B2
hg commit -m 'Merge'

// Pulling the changes again
hg pull

// Making the correct commits afterwards to be the children from B2 instead B.
hg rebase -s C -d B2

// Removing the old B
hg strip B

И теперь, конечно, если я попытаюсь hg push, я получу следующее abort: push creates new remote head.

1 Ответ

0 голосов
/ 03 июля 2018

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

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


Предположим, у вас есть следующая история:

A-B-C-D

где B - коммит с ошибкой.

Шаги:

  1. Обновление до A
  2. Вернуть локальные изменения так же, как B

    (например, в THG вы можете щелкнуть правой кнопкой мыши в истории и выбрать «Вернуть все файлы ...»)

  3. Устранить исходную проблему - т.е. правильно задать адрес электронной почты

  4. Commit. Теперь ваша история выглядит так:

    A-B-C-D \ B'

  5. Перебазировать C на B '(команда hg rebase ... - также THG имеет экраны для этого). Итак, теперь у вас есть:

    A-B \ B'-C-D

  6. Удалите оригинал B, используя hg strip (только ЛОКАЛЬНЫЙ клон)

    A-B'-C-D

  7. Удалите B, C и D на ВСЕХ ДРУГИХ КЛОНАХ, используя hg strip (1)

  8. Push


(1) Это возможно только в том случае, если у вас есть доступ к этим клонам и никто не совершил ничего после ревизии D. Или, если у них есть, вы можете отменить его или иным образом убрать его с пути .

Также будьте осторожны с strip, потому что это разрушительно.

...