Решение меркулярного фальцованного столкновения в Windows
Я видел другие ответные запросы Mercurial на StackOverflow - они говорят, что если у вас есть доступ к файловой системе, чувствительной к регистру, такой как unix, проверьте ее там, и она должна ее исправить. Проблема в том, что у меня нет доступа к блоку unix, я разработчик окон, разрабатывающий приложение для Windows.
Как исправить это без окна Unix?
Ответы
Ответ 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 после переименования