Принудительно добавить, несмотря на файл .gitignore

Есть ли способ заставить git добавить файл, несмотря на .gitignore файл?


person Mark    schedule 04.11.2011    source источник
comment
Может быть, лучше спросить - зачем вам это нужно? Если вы хотите, чтобы файл отслеживался, отмените его игнорирование (добавьте к шаблону файла .gitignore префикс !, например !dont/ignore/this/file).   -  person Ohad Schneider    schedule 07.09.2015
comment
@OhadSchneider Это полезно, если вы принудительно фиксируете файл (ы) сборки в другую ветку. Некоторые проекты делают это, например StrongLoop для безопасного развертывания.   -  person Deminetix    schedule 21.12.2015
comment
@OhadSchneider Для нас это больше потому, что большинство разработчиков устанавливают git с Visual Studio 2015, который добавляет глобальный gitignore в папку пользователя. Это исключает такие файлы, как * .dll и * .exe. Это отлично подходит для наших новых проектов, в которых используются только пакеты nuget, которые извлекаются во время сборки, но для небольшого количества старых проектов мы по-прежнему используем библиотеки DLL, на которые вручную ссылаются в решении. Для этих проектов мы хотели бы включить их вручную, вместо того, чтобы указывать каждому разработчику комментировать файлы * .dll и * .exe в глобальном gitignore.   -  person Nullius    schedule 17.02.2016
comment
@Nullius Не могли бы вы просто отменить их игнорирование на более высоком уровне .gitignore (скажем, добавить .gitignore в ту же папку, что и dll, или одну выше, или что-то в этом роде)?   -  person Ohad Schneider    schedule 17.02.2016


Ответы (4)


См. man git-add:

   -f, --force
       Allow adding otherwise ignored files.

Так что запустите это

git add --force my/ignore/file.foo
person Daniel Böhmer    schedule 04.11.2011
comment
Гм, это не работает, в статусе git файл все еще не отображается - person Mark; 05.11.2011
comment
Что ж, я протестировал его, чтобы убедиться, что он действительно работает, и это действительно так. Можете ли вы описать вашу среду (ОС, версия git ...)? Вот что я в основном сделал: echo "/foo" >> .gitignore; echo "bar" > foo; git add foo # should throw an error; git add -p foo # works (нельзя вставлять символы новой строки в комментарии, выполнять команды 1 на 1 - person Daniel Böhmer; 05.11.2011
comment
То же самое случилось со мной, я ранее запускал git update-index --asume-unchanged для своих файлов. Мне пришлось отменить это с помощью --no-accept-unchanged, и это сработало - person Jako; 28.08.2015
comment
Это работает только для меня с использованием подстановочных знаков, с использованием git 1.9.5 в Windows, даже после попытки --no - accept-unchanged. git add - f ‹filename› ничего не делает, но git add -f * работает. Также работает TortoiseGit. - person mhenry1384; 13.10.2015
comment
@ mhenry1384 Причина, по которой он работает с подстановочными знаками только в Windows, может быть связана с тем, как используется разделитель путей. Для меня косая черта / работает, но обратная косая черта \ нет. Тот факт, что cmd / PowerShell convert / to \ для нас позволяет легко столкнуться с этим. - person ohw; 19.10.2015
comment
Привет, я просто хотел поделиться тем, что, хотя git status не отображал --force добавленный файл, я смог git commit мои последние изменения ранее проигнорированного файла. Я использую CentOS 7 git версии 2.25.0. Спасибо! - person tash; 25.11.2020

Несмотря на рабочее решение Даниэля Бемера, Охад Шнайдер в комментарии предложил лучшее решение:

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

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

person A-S    schedule 10.03.2017
comment
Это правильно. Я использовал параметр --force для небольших файлов данных, а затем немного изменил структуру папок и затер все файлы с принудительным отслеживанием. ОДНАКО: при .gitignore использовании !specific-file-name.txt без иерархии папок, таким образом отслеживание будет следовать за файлом вокруг репо. - person Merlin; 27.10.2017
comment
Это зависит от сценария, например. иногда вы хотите исключить 1.txt во всех папках, а иногда - папку1 / *. txt - person A-S; 28.10.2017
comment
Это не лучшее решение. Это решение другой проблемы. - person aij; 23.03.2018
comment
@aij - я не согласен, мой ответ предлагает другой способ заставить git добавить файл, несмотря на (текущее состояние) файла .gitignore. Хотя лишний текст в круглых скобках добавил я - думаю, это тоже подразумевается из текста вопроса. В любом случае, я думаю, что это также важная информация для тех, кто рассматривает возможность использования опции --force. - person A-S; 29.10.2020

Другой способ добиться этого - временно отредактировать файл gitignore, добавить файл и затем вернуть обратно gitignore. Я чувствую себя немного взломанным

person shardy    schedule 22.06.2017
comment
Я согласен, это не то, что вы хотите делать. - person Merlin; 27.10.2017

Как отменить игнорирование некоторого выбранного содержимого (файлов или папок) в игнорируемой папке

Если вы проигнорировали содержимое такого каталога:

/ignored_dir/*    # ignore the **contents of** this dir!

тогда вы можете UNignore файл или каталог внутри него следующим образом:

!/ignored_dir/special_file_to_include   # Do NOT ignore this file--DO include it!
!/ignored_dir/special_dir_to_include/   # And do NOT ignore this dir--DO include it!

НО, если вы проигнорировали ignored_dir напрямую следующим образом:

/ignored_dir/     # ignore this directory **directly**

тогда вышеуказанные ! правила, которые пытаются UN-игнорировать некоторые файлы или папки, НЕ будут работать! Итак, в этом случае переключитесь с использования этого стиля: /ignored_dir/ на этот стиль: /ignored_dir/*, а затем добавьте свои ! правила, как показано выше, в UNignore что-то в этом каталоге!

Использованная литература:

  1. Отменить игнорирование подкаталогов игнорируемых каталогов в Git
  2. [мое репозиторий eRCaGuy_dotfiles с примером файла .gitignore, содержащего эти заметки и демонстрации]: eRCaGuy_dotfiles / .gitignore
person Gabriel Staples    schedule 15.05.2021
comment
Возможно, это было лучше в качестве редактирования (хотя и довольно обширного) в ответе A-S выше, поскольку это тот же ответ и у него 24 голоса, поэтому он всегда будет выше. (Хотя ваша версия намного полезнее.) - person Darren Cook; 02.06.2021
comment
@DarrenCook, я не хотел сильно редактировать чей-то ответ. Одно из главных преимуществ Stack Overflow - это личное владение ответами и контентом, и большие правки этому мешают. Я думаю, что мой ответ также намного более полезен, и я надеюсь, что сам буду владеть им, чтобы сделать его так, как мне нравится, и попутно получить некоторую репутацию. В конце концов, если такие люди, как вы, проголосуют за него, он переместится в верхнюю часть списка. Я видел это десятки раз. Я добавил его, потому что он предоставляет новый и лишенный содержания и понимания, которых еще не было на этой странице. - person Gabriel Staples; 02.06.2021