git не игнорирует 2 файла с особыми именами

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

Я добавил их в .git/info/exclude в надежде, что git понимает, что он не должен вносить в них изменения:

# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
a.conf
b.conf
# *~

но git status по-прежнему перечисляет их как подготовленные для фиксации:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   build/conf/a.conf
#   modified:   build/conf/b.conf
#

Я не хочу регулярно удалять их с каждой фиксацией (один раз я могу просто забыть), как я могу это сделать?


person erikbwork    schedule 04.06.2012    source источник
comment
Почему бы не .gitignore?   -  person maverik    schedule 04.06.2012
comment
Вы не можете игнорировать файлы, которые вы отслеживаете. Вероятно, вам нужно найти другой способ управления специфичной для локальной системы информацией, такой как наличие файлов шаблонов, которые вы создаете или вручную редактируете файлы конфигурации.   -  person CB Bailey    schedule 04.06.2012
comment
@maverik: если exclude не сработает, то и .gitignore не сработает. Вариант использования для exclude заключается в том, что эта информация находится локально, в то время как .gitignore может быть зарегистрирована и передана. Возьмите exclude для местных вещей, если не хотите взрывать .gitignore. Представьте себе большой проект, в котором каждый разработчик вводит свои исключения в .gitignore. Это стало бы неуправляемым...   -  person eckes    schedule 04.06.2012


Ответы (1)


Что вы хотите, так это игнорировать изменения в отслеживаемых файлах. Это невозможно (как Чарльз Бейли говорит) правильно, ни с .gitignore, ни с .git/info/exclude.

Вам нужно будет использовать git update-index:

git update-index --assume-unchanged build/conf/a.conf
git update-index --assume-unchanged build/conf/b.conf

добьетесь того, чего хотите: файлы всегда считаются неизменными.

Если вы хотите снова отслеживать изменения в этих файлах, используйте --no-assume-unchanged.

Наконец, если вы хотите узнать, какие файлы в данный момент находятся в режиме --assume-unchanged, запросите у git

git ls-files -v | grep -e "^[hsmrck]"
person eckes    schedule 04.06.2012
comment
Отлично работает для меня! - person Gustyn; 17.01.2017
comment
это решение привязано к ветке? Пусть файл 1 и файл 2 помечены как неизмененные в ветке 1. Затем оформить заказ в филиале 2. Эти файлы также помечены как неизмененные? - person nespapu; 23.02.2018
comment
@Leo Невозможно создать файл, потому что файл еще не отслежен. Вы можете просто перейти в .git/info/exclude и добавить пути, которые хотите исключить. - person Augustus Francis; 27.09.2018
comment
Очевидно, сопровождающие git не согласны с этим ответом: никогда не имел в виду игнорировать изменения в отслеживаемых файлах. Также см. stackoverflow.com/a/23305143/2705757 . - person AXO; 26.03.2019
comment
@eckes В любом случае, чтобы это работало для всех веток? если я использую команду, вношу изменения, я не могу переключать ветки и выдает ошибку, чтобы зафиксировать или спрятать их - person Arvand; 31.07.2019