Как я могу сделать git игнорировать будущие версии файла?

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

Моя мотивация заключается в том, что этот файл содержит информацию, относящуюся к машине. Я хотел бы предоставить значения по умолчанию, позволяя людям делать локальные изменения, которые не будут возвращены в исходный репозиторий, создавая конфликты слияния при появлении новых изменений.

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

Подводя итог,

  • Я хотел бы создать файл, назовите его default_values.txt, который добавлен в мой репозиторий git и включен, когда кто-то клонирует этот репозиторий.
  • git add . не следует добавлять default_values.txt к фиксации.
  • Это поведение должно быть передано любым клонам репозитория.

Ответ 1

Как и многие другие, хорошим современным решением является:

git update-index --skip-worktree default_values.txt

Это игнорирует изменения в этом файле, как локальном, так и восходящем, до тех пор, пока вы не решите разрешить их с помощью:

git update-index --no-skip-worktree default_values.txt

Вы можете получить список файлов, отмеченных пропущенными с помощью:

git ls-files -v . | grep ^S

Обратите внимание, что в отличие от --skip-worktree, статус неизмененного состояния будет потерян после выталкивания вверх по течению.

Ответ 3

Подход, который я обычно видел, - это создать файл с другим именем, например: default_values_template.txt, и поместить файл default_values.txt в ваш .gitignore. Попросите людей скопировать default_values_template.txt в default_values.txt в свои локальные рабочие области и внести необходимые изменения.

Ответ 4

Взгляните на smudge/clean scripting. Таким образом, вы можете управлять версией файла, но когда он будет извлечен, вы "размазаете" его, заменив данные общего или локального держателя данными машины в файле.

Когда вы его совершите, вы "очистите" его, заменив конкретную информацию о машине общей информацией или информацией о владельце места.

Скрипты Smudge/clean должны быть детерминированными в том, что применение их несколько раз, в разных порядках будет эквивалентом просто запуска последнего в последовательности.

То же самое можно применять с паролями, если вам нужно выставить свой репозиторий, но содержимое может содержать конфиденциальную информацию.

Ответ 5

Я решил это, указав "чистый" фильтр, чтобы просто загрузить содержимое файла в индекс.

git show :path/to/myfile должен просто распечатать содержимое индекса для указанного файла, поэтому мы можем использовать его в script, чтобы заменить рабочую копию нетронутой копией в индексе:

#! /bin/sh

git show :$1

Установите это как "чистый" фильтр для соответствующего файла (если вы положили его в "discard_changes" ):

$ git config filter.ignore_myfile.clean "discard_changes path/to/myfile"
$ echo "path/to/myfile filter=ignore_myfile" >> .gitattributes

К сожалению, я не могу найти способ сделать это обобщенным для нескольких файлов, так как нет способа определить, какой файл мы обрабатываем из чистого script. Конечно, нет ничего, что помешало бы вам добавить другое правило фильтрации для каждого файла, но это немного неуклюже.

Ответ 6

Я предлагаю взглянуть на подмодули. Если вы помещаете файлы определенного компьютера в подмодуль, git add следует игнорировать его.