Можно ли остановить отслеживание локальных изменений в файле, который вы хотите удалить, если он был изменен в репо?
У нас есть файл конфигурации в репозитории, в который все пользователи вносят свой вклад в зависимости от их функций. Для локального тестирования мне нужно вручную изменить два значения в этом файле конфигурации, но я никогда не хочу, чтобы мои изменения были отправлены обратно на сервер.
Однако я хочу получить обновления для файла, если в репо есть более новая версия, даже если это означает, что мои локальные изменения будут перезаписаны. Хорошо, я могу просто сделать их снова из тайника, который я специально создал, чтобы сделать именно это.
Что мне интересно, так это то, что я могу сказать Git: "Эй... Я никогда не буду откладывать свои локальные изменения на сервере, поэтому не показывайте их мне как измененные, но если у вас есть новые изменения для меня, позвольте мне их, когда я потяну!
Вот пример того, что я после.
Server: VersionA
Local: [Nothing]
(I do a Git Pull)
Server: VersionA
Local: VersionA
(I make local changes)
Server: VersionA
Local: VersionA (Modified)
(What I want...)
Server: VersionA
Local: VersionA (Modified, but ignored locally by Git)
(Someone checks in an update to the file)
Server: VersionB
Local: VersionA (Modified, but local changes ignored by Git)
(I do a git Pull)
Server: VersionB
Local: VersionB (This overwrites my local, modified VersionA)
(I then manually update VersionB with my stashed changes)
Server: VersionB
Local: VersionB (modified, but local changes ignored by Git)
.gitignore
Здесь файл не применяется, потому что это останавливает добавление новых файлов, но, опять же, этот файл уже был добавлен. Я просто хочу, чтобы он всегда игнорировал мои локальные изменения, как будто их там не было. Мне важно только, если файл изменился на сервере.
Так можно ли настроить Git для этого?
1 ответ
.gitignore
Здесь файл не применяется, потому что это останавливает добавление новых файлов, но, опять же, этот файл уже был добавлен.
Я просто хочу, чтобы он всегда игнорировал мои локальные изменения.
Другой подход - сделать ваши изменения... в личном файле, который не отслеживается и игнорируется.
Это означает, что все общие вклады выполняются в файле шаблона. Используется для создания фактического файла (как частный файл без версии, добавленный в ваш файл. .gitignore
).
Это поколение будет автоматически на git checkout
,
Сначала переименуйте существующий файл:
git mv aConfigFile aConfigFile.tpl
git commit -m "record template config file"
Затем добавьте к aConfigFile
к .gitignore
файл: git status
больше не будет отображаться для добавления / изменения.
Теперь объявите драйвер фильтра содержимого smudge, который автоматически сгенерирует этот файл (игнорируется, так как он находится в .gitignore
)
(изображение из " Настройка Git - атрибутов Git", из " Книги Pro Git")
smudge
скрипт (который вы можете версии): YourScript
copy aConfigFile.tpl aConfigFile
Объявите драйвер фильтра содержимого в версионной версии .gitattributes
:
echo 'aConfigFile.tpl config' >> .gitattributes
Этот грязный драйвер фильтра содержимого "config" должен быть активирован локально каждым пользователем, клонирующим это хранилище.
cd /path/to/repo
git config filter.config.smudge YourScript
Этот последний шаг - единственный, который должен сделать каждый пользователь, чтобы извлечь выгоду из фактического конфигурационного файла, который будет автоматически генерироваться на каждом git checkout
,
Любые изменения, сделанные в сгенерированном файле, останутся локальными