Сохранять git --assume-неизмененные файлы между проверками ветвей
Я использую git --assume-unchanged yacs/settings/development.py
игнорировать мой локальный файл конфигурации базы данных в моей ветке dev. Но когда я хочу переключить ветки (для развертываний), я получаю ошибку, что у меня все еще есть ожидающие изменения:
% git checkout production
error: Your local changes to the following files would be overwritten by checkout:
yacs/settings/development.py
Please, commit your changes or stash them before you can switch branches.
Aborting
Что раздражает. Единственный способ, которым я знаю, как обойти это, было бы спрятать это:
% git stash
% git checkout production
% git merge dev
% ./deploy.sh
% git checkout dev
% git stash pop
# On branch dev
# Changes not staged for commit:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: yacs/settings/development.py
#
Но теперь он снова в индексе (тьфу)! Есть ли лучшая альтернатива этому рабочему процессу?
[Меня не особо волнует, остаются ли локальные изменения локально (иначе, все в порядке, если это производственная ветвь), я просто не хочу, чтобы они были перенесены в удаленный репозиторий.]
4 ответа
Вы можете попробовать ( git update-index man page):
git update-index --skip-worktree -- path
Бит Skip-worktree может быть определен в одном (длинном) предложении: если при чтении записи она помечается как skip-worktree, то Git делает вид, что версия его рабочего каталога актуальна, и вместо этого читает индексную версию.
Однако, как упомянуто в " git предположить, что без изменений по сравнению с пропустить рабочее дерево":
У обоих вариантов есть проблемы.
--assume-unchanged
сбрасывает себя всякий раз, когда индекс удаляется (например,git reset
), так что, вероятно, рано или поздно это вас сбьет с толку. То же самое касается--skip-worktree
,
То, что я начал делать, - это создание ветки от master, называемой private, с моими локальными изменениями; думайте об этом как о прокси-ветке между моей рабочей веткой и мастером. Я могу изменить текущую рабочую ветвь на частную, когда мне нужны локальные изменения, и у меня есть несколько псевдонимов в моем.gitconfig, которые автоматизируют поддержание приватности в актуальном состоянии с master. Когда мне нужно объединиться с мастером, мои псевдонимы не забудьте перебазировать --onto master для моей рабочей ветки.
Более подробно я разместил запись в блоге здесь http://blog.ericwoodruff.me/2013/02/git-private-branch-pattern.html
Решение, которое работало для меня, состояло в том, чтобы использовать --skip-worktree. Однако, как и некоторые выше, я изо всех сил пытался переключаться между веткой с тикетами и основной веткой без всяких жалоб, даже после того, как я установил флаг --skip-worktree для файла, изменения которого я хотел оставить локальным.
Похоже, вы столкнетесь с этой проблемой, если внесете изменения в локальный файл перед запуском --skip-worktree, что и случилось со мной.
Один из предложенных способов решения этой проблемы - добавить файл в your_repo/.git/info/exclude
, Но я не хотел добавлять файл в список исключений, поэтому я сделал следующее из своего каталога рабочего дерева:
cp <local-only_file> ~/
- скопировать файл, который содержит ваши локальные изменения, в безопасное место в файловой системе
git checkout <local-only_file>
- в рабочем дереве извлекайте файл, чтобы он соответствовал основному файлу ветки
git update-index --skip-worktree -- <local-only_file>
cp ~/<local-only_file> .
- скопировать файл из безопасного места обратно в рабочее дерево
git diff
- не должно быть никаких изменений; если вы нажмете на основной репо, никаких изменений в
<local-only_file>
включены в толчок
- не должно быть никаких изменений; если вы нажмете на основной репо, никаких изменений в
Эта проблема возникает, когда пропущенный файл не совпадает с файлом в ветви, которую вы пытаетесь оформить, или файлом, который вы пытаетесь извлечь.