Есть ли способ удалить историю для одного файла в Mercurial? - программирование
Подтвердить что ты не робот

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

Я думаю, что я уже знаю ответ на этот вопрос, но думал, что все равно спрошу:

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Если это нормально для вас (внутренний репозиторий в компании), взгляните на convert extension. Он может выполнять преобразования hg → hg и имеет аргумент - filemap, который может быть использован, в частности, для исключать файлы.

Ответ 3

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

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

Удачи.

Ответ 4

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

Ответ 5

hg трансплантат, затем полоса hg