Подтвердить что ты не робот

Решение меркулярного фальцованного столкновения в Windows

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

Как исправить это без окна Unix?

4b9b3361

Ответ 1

Существует раздел справки filesystem, который будет включен в следующую версию Mercurial:

https://www.mercurial-scm.org/pipermail/mercurial-devel/2012-April/039522.html

Переименование сталкивающихся файлов

О нечувствительных к регистру файловых системах, обновляя версии, которые имеют файлы с случайными столкновениями будут прерваны, даже с --check или --clean.

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

.. note::    Если вы хотите (или должны) просматривать или восстанавливать такие    изменений в файловых системах без учета регистра, см. "Обновление    вручную".

Если: hg: merge отменено, но: hg: update --check для каждого успехи в пересмотрах, возникает столкновение между версией, подлежащей объединению.

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

С недавним Mercurial вы можете безопасно изменить файл с именем файла ниже, даже в файловых системах без учета регистра::

$ hg rename a.txt tmp
$ hg rename tmp A.TXT

Обновление вручную

Если вы хотите (или нужно) обновить рабочий каталог с помощью пересмотр, вызвавший случайное сгибание столкновений на нечувствительном к регистру файловых систем, переименовать встречные файлы или просмотр содержимого на таких например, перейдите на страницу Wiki ниже:

https://www.mercurial-scm.org/wiki/ManualCheckout

Это НЕ рекомендуется для пользователей, не являющихся экспертами Mercurial.

Описан другой аналогичный ручной метод:

https://www.mercurial-scm.org/wiki/FixingCaseCollisions

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

Ответ 2

Мы разрешили это, не прибегая к файловой системе, чувствительной к регистру, путем выдачи команд переименования HG. У вас возникли проблемы, потому что "Foo.txt" нужно называть "foo.txt":

hg rename Foo.txt Foo.txt.renamed
hg rename Foo.txt.renamed foo.txt

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

Ответ 3

Чтобы получить проблему с фальцованием случаев в окнах, я предполагаю, что у вас разные случаи в разных ветвях или головах в репо, и это становится проблемой при слиянии. Я не вижу, как (в Windows) вы фактически получите два разных случая в одной и той же ревизии, не перейдя через окно unix.

Итак, если они находятся в разных версиях, вы можете сделать что-то вроде этого:

hg update <some rev>
hg remove -A -f "Some File"

то слияние будет успешным. -A для "after", а -f будет "принудительно".

Ответ 4

Своя регулярная проблема в Windows для использования файловых систем с учетом регистра. Если вы хотите сделать это с помощью TortoiseHg Workbench, выполните поиск файла и переименуйте его:

щелкните правой кнопкой мыши/TortoiseHg/переименуйте файл

Он переименует файл в нужное вам имя, чувствительное к регистру. На следующем рисунке показано, как я изменил XMLConverter на XMLConverter

enter image description here

Затем в Workbench вы можете зафиксировать изменение файла:

enter image description here

Это обновление было обновлено через неделю

Представленное решение может вызвать проблемы при обновлении всего репозитория с другого ПК. Таким образом, окончательный способ разрешить его, возможно, составляет 2 фиксации:

  • Один для переименования файлов с нежелательным именем на временный. Пример: XMLConverter2
  • Другое для переименования временных файлов в новые имена. Пример: XmlConverter

Так получилось вот так:

renaming the temporary files to the new names

Это фактически то, как он больше не конфликтует с Windows. Он выглядит уродливым, но он эффективен.

Ответ 5

Если вы используете Bitbucket.org, вы можете просмотреть источник в ветке проблем, перейти к файлу, щелкнуть по нему, отредактировать, переименовать файл (или в нашем случае переименовать каталог), совершить эти изменения и потянуть,

Спасибо команде Bitbucket!

Ответ 6

У меня была эта проблема, но использование системы * nix не было вариантом. Я смог разрешить это после этих инструкций.


В Windows в настоящий момент (до Mercurial 1.1) можно ввести случайные конфликты в репо, которые не позволяют вам проверять репозиторий.

Один из способов восстановления такого репозитория - проверить его на чувствительной к регистру системе Unix, удалить проблемный файл и выполнить его еще раз.

Если это невозможно, вы можете сделать следующее:

hg clone --noupdate repo repair
cd repair
hg debugsetparents <bad revision>
hg debugrebuildstate

В этот момент Mercurial подумает, что у вас есть исправленная ревизия, и все файлы отсутствуют (статус "!" ). Чтобы исправить репо, нам просто нужно сделать:

hg remove --after <file causing the collision>

Теперь статус hg должен показывать неприятный файл в состоянии "R" и все остальные файлы в состоянии "!". Теперь мы можем проверить наше исправление:

hg commit --message "fix case collision"

Чтобы вернуть все наши файлы, мы просто снова проверяем:

hg update tip

Ссылка: https://www.mercurial-scm.org/pipermail/mercurial/2008-June/019921.html

Ответ 7

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

Я использовал для Windows bash оболочку Windows 10 для решения этой проблемы lxrun /install, а затем, когда это была настройка, я установил mercurial sudo apt-get install mercurial. Это даст вам доступ к вашей файловой системе через папку mnt, и вы можете использовать mercurial из командной строки.

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

Ответ 8

Как сказала Лоренс Хольст, для меня работала переименование папки/файла, проходящего через временную файловую систему.

$ hg rename a.txt tmp
$ hg rename tmp A.TXT

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