Как я могу безопасно обновить (вытащить) проект git, не трогая определенные файлы, даже если есть изменения в исходной версии?
myrepo / Config / config.php
Есть ли способ, даже если этот файл изменялся на удаленном компьютере, когда я git pull, все остальное обновляется, но этот файл не изменяется (даже не объединяется)?
PS. Мне нужно делать то, о чем я прошу, потому что я пишу только сценарии развертывания на основе git. Я не могу изменить файлы конфигурации на шаблоны.
Итак, мне нужен способ писать сценарии обновления, которые не теряют то, что было изменено локально. Я надеялся на что-нибудь простое:
git assume-remote-unchanged file1
git assume-remote-unchanged file2
затем git pull
config.php
зафиксированы?Ответы:
Есть простое решение, основанное на Git stash. Спрячьте все, что вы изменили, возьмите все новое, примените свой запас.
На тайнике могут быть конфликты. В случае, который вы описываете, на самом деле будет конфликт для
config.php
. Но разрешить конфликт легко, потому что вы знаете, что то, что вы кладете в тайник, - это то, что вы хотите. Так сделай это:источник
git merge
«нашем» указано то, что в данный момент находится в рабочем каталоге. Но наgit rebase
(илиgit rebase -onto
) значение можно поменять местами.git stash , git pull , git stash apply
Вы можете сбросить тайник с помощью:git stash drop
После успешного объединения измененийgit stash
.Если у вас есть файл в вашем репо, который должен быть настроен большинством съемщиков, переименуйте файл во что-то вроде
config.php.template
и добавьтеconfig.php
в свой.gitignore
.источник
.gitattributes
чтобы всегда сохранять свои изменения при слиянии.Обновление: это буквально отвечает на заданный вопрос, но я думаю, что ответ KurzedMetal действительно то, что вы хотите.
При условии, что:
master
master
вorigin
.... вы могли бы сделать:
Вы можете создать для этого псевдоним, если вам нужно делать это часто. Обратите внимание, что если у вас есть незафиксированные изменения
config/config.php
, они будут отброшены.источник
Мы также можем попробовать git pull с rebase
источник
Чтобы ответить на вопрос: если вы хотите исключить определенные файлы оформления заказа, вы можете использовать sparse-checkout
1) В
.git/info/sparse-checkout
определите, что вы хотите сохранить. Здесь нам нужны все (*), кроме (обратите внимание на восклицательный знак) config.php:2) Скажите git, что вы хотите принять во внимание разреженную проверку
3) Если у вас уже есть этот файл локально, сделайте то, что git делает при разреженной проверке (скажите ему, что он должен исключить этот файл, установив на нем флаг "skip-worktree")
4) Наслаждайтесь репозиторием, в котором ваш файл config.php принадлежит вам - независимо от того, какие изменения есть в репозитории.
Обратите внимание, что после того, как файл возьмет на себя управление git, .gitignore не будет иметь никакого эффекта.
Учитывая, что, когда файл находится под контролем источника, у вас есть только два варианта (): - перебазировать всю историю, чтобы удалить файл (с помощью
git filter-branch
) - создать фиксацию, которая удаляет файл. Это похоже на проигрышную битву, но иногда с этим приходится мириться.источник
Если это локальные незафиксированные изменения, избегайте конфликта слияния при извлечении.
обратитесь - https://happygitwithr.com/pull-tricky.html
источник