У меня есть центральное голое хранилище, в котором есть три репозитория для разработчиков, которые тянут и толкают к нему нормально.
У меня также есть два других репозитория, которые извлекают данные из чистого репозитория CENTRAL: один - это живой сервер, а другой - сервер тестирования / стадии - каждый из которых извлекает из своей соответствующей ветви.
Сценарий таков: у меня есть post-update
хук-скрипт в репозитории CENTRAL, который автоматически обращается к тестовым и живым репо и запускает команду pull для каждого из них. Это обновляет как тестовые, так и живые серверы, все в зависимости от того, какая ветвь имеет новые коммиты. Это все прекрасно работает.
Проблема заключается в следующем: в чрезвычайной ситуации могут возникать ситуации, когда файлы могут напрямую обновляться на сервере (через ftp или что-либо еще), и сценарий CENTRAL после обновления завершается сбоем, поскольку возникают конфликты слияния / перезаписи. Этого сценария избежать невозможно, и он неизбежен.
Я хотел бы, чтобы это произошло так: я хочу, чтобы при извлечении из живых и тестовых сайтов всегда перезаписывались / объединялись при извлечении. Всегда. Эти репозитории будут доступны только для извлечения, поскольку они не предназначены для разработки.
Во всех моих исследованиях я не могу найти хорошее решение, чтобы вытягивание всегда вызывало перезапись локальных файлов. Это вообще возможно? Это сделало бы отличный сценарий развития, если так.
Ответы:
На самом деле идеальный способ сделать это - вообще не использовать
pull
, а вместо этогоfetch
иreset
:(Перейдя
master
на любую ветку, которой вы хотите следовать.)pull
предназначен для слияния изменений каким-то образом, тогдаreset
как разработан для простого соответствия вашей локальной копии конкретному коммиту.Вы можете рассмотреть несколько различные варианты в
clean
зависимости от потребностей вашей системы.источник
reset --hard
- это команда, которая используется для принудительного перевода состояния рабочего каталога (и текущей ветви) в состояние, соответствующее состоянию определенного коммита.FETCH_HEAD
является ссылкой, которая автоматически создаетсяfetch
для представления выбранной ссылки. Он не объединяется, просто перезаписывается всякий раз, когда вы делаете выборку.clean
это команда, которая удаляет файлы, которые не отслеживаютсяgit
,-df
флаги говорят ей удалить каталоги (-d
) и фактически выполнять удаление (-f
).git clean -dn
перед использованием,git clean -df
чтобы увидеть, какие файлы / папки будут удалены.git clean -df
может быть отменено, только если у вас есть резервная копияgit clean -df
, удалят также gitignored файлы, но оказывается, что это не так.git clean --help
говорит: «Обычно удаляются только файлы, неизвестные Git, но если указана опция -x, игнорируемые файлы также удаляются. Это может, например, быть полезно для удаления всех продуктов сборки».Вы можете попробовать это:
(из Как заставить "git pull" перезаписать локальные файлы? )
Другой идеей было бы удалить весь git и сделать новый клон.
источник
Я не уверен, как сделать это в одной команде, но вы могли бы сделать что-то вроде:
или даже
источник
git reset --hard && git pull
. В качестве альтернативы, но не лучшеgit reset --hard; git pull
. Использование&&
будет запускать вторую команду только в том случае, если первая команда была успешной.;
будет запускать его независимо от кода выхода первой команды.Чтобы вытащить копию ветви и принудительно перезаписать локальные файлы из источника, используйте:
Вся текущая работа будет потеряна, и она будет такой же, как и исходная ветка.
источник
источник
Вы можете изменить крючок, чтобы вытереть все в чистоте.
источник
git clean
- это «Удалить неотслеживаемые файлы из рабочего дерева» (вверху страницы). Обычно это не относится к игнорируемым файлам, но-x
указывает такжеgit clean
на включение игнорируемых файлов (за исключением того, что это не влияет на файлы, игнорируемые-e
параметром).Если вы еще не зафиксировали локальные изменения со времени последнего извлечения / клонирования, вы можете использовать:
checkout
очистит ваши локальные изменения с помощью последнего локального коммита иpull
внесет его в удаленный репозиторийисточник