Кто коснулся моего бита git accept без изменений?

У меня есть определенный файл в моем репо, в котором я установил бит предположения без изменений:

git update-index --assume-unchanged someFile.txt

Время от времени, после некоторой работы над репозиторием, этот бит сбрасывается, и файл автоматически больше не assume-unchanged.

Кто прикасается к нему? Как я могу сделать это постоянным, пока я явно не скажу git:

git update-index --no-assume-unchanged someFile.txt

Что тут происходит?


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


Редактировать: Хорошо, думаю, мне удалось воспроизвести проблему.

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

Итак, возникает два вопроса:

  1. Можно ли установить этот бит в центральном авторитетном репо, чтобы он распространялся на все репозитории?
  2. Можно ли сделать этот бит липким даже после удаленных изменений в нем?

person Yuval Adam    schedule 13.09.2011    source источник
comment
Я думаю, что эта функция уже рассматривалась в списке git как минимум один раз (по крайней мере, в ветке, упомянутой Марком ниже). Я не думаю, что кто-то подошел, чтобы реализовать это, хотя.   -  person Jan Hudec    schedule 13.09.2011
comment
Найдена еще одна соответствующая тема: thread.gmane.org/gmane.comp.version -control.git/146082   -  person Yuval Adam    schedule 13.09.2011
comment
Нет авторитетного репо - см. мой аналогичный вопрос здесь: stackoverflow.com/questions/25123374/ и это запись в блоге для git, предполагающая неизменность по сравнению с пропуском рабочего дерева: fallgamer.livejournal.com/93321.html   -  person Mr_and_Mrs_D    schedule 06.08.2014


Ответы (2)


IIRC, если вы игнорируете файл с версией, он будет вести себя так. Вы можете игнорировать все рабочие деревья из .gitignore или конкретное рабочее дерево из .git/info/exclude (да, это работает, но это не предназначено).

person Jan Hudec    schedule 13.09.2011
comment
Игнорирование такого ценного файла может быть опасным. git считает игнорируемые файлы одноразовыми и может перезаписывать их при переходе между версиями. (Механизм игнорирования предназначен для продуктов сборки.) - person Mark Longair; 13.09.2011
comment
Игнорирование не является проблемой под рукой. Игнорирование предназначено для неверсированных файлов. Я говорю о --assume-unchanged для файлов с версиями. - person Yuval Adam; 13.09.2011
comment
@Yuval: На самом деле нет, не только. Я не уверен, является ли это преднамеренным, побочным эффектом добавления семантики в git или случайно, но если версионный файл соответствует шаблону игнорирования, git видит файл, но игнорирует внесенные в него изменения. Другими словами, ведет себя аналогично --assume-unchanged. - person Jan Hudec; 13.09.2011
comment
@Mark: У вас есть ссылка, которая на самом деле говорит, что git рассматривает игнорируемые файлы как одноразовые? Я думаю, что нет. - person Jan Hudec; 13.09.2011
comment
@Jan Hudec: конечно, взгляните на эта ветка из списка рассылки git, где Junio ​​говорит: "Большую часть времени игнорирование равносильно тому, что можно безопасно отбросить". Я должен добавить, что это было неприятным сюрпризом для меня, когда я узнал об этом на собственном горьком опыте... - person Mark Longair; 13.09.2011
comment
@Jan, из документации: обратите внимание, что все файлы gitignore действительно касаются только файлов, которые еще не отслеживаются git; чтобы игнорировать незафиксированные изменения в уже отслеженных файлах, обратитесь к документации git update-index --assume-unchanged. Даже если то, что вы предлагаете, работает, это не по замыслу и противоречит официальной документации. - person Yuval Adam; 13.09.2011
comment
Хм, понятно. Зачеркивание ответа (и сохранение, чтобы другим не пришлось повторять ошибку) - person Jan Hudec; 13.09.2011

Кажется, что --skip-worktree + разреженная проверка могут позволить такое поведение.

Из git предполагать неизменное и пропустить рабочее дерево - игнорирование символической ссылки (с некоторыми контекстуальными изменениями):

  • Установите core.sparseCheckout в значение true для репозитория.
  • Создайте файл .git/info/sparse-checkout, содержащий два шаблона: *, чтобы включить все, и !/path/to/someFile.txt, чтобы исключить локальный файл 'someFile.txt'.
  • Теперь вручную установите для бита skip-worktree значение someFile.txt.

Теперь вы можете продолжать, не опасаясь, что git автоматически зафиксирует каталог, но обратите внимание, что вы все равно столкнетесь с проблемами, если кто-то явно запустит git add для каталога или любого файла в нем.

Дальнейшее изучение справочной страницы кажется, указывает на то, что --skip-worktree больше подходит для рассматриваемого варианта использования.

person davidneedham    schedule 11.09.2013