Mercurial, остановите версионную директорию кеша, но сохраните директорию - PullRequest
4 голосов
/ 08 февраля 2011

У меня есть проект CakePHP под управлением версией Mercurial.Сейчас все файлы в каталоге app/tmp имеют версии, которые постоянно меняются.

Я не хочу управлять версиями этих файлов.

Я знаю, что могу остановиться, запустив hg forget app/tmp/*

Но это также забудет структуру файла.Который я хочу сохранить.

Теперь я знаю, что Mercurial не создает версии каталогов, а только файлы, но люди из CakePHP также были достаточно умны, чтобы помещать пустой файл с именем empty в каждую пустую директорию (я думаю, по этой причине).

Итак, я хочу сказать Mercurial забыть все файлы в app/tmp, за исключением файлов, чье имя точно пусто .

Какой будет команда для этого

Ответы [ 4 ]

3 голосов
/ 08 февраля 2011

Что ж, если больше ничего не работает, вы всегда можете просто попросить Mercurial забыть обо всем, а затем вернуть empty перед совершением:

Вот как я воспроизвел это, сначала создайте начальный репо:

hg init
md app
md app\tmp
echo a>app\empty
echo a>app\tmp\empty
hg commit -m "initial" -A

Затем добавьте некоторые файлы, от которых мы позже хотим избавиться:

echo a >app\tmp\test1.txt
echo a >app\tmp\test2.txt
hg commit -m "adding" -A

Затем забудьте файлы, которые нам не нужны:

hg forget app\tmp\*
hg status                     <-- will show all 3 files
hg revert app\tmp\empty
hg status                     <-- now empty is gone
echo glob:app/tmp>.hgignore
hg commit -m "ignored" -A

Обратите внимание, что все .hgignore делает, чтобы Mercurial не обнаруживал новые файлы во время addremove или commit -A. Если вы явно отслеживали файлы, которые соответствуют вашему фильтру игнорирования, Mercurial все равно будет отслеживать изменения в этих файлах.

Другими словами,даже если я попросил Mercurial проигнорировать app/tmp выше, файл empty внутри не будет проигнорирован или удален, поскольку я явно попросил Mercurial отследить его.

3 голосов
/ 08 февраля 2011

По крайней мере теоретически (у меня нет времени, чтобы попробовать это прямо сейчас), сопоставление с образцом должно работать с командой hg forget.Таким образом, вы можете сделать что-то вроде hg forget -X empty, находясь в каталоге (-X означает «исключить»).

Конечно, вы можете рассмотреть возможность использования .hgignore.

2 голосов
/ 08 февраля 2011

Поскольку вам нужно сделать это только один раз, я просто сделаю это:

find app/tmp -type f | grep -v empty | xargs hg forget
hg commit

с тех пор просто поместите это в ваш `.hgignore '

^app/tmp
0 голосов
/ 09 февраля 2011

Mercurial имеет встроенную поддержку для подстановки и регулярных выражений, как объясняется в соответствующей главе в книге по ртути. Используется реализация python regex .

Это должно работать для вас:

hg forget "re:app/tmp/.*(?<!/empty)$"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...