2011-01-08 2 views
41

Файл .gitignore очень полезен при игнорировании некоторых файлов, которые мы не хотим контролировать. К сожалению, он не может использоваться, когда файл уже находится под управлением версиями. Например, мой файл .gitignore (который уже добавлен в git) может отличаться от того, что хочет мой коллега (например, я хочу игнорировать файлы Vim). Всякий раз, когда я вношу изменения в этот файл, git показывает его как измененный файл. Итак, мои вопросы:Git: Игнорирование файлов с контролируемой версией

  1. Есть ли способ игнорировать изменения для определенного файла, который уже контролируется Git ?!
  2. Есть ли способ совершить эти изменения, но сохранить его только для себя? Очевидно, я не хочу использовать ветку, потому что я работаю над определенной веткой.
+5

Ни один из ответов не отвечает на главный вопрос - номер 1, включая принятый. Вопрос состоял в том, чтобы игнорировать файлы, которые уже контролируются, а не .gitignore not exlude выполнит задание – shealtiel

+4

Ответ на git-update-index - правильный ответ. – Jason

ответ

11

Если вы хотите исключить файлы, относящиеся к вашему процессу (например, временные файлы Vim), отредактируйте (локальный) файл .git/info/exclude и добавьте в него свои шаблоны исключения. Этот файл предназначен для исключений, специфичных для разработчиков, а не для .gitignore, который предназначен для исключений для всего проекта.

Краткое описание: все должны договориться о том, что добавлено к .gitignore. Для файлов, в которых вы не согласны, используйте .git/info/exclude.

+0

Я добавил файлы с контролируемой версией в .get/info/exclude, но они по-прежнему отображались как измененные файлы. – paullb

+7

Это НЕ ПРАВИЛЬНО !!!! Используйте ответ Аристотеля Пагальциса ниже. – paullb

+1

Исходный вопрос ищет способ для разных коллег игнорировать разные наборы файлов. Мой ответ представляет файл '.git/info/exclude', который предназначен для этой цели. Однако, если вы обобщите вопрос на вопрос «как игнорировать изменения в * любом * файле, который уже добавлен в Git», то да, вам нужно другое решение, потому что это другая проблема. Однако я бы не рекомендовал общее решение этой конкретной проблемы, потому что коллеги могут больше не делиться изменениями в '.gitignore'. –

2

Я не могу ответить на общий вопрос (имея Git игнорировать отслежённые файлы) - это поражает меня как функцию, которая была бы намного более вредной, чем полезной.

Однако gitignore manual page указывает несколько способов настройки шаблонов для исключенных файлов.

В частности, он дает четкие инструкции о том, как использовать эти различные способы:

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

Это означает, что ваш файл .gitignore не должен отличаться от ваших коллег - он работает как задумано.

  • Узоры, которые являются специфическими для конкретного хранилища, но которые не должны использоваться совместно с другими соответствующими хранилищами (например, вспомогательные файлы, которые живут внутри хранилища, но являются специфическими для рабочего процесса одного пользователя) должны идти в файл $GIT_DIR/info/exclude.

  • Узоры, которые пользователь хочет мерзавец игнорировать во всех ситуациях (например, резервное копирование или временных файлов, созданных с помощью редактора пользовательского выбора) обычно идут в файл, указанный core.excludesfile в пользователя ~/.gitconfig.

Там у вас есть. Укажите путь к файлу core.excludesfile в свой файл ~/.gitconfig, а затем введите в него шаблоны, которые вы хотите исключить.

99

Использование git-update-index временно игнорировать изменения в файлы, которые уже находятся под контролем версий:

git update-index --assume-unchanged <files> 

Чтобы отменить, что использование:

git update-index --no-assume-unchanged <files> 

также посмотреть на skip-worktree и no-skip-worktree варианты обновления -index, если вам это нужно, чтобы продолжить git-reset

+0

работал как шарм! Спасибо! –

1

Я написал около three ways of excluding files в другом месте.

В итоге:

  1. глобальный мерзавец игнорировать файл относится ко всем хранилищам на этой системе
  2. Файл .gitignore в хранилище применяется репозиторий и все клоны этого хранилища.
  3. Файл .git/info/exclude применяется только к этому репозиторию.

Нижние элементы в списке имеют приоритет над более высокими позициями, а ! перед элементом в любом из шаблонов в файле отменяет предыдущее исключение.

Эта парадигма видна в другом месте в Git. Например, если вы использовали подмодули, URL-адрес подмодуля для использования находится в файле .gitmodules в репозитории, но вы можете перенаправить URL-адрес для использования в файле .git/config.

+3

он не применяется к файлам, которые уже были версией. –

0

Вот обобщенный, ubiquitos (не индивидуальный) решение для тех, кто использует Git под SmartGitHG viusal интерфейса:

  • выбрать папку, которую вы хотите игнорировать в окне «Хранилище»;
  • выберите все файлы из этой папки в окне «Файлы» (отобразите неизменяемые файлы, щелкнув соответствующий значок фильтра в правой верхней области главного окна);
  • нажмите «Удалить» на панели управления (установите флажок «Удалить локальные файлы», если вам это нужно);
  • совершать локальные изменения;
  • rightclick в папке в окне «Хранилища»;
  • нажмите «Игнорировать».
4

Вы можете использовать эту команду, чтобы получить необходимую информацию.

git rm --cached path/to/file 

или

git rm -r --cached path/ignore/dir 

Это удалит только след от мерзавца, не будет удалять реальные файлы.

Затем вы можете отредактировать файл игнорирования, чтобы отследить эти файлы или директории.