У каждого разработчика в моей команде есть их собственная локальная конфигурация. Та конфигурационная информация хранится в названном файле devtargets.rb
который используется в наших задачах сборки граблей. Я не хочу, чтобы разработчики ударили devtargets файл друг друга, все же.
Моя первая мысль состояла в том, чтобы вставить тот файл .gitignore
перечислите так, чтобы это не посвящало себя мерзавцу.
Затем я начал задаваться вопросом: действительно ли возможно фиксировать файл, но проигнорировать изменения в файле? Так, я фиксировал бы версию по умолчанию файла и затем когда разработчик изменяет его на их локальной машине, мерзавец проигнорировал бы изменения, и он не обнаружится в списке измененных файлов, когда Вы сделаете состояние мерзавца или фиксацию мерзавца.
Это возможно? Это, конечно, была бы хорошая функция...
Конечно, я делаю именно это время от времени, используя
git update-index --assume-unchanged [<file> ...]
Чтобы отменить и снова начать отслеживание (если вы забыли, какие файлы не отслеживались, см. Этот вопрос ):
git update-index --no-assume-unchanged [<file> ...]
Соответствующая документация :
- [no-] accept-unchanged
Когда этот флаг указан, имена объектов, записанные для путей, не обновляются. Вместо этого эта опция устанавливает / снимает бит «считать неизменным» для путей. Когда установлен бит «считать неизменным», пользователь обещает не изменять файл и позволяет Git предполагать, что файл рабочего дерева соответствует тому, что записано в индексе. Если вы хотите изменить файл рабочего дерева, вам нужно сбросить бит, чтобы сообщить Git. Это иногда полезно при работе с большим проектом в файловой системе, которая имеет очень медленный системный вызовlstat (2)
(например, cifs).Git завершится ошибкой (корректно), если потребуется изменить этот файл в индексе, например. при слиянии в коммите; таким образом, в случае изменения предполагаемого неотслеживаемого файла в восходящем направлении, вам нужно будет обработать ситуацию вручную.
Изящный отказ в этом случае означает, что если есть какие-либо изменения в восходящем потоке к этому файлу (допустимые изменения и т. Д.), Когда вы выполняете вытягивание, он скажет:
$ git pull
…
From https://github.com/x/y
72a914a..106a261 master -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
filename.ext
и откажется от слияния.
На этом этапе вы можете преодолеть это, либо отменив свои локальные изменения, вот один способ:
$ git checkout filename.ext
затем снова потяните и повторно измените локальный файл, либо можно установить –no-accept-unchanged
, и в этот момент вы можете сделать обычный тайник, выполнить слияние и т. д.
Обычной практикой является создание devtargets.default.rb
и зафиксируйте его, а затем проинструктируйте каждого пользователя скопировать этот файл в devtargets.rb
(который находится в списке .gitignore). Например, CakePHP делает то же самое для своего файла конфигурации базы данных, который естественным образом меняется от машины к машине.