2011-01-04 2 views
11

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

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-сервера. Поэтому, чтобы получить свой набор изменений, я должен экспортировать его в виде патча и передать его сторонним разработчикам.

+1

Как об обновлении обратно в ревизией патч был построен для, применяя его, совершая его, а затем слияние его с головой? –

+0

@ Lasse благодарит за предложение. Я попробую и отправлю отчет. Это может стоить опубликовать в качестве ответа, так что легче поднять – greatwolf

ответ

13

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

Других слов, это звучит, как у вас есть следующий случай:

    +-- 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--------/ 

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

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

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

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

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

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

+0

благодаря полной записи. Обновление моей головы до более раннего набора перед применением патча доставило мне большую часть пути. +1 для видео, это было очень полезно и сделало некоторые вещи более ясными. Думаю, я дам этому методу forking попробовать на битбакете. – greatwolf

+0

* «Эй, у меня есть некоторые изменения для вас, вы можете вытащить их из моего клона здесь: http: // ...». * Не удается ли получить URL-адрес моего репо? Наверное, я могу загрузить его на сервер, на котором основное репо. – Noumenon

+0

Чтобы «вытащить» откуда-нибудь с URL-адресом, вам нужно где-то разместить ваш репозиторий. Вы можете разместить их локально с помощью 'hg serve', но тогда вам, вероятно, придется иметь дело с локальными IP-адресами, брандмауэрами и портами и т. Д. –

0

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

[patch] 
eol = auto 
+0

Это также случилось со мной, когда Outlook решил удалить« лишние »строки из моего исправленного по электронной почте патча. Нажатие на функцию восстановления сработало. – Noumenon

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