Есть ли способ удалить историю одного файла в Mercurial?

StackOverflow https://stackoverflow.com/questions/1029480

  •  06-07-2019
  •  | 
  •  

Вопрос

Кажется, я уже знаю ответ на этот вопрос, но все равно спрошу:

У нас есть файл, добавленный в репозиторий Mercurial, с конфиденциальной информацией.Есть ли способ удалить этот файл вместе с его историей изменений, не удаляя весь репо?

Это было полезно?

Решение

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

  

Mercurial также не предоставляет способ   сделать файл или набор изменений полностью   исчезнуть из истории, потому что там   нет способа обеспечить его   исчезновение; кто-то мог легко   изменить их копию Mercurial для   игнорировать такие директивы. К тому же,   даже если Mercurial предоставил такой   способность, тот, кто просто не имел   вытащил & # 8220; чтобы этот файл исчез? & # 8221;   изменения не будут затронуты этим,   сканеры веб-сайтов, посещающие   неправильное время, резервное копирование диска или другое   механизмы. Действительно, нет распределенных   система контроля версий может делать данные   надежно исчезают. Предоставление   иллюзия такого контроля может легко   дать ложное чувство безопасности и быть   хуже, чем вообще не предоставлять.

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

Другие советы

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

Если это нормально для вас (внутренний репозиторий в компании), взгляните на конвертировать расширение . Это может сделать HG & # 8594; hg и имеет аргумент - filemap , который может использоваться, помимо прочего, для исключения файлов.

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

Тем не менее, я следовал последовательности редактирования истории , описанной в вики Mercurial. удалить файл из одного из моих репозиториев. В этой последовательности предполагается, что в редакции 1301: 5200a5a10d8b добавлен файл path / to / badfile.cfg , который не был изменен ни в одной из последующих ревизий:

<Ол>
  • Включите расширение MQ в своем .hgrc :

    [extensions]
    mq =
    
  • Извлекайте последние изменения из апстрима.

    hg pull
    
  • Импортируйте все, начиная с добавления файла, в MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  • Удалите файл из коммита, который его добавил.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  • Конвертируйте патчи в новые ревизии Mercurial.

    hg qpush -a
    hg qfinish -a
    
  • Выдвиньте новые редакции вверх по течению.

    hg push -f
    
  • В обратном хранилище и во всех остальных копиях удалите старые ревизии.

    hg strip 5200a5a10d8b
    
  • Предупреждение . Этот шаг может разрушить работу, если вы не будете осторожны. Если кто-то совершил что-либо с тех пор, как вы в последний раз вышли из апстрима, вам придется перебазировать эту работу, прежде чем убирать. К сожалению, расширение rebase здесь не поможет; вам придется снова использовать MQ, преобразовывая новые коммиты в патчи, которые вы применяете к новому совету.

    Удачи.

    Это можно сделать менее чем за 10 минут.в одном репозитории, хотя есть последствия.

    Как:используйте hg Convert, как описано в это превосходное руководство.По сути, вы «конвертируете» репозиторий Hg в новый репозиторий Hg, но вы можете указать список файлов, которые следует исключить во время преобразования.Это выдержка из ключевых шагов:

    Make sure all your teammates have pushed their local changes to the central repo (if any)
    Backup your repository
    Create a "map.txt" file:
    
    # this filemap is used to exclude specific files
    exclude "subdir/filename1.ext"
    exclude "subdir/filename2.ext"
    exclude "subdir2"
    
    Run this command:
    hg convert --filemap map.txt c:/oldrepo c:/newrepo
    NOTE: You have to use "forward-slash" in paths, even on windows.
    Wait and be patient
    Now you have a new repo at c:\newrepo but without the files
    

    Что касается последствий...

    • все идентификаторы набора изменений после добавления файлов, которые вы хотите исключить, будут другими
    • новый «чистый» основной репозиторий придется вручную поставить вместо существующего
    • всем членам команды придется сделать новые клоны основного репо
    • любые другие службы, которые интегрируются с Hg, могут потребовать внимания (например,система отслеживания ошибок, система проверки кода и т. д.)

    трансплантация ртути, затем полоска ртути

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top