Что делать при сбое патча для импорта Mercurial? - PullRequest
11 голосов
/ 04 января 2011

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

applying G:\OSS\premake-dev\premake-dev_rev493.patch
unable to find 'src/host/scripts.c' for patching
3 out of 3 hunks FAILED -- saving rejects to file src/host/scripts.c.rej
patching file src/base/api.lua
patching file src/host/scripts.c
patching file src/tools/bcc.lua
file tests/test_bcc.lua already exists
1 out of 1 hunks FAILED -- saving rejects to file tests/test_bcc.lua.rej
patching file tests/premake4.lua
patching file tests/test_bcc.lua
abort: patch failed to apply

[command interrupted]

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

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

Ответы [ 2 ]

13 голосов
/ 04 января 2011

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

Другими словами, похоже, что у вас есть следующий случай:

                    +-- you're here
                    |
                    v
1---2---3---4---5---6
     \
      \
       X <-- patch was built to change 2 to X

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

После этих действий хранилище должно выглядеть так:

                        +-- you're here
                        |
                        v
1---2---3---4---5---6---8
     \                 /
      \               /
       7-------------/
       ^
       |
       +-- this is the changeset you committed after applying the patch

Теперь по другому.

Является ли использование патча единственным способом? Один из распространенных способов использования Mercurial заключается в том, что вы настраиваете свой собственный репозиторий, форк, изначально содержащий полный клон центрального репозитория, но у вас есть доступ для фиксации.

Таким образом, вы можете зафиксировать свои новые наборы изменений в своем собственном клоне.

Если в центральном хранилище добавлены новые наборы изменений после вашего клона, в какой-то момент вы извлекаете его из своего клона и объединяетесь.

Затем, когда вы удовлетворены, вы отправляете запрос на извлечение для сопровождающих центрального репозитория, говоря им: «Эй, у меня есть некоторые изменения для вас, вы можете извлечь их из моего клона здесь: http: //. .. ".

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

Это будет означать, что у вас есть два таких хранилища:

central: 1--2

clone:   1--2

Вы добавляете свою работу:

central: 1--2

clone:   1--2--3

Они добавляют несколько наборов изменений:

central: 1--2--3--4--5--6

clone:   1--2--3

Тогда вы тянете:

central: 1--2--3--4--5--6

clone:   1--2--4--5--6--7
             \
              \
               3  <-- this is your changeset

Тогда вы сливаетесь:

central: 1--2--3--4--5--6

clone:   1--2--4--5--6--7--8
             \            /
              \          /
               3--------/

Если сопровождающие теперь отстраняются от вас, они получают ту же историю в своем хранилище.

Существует также некоторая поддержка для перебазирования, что означает, что вам не нужно тянуть и объединять, но сопровождающие будут выдавать команду «вытягивать с ребазой», в результате чего ваш набор изменений из текущей позиции переместится в новую позицию. в их хранилище это будет выглядеть так:

central: 1--2--3--4--5--6---7
                            ^
clone:   1--2--3            |  relocated here
               |            |
               +------------+

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

Для получения дополнительной информации о разветвлении, посмотрите видео Tekpub о CodePlex и Mercurial, здесь: Tekpub: 7 - Mercurial С CodePlex , ищите около 21:15 для начала разветвления.

Обратите внимание, что "форк" - это просто клон, способ разветвления работает в CodePlex, это то, что он автоматизирует настройку клона на вашей собственной учетной записи и отправляет оригинальным сопровождающим запрос на извлечение, но если вы создаете свою собственную учетную запись в Bitbucket или CodePlex или где-либо еще, опубликуйте там свой клон и просто отправьте сопровождающим письмо по электронной почте с вашим URL-адресом хранилища, и это все, что нужно.

2 голосов
/ 10 января 2016

В моем случае мой неудачный импорт hg был связан с окончанием строки.Решением было поместить это в мой ~ / .hgrc файл:

[patch]
eol = auto
...