Как я могу заставить git игнорировать будущие изменения файла? - PullRequest
95 голосов
/ 03 декабря 2010

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

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

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

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

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

Ответы [ 7 ]

63 голосов
/ 29 сентября 2016

Как уже упоминали многие, хорошее современное решение:

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, состояние --assume-неизменное будет потеряно, как только будет получено изменение в восходящем направлении.

47 голосов
/ 03 декабря 2010

То, что вы ищете, это git update-index --assume-unchanged default_values.txt.

Подробнее см. В документах: http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html

19 голосов
/ 03 декабря 2010

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

5 голосов
/ 03 декабря 2010

Посмотрите на пятно / чистый сценарий. Таким образом, вы можете контролировать версию файла, но когда он будет извлечен, вы «размажете» его, заменив общие / заполнители на данные, специфичные для машины в файле.

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

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

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

3 голосов
/ 20 мая 2013

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

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

#! /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

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

1 голос
/ 24 апреля 2018

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

0 голосов
/ 03 декабря 2010

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

...