2012-03-22 2 views
30

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

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

Но теперь он снова вернулся в индекс (тьфу)! Есть ли лучшая альтернатива этому документообороту?

[Я не особенно волнует, если локальные изменения оставаться на месте (он же, это нормально, если это производственный филиал), я просто не хочу, она подтолкнула в удаленном хранилище.]

+0

это не работает для меня. Я добавляю файл с -skip-worktree, и статус git не отображается. Однако я все еще не могу переключиться на другую ветку. Что мне не хватает? – sandyp

ответ

19

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

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

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

Однако, как уже упоминалось в "git assume unchanged vs skip worktree":

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

+0

Спасибо, это сработало! Я буду держать это в виду. – Jeff

+4

Попробовав как '--assume-unchanged', так и' -skip-worktree', оба продолжают жаловаться на незафиксированные изменения в файле, когда я пытаюсь переключить локальные ветви после установки этого свойства. – amoe

+4

@amoe и этот файл уже был версией правильно? Что делать, если вы добавляете этот файл в 'your_repo \ .git \ info \ exclude'? – VonC

2

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

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

+0

Ссылка в вашем комментарии не работает, но мне нравится идея, описанная в вашем ответе. – Flimm

+0

Спасибо за отзыв, я поместил исправленную ссылку блога в исходный ответ –

1

решение, которое работало для меня было использовать --skip-worktree. Однако, как и выше, я изо всех сил пытался переключаться между пропущенной ветвью и основной веткой без git, жалуясь даже после того, как я установил флаг -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> не включены в толчке
0

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

Смежные вопросы