Git global ignore не работает

84

Я создал файл .gitignore_global и поместил его в каталог установки git. Когда я запускаю команду:

git config --global core.excludesfile ~/.gitignore

правила в файле игнорирования не применяются к моим коммитам.

Когда я переименовываю файл .gitignore и помещаю его в корень своего проекта, правила применяются.

Что здесь не так?

user880954
источник
1
@Jarrod `~ / .gitignore_global` - это то, что имел в виду OP, и просто опечатка в сообщении, хотя он принял мой ответ, поэтому ваше редактирование нехорошо
CharlesB
Отвечает ли это на ваш вопрос? Global Git ignore
codeforester

Ответы:

169

Может быть нужно сделать:

git config --global core.excludesfile ~/.gitignore_global 

И выпить кофе.

CharlesB
источник
Извините, я это имел в виду. Тот, который я скопировал, просто пытался посмотреть, что сработает.
user880954
Верно для кофе и зубов. Вы уверены, что .gitignore_global находится в вашем $ HOME? вы говорите, что установили его в каталог установки git?
CharlesB
есть идеи, почему это все еще не работает? У меня есть файл .7z, который я хочу пропустить; Я добавил эти правила: gist.github.com/octocat/9257657 ; и после того, как я изменю файл, он по-прежнему будет версироваться на .git :(
Aquarius Power
3
Да, gitignoreфайл работает только для неотслеживаемых файлов, а не для тех, которые были добавлены ранее
CharlesB
1
Еще я заметил, что образец строки в файле .gitignore_global должен ТОЧНО соответствовать пути из основного каталога проекта. Например, если имя проекта - myProject, который генерирует код SQL в myProject / sql / init, и вы хотите игнорировать myProject / sql / init / *. Sql, запись должна быть * / sql / init /. Точно так же для сгенерированного кода DAO / DTO в myProject / msg / dao / и myProject / dao должны быть две записи для перехвата ВСЕХ файлов в подкаталогах dao - * / * / dao / и * / dao / должны быть добавлены.
Кейт Киблер,
82

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

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

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

Все это заставляет меня задаться вопросом, можно ли игнорировать изменения в отслеживаемых файлах? Опять же, git доставляет. Этот ответ; Git: Игнорировать отслеживаемые файлы дает нам команду (заменить fileна файл, который вы хотите игнорировать):

git update-index --assume-unchanged file

Наконец, вот дополнительная информация об отладке git ignore.

Страница руководства gitignore (5) сообщает нам:

Шаблоны, которые пользователь хочет, чтобы Git игнорировал во всех ситуациях (например, резервные или временные файлы, созданные выбранным пользователем редактором), обычно попадают в файл, указанный в core.excludesfile в ~ / .gitconfig пользователя. Его значение по умолчанию - $ XDG_CONFIG_HOME / git / ignore. Если $ XDG_CONFIG_HOME не установлен или пуст, вместо него используется $ HOME / .config / git / ignore.

Итак, это новое и заменяет предыдущее, ~/.gitignore_globalупомянутое ранее.

Далее, и это действительно полезно, так это то, что с версии 1.8.2 у нас теперь есть отличные инструменты для отладки. Посмотри на:

Git учится лучше игнорировать - новое в версии 1.8.2

Это показывает, как использовать новый check-ignoreфлаг, чтобы убедиться, что git успешно игнорирует ваши шаблоны, например

git check-ignore bin/a.dll --verbose

Макс Маклауд
источник
8
git update-index --assume-unchanged fileбыло именно то, что я искал, спасибо!
Jai
14

Я обнаружил, что когда определил вот global core.excludesfileтак:

git config --global core.excludesfile $HOME/.config/git/ignore

это не сработало. Измените его так, чтобы $HOMEпеременная не использовалась , например:

git config --global core.excludesfile ~/.config/git/ignore

он сразу заработал. Надеюсь, это поможет кому-то другому.

К вашему сведению:

$ git --version
git version 1.7.10.2 (Apple Git-33)
XP84
источник
Я тоже это заметил. Я просмотрел документацию, но ничего не нашел: помимо .gitignore (для каждого каталога) и .git / info / exclude, git просматривает этот файл в поисках шаблонов файлов, которые не предназначены для отслеживания. "~ /" заменяется значением $ HOME, а "~ user /" - домашним каталогом указанного пользователя.
rliu
9

Примечание: начиная с git1.7.12 (август 2012 г.) :

Значение:

  • core.attributesfile по умолчанию $ HOME / .config / git / attributes и
  • core.excludesfileпо умолчанию $HOME/.config/git/ignoreсоответственно, когда эти файлы существуют.

Поэтому, если вы создаете $HOME/.config/git/attributesфайл, вам даже не нужно устанавливать core.excludesfileнастройки.

VonC
источник
4

Файл должен находиться в вашем домашнем каталоге. В Windows это обычно означает: C: \ documents and settings \ [пользователь].

В Linux это: / home / [пользователь]

Леандро Казанова
источник
2

У меня была эта проблема, потому что я изначально называл git config core.excludefiles без --global и с неправильным значением, и, следовательно, он сохранил свойство локально. Похоже, что локальное свойство скрыло глобальное (которое имело правильное значение), полностью игнорируя его.

Даниэль Пиньоль
источник
2

Другая причина, по которой глобальное игнорирование git может не работать: невидимые символы в пути.

Я узнал, что это была моя проблема, когда вставлял предупреждающее сообщение от git-check-ignore в адресную строку Chrome, где, к счастью, оно стало видимым:

введите описание изображения здесь

(На терминале этого не было видно. И это могла быть длинная кроличья нора отладки ... 😅)

1j01
источник
1

У меня была такая же проблема (в Windows). В итоге я проверил свой ~/.gitconfigфайл и обнаружил, что для меня excludesfileустановлено значение:

excludesfile = C:\\Users\\myUserName\\Documents\\gitignore_global.txt

но это должно было быть:

excludesfile = C:\\Users\\myUserName\\.gitignore_global

После того, как поменял, все заработало как надо.

Боб
источник
1

Еще у меня была забавная вещь с кодировкой этого файла. Каким-то образом моя Windows 10 (с Powershell) создала файл с кодировкой «UTF-16 LE», и каким-то образом Git не смог с этим справиться. Когда я меняю кодировку на гораздо более разумное значение буквально чего-либо еще, это сработало.

Вольфганг Штельцхаммер
источник
0

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

Просто добавляю свои два цента.

Luanjunyi
источник
0

Недавно я совершил ошибку и запустил следующую команду, которая git config core.excludesfile tags изменила путь excludesfile к локальному файлу в текущем репозитории, и эта конфигурация была записана в локальный файл конфигурации ниже .git/config, поэтому, чтобы исправить это, я просто открыл .git/configфайл и удалил строку excludesfile tagsи все вернулось в норму.

Нафаа Бутефер
источник