GitTip: пропустить WorkTree
Этот совет прост и силен в равных частях. Мы хотим добиться изменения локального файла, который git не может идентифицировать как измененный, несмотря на то, что он уже отслежен. Для этого примера у меня есть файл «config.txt» с содержанием: «секрет». Этот файл хорошо работает во всех средах, но в локальной среде мне нужно изменить его для тестирования. Нет проблем: он изменен, проведены соответствующие тесты, он отменен и загружен.
Проблема возникает, когда этот файл, по разным причинам, должен быть изменен в вашей локальной среде и должен работать без загрузки, чтобы избежать влияния на другие файлы. Как мы можем сделать это?
Вы также можете насладиться: ретроспектива Git 2016: Worktrees
Мой коллега из Apiumhub (спасибо Альваро Гарсии ) рассказал мне о команде git update-index –assume-unchanged
, и я должен сказать, что она сделала то, что мне было нужно. Это позволило мне изменить файл в локальной среде, а git не обнаружил его, поэтому я мог продолжать вносить изменения в другие файлы и фиксировать файлы с моим любимым, git add
не беспокоясь ни о чем.
На следующем изображении мы можем видеть, как работает git status
показывает нам два файла, config.txt и otrofichero.sh. Как мы уже говорили, мы не хотим загружать config.txt, это изменение в локальной среде, и мы не хотим беспокоиться об этом. После запуска команды update-index
файл config.txt исчезает из рабочей области.
Файл все еще существует, и git не собирается его обновлять, если не произойдут две вещи:
- Ручная деактивация бита, которым мы пометили этот файл (предположим, без изменений)
- Вытащить и изменить этот файл через апстрим
Перед этим последним сценарием, в котором мы беспокоимся о файле, мы должны просмотреть каждый запрос, чтобы увидеть, был ли бит удален или нет командой git ls-files -v
:
Здесь мы видим, что config.txt помечен строчной буквой «h», а otrofichero.sh — буквой «H» в верхнем регистре. Эта буква представляет разницу между файлом, кэшированным git, и другим файлом, который не является.
Короче говоря, эта команда не работает для нашего варианта использования. Основываясь на документации, эта команда помечает большие файлы как «не кэшированные» и повышает нашу производительность с помощью git. Если мы хотим, чтобы git не просматривал конкретный файл, мы ищем следующий вариант –skip-worktree
:
Я не буду вдаваться в подробности, так как этот последний вариант похож assume-change
, но он сохраняет флаг до того, как потянет. Assume-change
следует использовать для больших файлов, отслеживаемых git, таких как SDK и т. д., в то время как skip-worktree больше соответствует изменениям конфигурации для тестов локальной среды, поэтому не нужно беспокоиться о загрузке их в наш удаленный репозиторий.
Сказав это, здесь очень полезные псевдонимы git, связанные со статьей. Имя самого псевдонима определяет действие, которое он выполняет:
Оболочка
1
[alias]
2
hide = update-index –skip-worktree
3
unhide = update-index –no-skip-worktree
4
unhide-all = ls-files -v | grep -i ^S | cut -c 3- | xargs git update-index
5
–no-skip-worktree
6
hidden = ! git ls-files -v | grep ‘^S’ | cut -c3-
Дальнейшее чтение
Отслеживание прав доступа к файлам в Git