Сохранять 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, Но я не хотел добавлять файл в список исключений, поэтому я сделал следующее из своего каталога рабочего дерева:

  1. cp <local-only_file> ~/
    • скопировать файл, который содержит ваши локальные изменения, в безопасное место в файловой системе
  2. git checkout <local-only_file>
    • в рабочем дереве извлекайте файл, чтобы он соответствовал основному файлу ветки
  3. git update-index --skip-worktree -- <local-only_file>
  4. cp ~/<local-only_file> .
    • скопировать файл из безопасного места обратно в рабочее дерево
  5. git diff
    • не должно быть никаких изменений; если вы нажмете на основной репо, никаких изменений в <local-only_file> включены в толчок

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

Другие вопросы по тегам