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


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

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

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

подведем итог

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

7 ответов:

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

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

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

смотрите документы для получения более подробной информации:http://www.kernel.org/pub/software/scm/git/docs/git-update-index.html

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

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

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

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

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

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

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

#! /bin/sh

git show :

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

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

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

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

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