Как и почему вы можете игнорировать некоторые файлы при фиксации

Обновлено: 30.06.2024

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

В этом руководстве вы узнаете, как:

  • Используйте gitignore для предотвращения отслеживания файлов
  • Игнорировать файлы только в вашей системе
  • Игнорировать файлы во всех репозиториях в вашей системе
  • Игнорировать изменения в зафиксированных файлах

Используйте gitignore для предотвращения отслеживания файлов

Создайте файл .gitignore в своем репозитории Git, чтобы Git не помещал в промежуточные файлы нежелательные файлы. Поделитесь файлом .gitignore в ветке по умолчанию вашего репозитория. Вы и ваша команда можете обновить файл, чтобы изменить типы файлов, которые следует игнорировать.

Создайте .gitignore

В Visual Studio 2019 версии 16.8 и более поздних версиях есть новое меню Git для управления рабочим процессом Git с меньшим переключением контекста, чем в Team Explorer. Процедуры, представленные в этой статье на вкладке Visual Studio 2019, предоставляют информацию об использовании возможностей Git, а также Team Explorer. Дополнительные сведения см. в разделе Сравнение Git и Team Explorer.

Visual Studio автоматически создает файл .gitignore в вашем репозитории, когда вы создаете новый репозиторий для своего проекта.

Загрузите файл шаблона .gitignore для своего типа проекта и настройте его в соответствии со своими потребностями. Если ваш проект не соответствует шаблону, вы можете создать пустой файл .gitignore из командной строки. Перейдите в репозиторий Git и выполните одну из следующих команд, используя информацию о репозитории:

Окна

Linux и macOS

Git применяет .gitignore к папке и любым дочерним папкам, в которых она находится. Мы рекомендуем поместить файл .gitignore в корневую папку репозитория, чтобы избежать путаницы.

Настройте свой .gitignore

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

В Visual Studio 2019 версии 16.8 и более поздних версиях есть новое меню Git для управления рабочим процессом Git с меньшим переключением контекста, чем в Team Explorer. Процедуры, представленные в этой статье на вкладке Visual Studio 2019, предоставляют информацию об использовании возможностей Git, а также Team Explorer. Дополнительные сведения см. в разделе Сравнение Git и Team Explorer.

Вы можете отредактировать файл .gitignore для своего репозитория, перейдя в представление "Настройки" в Team Explorer и выбрав "Настройки репозитория". Выберите Изменить для вашего .gitignore.

Найдите и откройте .gitignore для вашего репозитория в Visual Studio

Используйте текстовый редактор, например следующий пример, в котором используется Vim:

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

Пользователи Windows: все пути к файлам в файле .gitignore используют разделитель косой черты, а не обратной косой черты.

Игнорировать файлы только в вашей системе

Ваш файл .gitignore передается членам команды в виде файла, зафиксированного и отправленного в репозиторий Git. Чтобы исключить файлы только в вашей системе, отредактируйте файл .git/info/exclude в локальном репозитории. Изменения в этом файле недоступны другим пользователям. Они применяются только к файлам в этом репо. Синтаксис этого файла такой же, как и в .gitignore.

Игнорировать файлы во всех репозиториях в вашей системе

Настройте глобальный файл .gitignore для использования во всех репозиториях в вашей системе с помощью инструмента git config из командной строки, как показано в следующем примере:

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

Игнорировать изменения в зафиксированных файлах

Временно игнорировать изменения

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

Возобновите отслеживание файлов с помощью следующей команды:

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

Чтобы отключить отслеживание изменений:

Чтобы возобновить отслеживание изменений:

Навсегда прекратить отслеживание файла

Если файл уже отслеживается Git, .gitignore не применяется. Git продолжит отслеживать изменения в этом файле.

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

Добавьте файл в свой .gitignore .

Выполните следующую команду:

Зафиксируйте удаление файла и обновленного .gitignore в своем репозитории.

У меня есть несколько файлов в наборе изменений, но я хочу игнорировать один измененный файл. Выглядит так после git status :

Есть ли способ сделать git add, но просто игнорировать один текстовый файл, который я не хочу трогать? Что-то вроде:

Из man git add: -u, --update "Обновить индекс только там, где он уже содержит запись, совпадающую с . Это удаляет, а также изменяет записи индекса, чтобы они соответствовали рабочему дереву, но не добавляет новые файлы. . "

если у вас есть неотслеживаемые файлы, параметр -u позаботится о том, чтобы эти неотслеживаемые файлы не добавлялись. git add --all также добавит эти файлы.

18 ответов 18

@MariusKavansky Вы можете использовать все эти формы. Если вы используете main/*, необходимо добавить -- перед ним, чтобы git знал, что это путь. Два других варианта работают без включения двух дефисов. (Проверено в командной строке Windows 7 с помощью msysGit)

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

Теперь git поддерживает исключение определенных путей и файлов с помощью магии pathspec :(exclude) и ее краткой формы :! . Таким образом, вы можете легко добиться этого с помощью следующей команды.

Для Mac и Linux заключите каждый путь к файлу/папке в кавычки

Это превосходно! Обратите внимание, что в Linux вам нужно указать . пункты, чтобы оболочка не жаловалась. Так, например: git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*' .

Без кавычек вокруг . , я также получал ошибку «Событие не найдено» в Windows 10 git bash. Посмотрите комментарий @Martin_W

Обратите внимание, что путь указан относительно текущего каталога! то есть, если вы находитесь в ./path/ , используйте просто git add --all -- ':!to/file1'

Это лучший ответ. Если необходимо исключить большую папку с большим количеством файлов, добавление и сброс занимают много времени. git добавить -- . ':!' намного быстрее.

1) Чтобы начать игнорировать изменения в одном уже версионном файле

и отменить этот git update-index --no-assume-unchanged "main/dontcheckmein.txt"

2) Чтобы полностью игнорировать конкретный отдельный файл, предотвращая его создание в репозитории

Сначала взгляните на этот пост stackoverflow: Глобальное игнорирование Git не работает

В .gitignore добавьте относительный путь к файлу без начального ./ .

Итак, если ваш файл находится в MyProject/MyFolder/myfile.txt (где .git также находится в папке MyProject), добавьте MyFolder/myfile.txt в ваш файл .gitignore.

Вы можете проверить, какие правила связаны с игнорированием, с помощью git check-ignore "MyFolder/myfile.txt"

О глобальном игнорировании

Эта ссылка говорит о ~/.gitignore_global , но файл связан с вашим проектом. Итак, если вы поместите шаблон исключения MyFolder/myfile.txt в ~/.gitignore_global , он будет работать, но не будет иметь особого смысла.

С другой стороны, если вы настроите свой проект с помощью git config core.excludesfile .gitignore, где .gitignore находится в MyProject , локальный файл переопределит ~/.gitignore_global , который может иметь очень полезные правила.

Итак, на данный момент я думаю, что лучше всего сделать какой-нибудь скрипт для смешивания вашего .gitignore с ~/.gitignore_global в .gitignore .

Последнее предупреждение.
Если файл, который вы хотите игнорировать, уже находится в репозитории, этот метод не будет работать, если вы не сделаете следующее: git rm "MyFolder/myfile.txt" , но сначала создайте его резервную копию, т.к. он также будет удален локально! Вы можете скопировать его позже.

Мне интересно, где эта команда git update-index --assume-untchanged "main/dontcheckmein.txt" хранится в структуре папок git

Для файла

Для папки

Опция -u обновляет индекс только там, где уже есть запись, соответствующая <указателю_пути>. Это удаляет, а также изменяет записи индекса, чтобы они соответствовали рабочему дереву, но не добавляет новые файлы. Если не указан при использовании параметра -u, обновляются все отслеживаемые файлы во всем рабочем дереве (использовались старые версии Git для ограничения обновления текущим каталогом и его подкаталогами).

-u используется для ссылки на вашу текущую ветку, в которую вы отправляете. Вам больше не нужно будет вводить git push origin master при следующем нажатии, просто git push и git будет знать, что это в ветке master. Надеюсь, это поможет.

Хотя Бен Джексон прав, я решил добавить, как я использовал это решение.Ниже приведен очень простой скрипт, который я использую (который я называю gitadd), чтобы добавить все изменения, кроме нескольких избранных, которые я оставляю в файле с именем .gittrackignore (очень похоже на то, как работает .gitignore).

А вот так выглядит мой текущий .gittrackignore.

Я работаю над проектом Android, который компилирую из командной строки при развертывании. Этот проект зависит от SherlockActionBar, поэтому на него нужно ссылаться в project.properties, но это мешает компиляции, поэтому теперь я просто набираю gitadd и добавляю все изменения в git без необходимости каждый раз отменять добавление project.properties. .

Я не знал, что... было до твоего комментария. Согласно справочным страницам, это необязательно и не меняет результат команды (по крайней мере, в этом случае). Этот вопрос, похоже, подтверждает это, stackoverflow.com/questions/17800994/…. Поправьте меня, если я ошибаюсь, но кажется, что это означает "рассматривать все после -- как аргументы, а не параметры/переключатели"

Хорошее использование -- в git checkout, которое я вижу в этом вопросе. Я тоже не знал, что такое двойное тире, до нашего обмена мнениями. Интересно, может ли двусмысленность git checkout между ветвями и файлами повлиять, в той или иной форме, на git reset.

Чтобы сохранить изменение в файле, но не зафиксировать его, я сделал это

git reset -- main/dontcheckmein.txt

git commit -m "сообщение фиксации"

чтобы убедиться, что файл исключен, выполните

После добавления всех файлов в тестовую область с помощью git add . ввод git status предложит вам git restore --staged main/dontcheckmein.txt Почему вместо этого @gsumk предложил reset?

Используйте git add -A, чтобы сразу добавить все измененные и вновь добавленные файлы.

Мы можем добавить все файлы и исключить файл, который необходимо удалить с помощью git reset.

Для конкретного случая в вопросе проще всего добавить все файлы с расширением .c и исключить все остальное:

От git-scm (или/и man git add ):

git add …​

Файлы, из которых нужно добавить содержимое. Fileglobs (например, *.c) могут быть заданы для добавления всех соответствующих файлов.

Обратите внимание, что это означает, что вы также можете сделать что-то вроде:

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

Приведенное выше действие добавит все файлы, которые находятся в папке s(any char)c и где-то в имени файла есть Service.

Очевидно, что вы не ограничены одним шаблоном на команду. То есть вы можете попросить git добавить все файлы с расширением .c и .h:

Эта ссылка может дать вам еще несколько идей по шаблону глобуса.

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

Кстати, вам может понадобиться указать шаблоны подстановок в кавычках, чтобы они работали, но я никогда этого не делал.

Git рассматривает каждый файл в вашей рабочей копии как одну из трех вещей:

  1. отслеживаемый — файл, который ранее был размещен или зафиксирован;
  2. неотслеживаемый — файл, который не был помещен в промежуточный или зафиксированный файл; или
  3. игнорируется – файл, который Git явно проигнорировать.
  • кеши зависимостей, такие как содержимое /node_modules или /packages
  • скомпилированный код, например файлы .o , .pyc и .class
  • создать выходные каталоги, такие как /bin , /out или /target
  • файлы, созданные во время выполнения, например .log , .lock или .tmp
  • скрытые системные файлы, такие как .DS_Store или Thumbs.db
  • личные файлы конфигурации IDE, например .idea/workspace.xml

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

Git игнорировать шаблоны

.gitignore использует подстановочные шаблоны для сопоставления с именами файлов. Вы можете создавать узоры, используя различные символы:

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

Вы можете использовать \ для экранирования символов шаблона .gitignore, если у вас есть файлы или каталоги, содержащие их:

Общий .файлы gitignore в вашем репозитории

Правила игнорирования Git обычно определяются в файле .gitignore в корне репозитория. Однако вы можете определить несколько файлов .gitignore в разных каталогах вашего репозитория. Каждый шаблон в конкретном файле .gitignore проверяется относительно каталога, содержащего этот файл. Однако соглашение и самый простой подход — определить один файл .gitignore в корне. Когда ваш файл .gitignore зарегистрирован, он версионируется, как и любой другой файл в вашем репозитории, и передается вашим товарищам по команде при отправке. Как правило, вы должны включать в .gitignore только те шаблоны, которые принесут пользу другим пользователям репозитория.

Личные правила игнорирования Git

Вы также можете определить личные шаблоны игнорирования для конкретного репозитория в специальном файле по адресу .git/info/exclude . Они не имеют версий и не распространяются вместе с вашим репозиторием, так что это подходящее место для включения шаблонов, которые, скорее всего, принесут вам только пользу. Например, если у вас есть пользовательская настройка ведения журнала или специальные инструменты разработки, которые создают файлы в рабочем каталоге вашего репозитория, вы можете добавить их в .git/info/exclude, чтобы предотвратить их случайную фиксацию в вашем репозитории.

Глобальные правила игнорирования Git

Кроме того, вы можете определить глобальные шаблоны игнорирования Git для всех репозиториев в вашей локальной системе, установив свойство Git core.excludesFile. Вам придется создать этот файл самостоятельно. Если вы не знаете, куда поместить ваш глобальный файл .gitignore, ваш домашний каталог — неплохой выбор (и его легко найти позже). После того, как вы создали файл, вам нужно настроить его расположение с помощью git config :

Вы должны быть осторожны с тем, какие шаблоны вы выбираете для глобального игнорирования, поскольку разные типы файлов подходят для разных проектов. Специальные файлы операционной системы (например, .DS_Store и thumbs.db ) или временные файлы, созданные некоторыми инструментами разработчика, являются типичными кандидатами на глобальное игнорирование.

Игнорирование ранее зафиксированного файла

Если вы хотите игнорировать файл, который вы зафиксировали в прошлом, вам нужно удалить файл из своего репозитория, а затем добавить для него правило .gitignore. Использование параметра --cached с git rm означает, что файл будет удален из вашего репозитория, но останется в вашем рабочем каталоге как игнорируемый файл.

Вы можете опустить параметр --cached, если хотите удалить файл как из репозитория, так и из вашей локальной файловой системы.

Зафиксировать игнорируемый файл

Можно принудительно зафиксировать игнорируемый файл в репозитории с помощью параметра -f (или --force ) с git add :

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

Этот подход более очевиден и менее запутан для ваших товарищей по команде.

Сохранение игнорируемого файла

git stash – это мощная функция Git, позволяющая временно откладывать и отменять локальные изменения, что позволяет повторно применить их позже. Как и следовало ожидать, по умолчанию git stash игнорирует игнорируемые файлы и сохраняет изменения только в файлах, отслеживаемых Git. Однако вы можете вызвать git stash с параметром --all, чтобы также спрятать изменения в игнорируемых и неотслеживаемых файлах.

Отладка файлов .gitignore

Если у вас есть сложные шаблоны .gitignore или шаблоны, разбросанные по нескольким файлам .gitignore, может быть сложно отследить, почему тот или иной файл игнорируется. Вы можете использовать команду git check-ignore с параметром -v (или --verbose), чтобы определить, какой шаблон вызывает игнорирование определенного файла:

Вывод показывает:

Вы можете передать несколько имен файлов в git check-ignore, если хотите, и сами имена даже не обязательно должны соответствовать файлам, существующим в вашем репозитории.

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

Однако, конечно, не все идет идеально. и проскальзывают файлы, которые вы позже хотели бы игнорировать.

Шпаргалка Git

Не нужно запоминать все эти команды и параметры: получите нашу популярную «Шпаргалку по Git» — бесплатно!

Подготовка к очистке

Прежде чем очистить репозиторий, необходимо провести две важные приготовления:

  1. Убедитесь, что ваш файл .gitignore обновлен и содержит все правильные шаблоны, которые вы хотите игнорировать.
  2. Зафиксируйте или спрячьте любые незавершенные локальные изменения, которые у вас могут быть. Прежде чем продолжить, ваша рабочая копия должна быть чистой.

Как игнорировать файлы

В нашей бесплатной онлайн-книге очень подробно объясняется общий процесс игнорирования файлов.

Очистка игнорируемых файлов

За три шага вы можете очистить свой репозиторий и убедиться, что ваши игнорируемые элементы действительно игнорируются:

Игнорирование зафиксированных файлов в Tower

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

Подробнее

  • Прочитайте главу «Начало работы с неверсионным проектом» в нашей бесплатной онлайн-книге.
  • Часто задаваемые вопросы о Git и управлении версиями

Получите нашу популярную памятку по Git бесплатно!

Самые важные команды вы найдете на лицевой стороне, а полезные советы — на обратной. Более 100 000 разработчиков скачали его, чтобы сделать Git немного проще.

О нас

Как создатели Tower, лучшего клиента Git для Mac и Windows, мы помогаем более чем 100 000 пользователей в таких компаниях, как Apple, Google, Amazon, Twitter и Ebay, получить максимальную отдачу от Git.

Как и в случае с Tower, наша миссия с этой платформой – помочь людям стать лучшими профессионалами.

Вот почему мы бесплатно предоставляем наши руководства, видеоролики и памятки (об управлении версиями в Git и многих других темах).

© Tower, 2010-2022. Упомянутые названия продуктов и логотипы являются собственностью соответствующих владельцев.

Git – популярная распределенная система управления версиями, используемая командами по всему миру. При работе с репозиторием git вам может потребоваться исключить или проигнорировать определенные файлы и папки, потому что вам может не понадобиться отправлять их в ваш репозиторий. Это может произойти, если эти изменения актуальны локально, но не важны для других разработчиков, использующих ваш репозиторий. В таких случаях рекомендуется исключить эти файлы и папки из коммита git. В этой статье мы рассмотрим, как исключить файлы в git commit.

Как исключить файл из Git Commit

Вот шаги, чтобы исключить файл из коммита git. git позволяет вам создать файл .gitignore, в котором перечислены все файлы и папки, которые необходимо исключить. Когда вы запускаете команды git, такие как git status или git commit, он сканирует содержимое файла .gitignore, чтобы исключить файлы и папки, соответствующие шаблонам, упомянутым в этом файле. Вы можете добавить этот файл в корневой каталог вашего репозитория git или в любой из подкаталогов. Вы также можете поместить несколько файлов .gitignore в разные подкаталоги вместо того, чтобы помещать один файл в корневую папку.

1. Создайте файл .gitignore

Допустим, ваш репозиторий находится в /home/ubuntu/demo. Откройте терминал и выполните следующую команду, чтобы создать файл .gitignore в корневой папке.

2. Добавьте файлы и папки для исключения

Добавьте файлы и папки, которые вы хотите исключить, по одному в каждой строке. Вы можете указать относительные пути к вашим файлам и папкам. Или вы можете использовать подстановочные знаки и шаблоны регулярных выражений, такие как *, чтобы перечислить их. Вот наиболее часто используемые подстановочные знаки.

Давайте посмотрим на пример файла игнорирования .git, в котором комментарии объясняют, что исключает каждая строка

Сохраните и закройте файл. Каждый шаблон в файле .gitignore проверяется относительно папки, в которой он находится.

Вот и все. Теперь, когда вы фиксируете файлы и папки в репозиторий git, он автоматически исключает те, которые упомянуты в вашем файле игнорирования .git.

Читайте также: