Сохранять git --assume-неизмененные файлы между проверками ветвей - PullRequest
36 голосов
/ 22 марта 2012

Я использовал git --assume-unchanged yacs/settings/development.py, чтобы игнорировать файл конфигурации локальной базы данных в моей ветке разработчика.Но когда я хочу переключить ветви (для развертываний), я получаю сообщение об ошибке, в котором все еще ожидают изменения:

% 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 ]

20 голосов
/ 22 марта 2012

Вы можете попробовать ( git update-index man page ):

git update-index --skip-worktree -- path

Бит Skip-worktree может быть определен в одном (длинном) предложении: если при чтении записи она помечается как skip-worktree, то Git делает вид, что версия его рабочего каталога актуальна, и вместо этого читает версию индекса.

Однако, как уже упоминалось в " git, предположим, что оно не изменилось по сравнению с пропуском рабочего дерева ":

Оба варианта имеют проблемы. --assume-unchanged сбрасывает себя всякий раз, когда индекс удаляется (например, git reset), так что, вероятно, рано или поздно он вас сбьет с толку. То же самое касается --skip-worktree.

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

То, что я начал делать, - это создание ветки от master, называемой private, с моими локальными изменениями; думайте об этом как о прокси-ветке между моей рабочей веткой и мастером. Я могу изменить текущую рабочую ветвь на частную, когда мне нужны локальные изменения, и у меня есть несколько псевдонимов в моем .gitconfig, которые автоматизируют поддержание приватности в актуальном состоянии с master. Когда мне нужно объединиться с мастером, мои псевдонимы обязательно перебазируют --onto master для приватной моей рабочей ветки.

Я разместил запись в блоге об этом более подробно здесь http://blog.ericwoodruff.me/2013/02/git-private-branch-pattern.html

2 голосов
/ 08 марта 2016

Решение, которое работало для меня, заключалось в использовании --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> не включаются в push
0 голосов
/ 21 февраля 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...