Как и почему вы можете игнорировать некоторые файлы при фиксации
Обновлено: 21.11.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.
Используйте текстовый редактор, например следующий пример, в котором используется 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 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 рассматривает каждый файл в вашей рабочей копии как одну из трех вещей:
- отслеживаемый — файл, который ранее был размещен или зафиксирован;
- неотслеживаемый — файл, который не был помещен в промежуточный или зафиксированный файл; или
- игнорируется – файл, который 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» — бесплатно!
Подготовка к очистке
Прежде чем очистить репозиторий, необходимо провести две важные приготовления:
- Убедитесь, что ваш файл .gitignore обновлен и содержит все правильные шаблоны, которые вы хотите игнорировать.
- Зафиксируйте или спрячьте любые незавершенные локальные изменения, которые у вас могут быть. Прежде чем продолжить, ваша рабочая копия должна быть чистой.
Как игнорировать файлы
В нашей бесплатной онлайн-книге очень подробно объясняется общий процесс игнорирования файлов.
Очистка игнорируемых файлов
За три шага вы можете очистить свой репозиторий и убедиться, что ваши игнорируемые элементы действительно игнорируются:
Игнорирование зафиксированных файлов в 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.
Читайте также: