Git: игнорирование файлов с контролем версий

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

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

person Rafid    schedule 08.01.2011    source источник
comment
Ни один из ответов не отвечает на главный вопрос - номер 1, в том числе и принятый. Вопрос был об игнорировании файлов, которые уже контролируются, а не .gitignore не exlude сделает эту работу   -  person shealtiel    schedule 16.02.2011
comment
Ответ git-update-index является правильным ответом.   -  person Jason    schedule 03.05.2013


Ответы (6)


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

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

person Greg Hewgill    schedule 08.01.2011
comment
Я добавил файлы с контролем версий в .get/info/exclude, но они продолжали отображаться как измененные файлы. - person paullb; 17.09.2014
comment
Первоначальный вопрос заключается в том, чтобы разные сотрудники могли игнорировать разные наборы файлов. В моем ответе представлен файл .git/info/exclude, предназначенный для этой цели. Однако, если вы обобщаете вопрос о том, как игнорировать изменения в любом файле, который уже добавлен в Git, тогда да, вам нужно другое решение, потому что это другая проблема. Однако я бы не рекомендовал общее решение для этой конкретной проблемы, потому что тогда коллеги больше не смогут обмениваться изменениями в .gitignore. - person Greg Hewgill; 06.10.2014

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

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

Чтобы отменить это, используйте:

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

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

person Aristotle Pagaltzis    schedule 08.01.2011

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

git rm --cached path/to/file

or

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

Это удалит только трек из git, не удалит настоящие файлы.

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

person user1927627    schedule 03.08.2015
comment
OP не спрашивает, как удалить файлы с неправильной версией, а как сохранить их версию и игнорировать их при проверке статуса git. - person Daemon Painter; 31.01.2019

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

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

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

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

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

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

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

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

person Jean Hominal    schedule 08.01.2011

Я уже писал о трех способах исключения файлов в другом месте. .

В итоге:

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

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

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

person Abizern    schedule 08.01.2011

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

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