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


413

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


4
Лучший вопрос может быть - зачем вам это делать? Если вы хотите, чтобы файл отслеживался, проигнорируйте его (добавьте префикс его шаблона в .gitignoreфайле !, например, !dont/ignore/this/file).
Охад Шнайдер

6
@OhadSchneider Это полезно, если вы принудительно фиксируете файл (ы) сборки в другую ветку. Несколько проектов делают это, например, StrongLoop для безопасного развертывания
Deminetix

5
@OhadSchneider Для нас это больше, потому что большинство разработчиков устанавливают git с Visual Studio 2015, которая добавляет глобальный gitignore в папку пользователя. Это исключает файлы, такие как * .dll и * .exe. Это отлично подходит для наших новых проектов, в которых используются только пакеты nuget, которые извлекаются во время сборки, но для небольшого числа старых проектов мы по-прежнему используем библиотеки DLL, на которые вручную ссылаются в решении. Для этих проектов мы хотели бы включить их вручную, вместо того, чтобы просить каждого разработчика комментировать файлы * .dll и * .exe в глобальном gitignore.
Нуллий

4
@Nullius Разве вы не можете просто игнорировать их на более высоком уровне .gitignore(скажем, добавить .gitignoreв ту же папку, что и DLL, или выше, или что-то)?
Охад Шнайдер

Ответы:


570

Смотрите man git-add:

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

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

git add --force my/ignore/file.foo

11
Хм, это не работает, в состоянии git файл все еще не отображается
Марк

5
Ну, я проверил это, чтобы убедиться, что это действительно работает, и это работает. Можете ли вы описать свой environemnt (ОС, git версия ...)? Это то, что я в основном сделал: echo "/foo" >> .gitignore; echo "bar" > foo; git add foo # should throw an error; git add -p foo # works(не могу вставить новые строки в комментарии, выполнить команды 1 за 1
Даниэль Бёмер

4
То же самое случилось со мной, я ранее запустил git update-index --asume-неизмененный в моих файлах. Мне пришлось отменить это с --no-предположить-неизменным, и это сработало
Jako

4
Это работает только для меня с использованием подстановочных знаков, с использованием git 1.9.5 в Windows, даже после попытки --no - предположить-без изменений. «git add - f <filename>» ничего не делает, но «git add -f *» работает. Использование TortoiseGit также работает.
mhenry1384

@ mhenry1384 Причина, по которой он работает только с подстановочными знаками в Windows, может быть связана с тем, как используется разделитель пути. Для меня косая черта "/" работает, но обратная косая черта "\" не работает. Тот факт, что cmd / PowerShell преобразует для нас "/" в "\", позволяет легко с этим справиться.
оу

19

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

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

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


4
Это правильно. Я использовал опцию --force для небольших файлов данных, а затем немного перестроил структуру папок и перекрыл все файлы с принудительным отслеживанием. ОДНАКО: при .gitignoreиспользовании !specific-file-name.txtбез иерархии папок, таким образом, отслеживание будет следовать за файлом вокруг репо.
Мерлин

Это зависит от сценария, например, когда-нибудь вы хотите исключить «1.txt» во всех папках, а иногда «folder1 / *. Txt»
AS

15
Это не "лучшее" решение. Это решение другой проблемы.
Aij

2

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


10
Я согласен, это не то, что вы хотите сделать.
Мерлин
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.