Как заставить git вытащить, чтобы перезаписать все при каждом нажатии?
У меня есть репозиторий CENTRAL, который имеет три хранилища репозитория, которые тянут и подталкивают к нему в обычном режиме.
У меня также есть два других репозитория, которые выходят из CENTRAL bare repo: один - это живой сервер, а другой - тестовый/этапный сервер, каждый из которых вытягивается из своей собственной ветки.
Сценарий таков: у CENTRAL repo есть post-update
hook script, который автоматически обращается к тестовому и live-репозиторию и запускает команду pull для каждого из них. Это обновляет тестовые и живые серверы, все в зависимости от того, какая ветка имеет новые фиксации. Все это отлично работает.
Проблема заключается в следующем: в экстренной ситуации могут быть случаи, когда файлы могут быть напрямую обновлены на сервере (через ftp или что-то еще), а CENTRAL post-update script будет терпеть неудачу, так как конфликты слияния/перезаписывания будут возникать. Невозможно избежать этого сценария, и это неизбежно.
Я бы хотел, чтобы это произошло: я хочу, чтобы вытащить из живых и тестовых сайтов, чтобы всегда переписывать/сжимать при нажатии. Всегда. Эти репозитории будут доступны только для загрузки, поскольку они не предназначены для разработки.
Во всех моих исследованиях я не могу найти хорошее решение, чтобы заставить pull всегда заставлять перезаписывать локальные файлы. Это вообще возможно? Если это так, это создаст отличный сценарий развития.
Ответы
Ответ 1
Действительно, идеальный способ сделать это - вообще не использовать pull
, а вместо этого fetch
и reset
:
git fetch origin master
git reset --hard FETCH_HEAD
git clean -df
(Изменение master
для любой ветки, которой вы хотите следовать.)
pull
сконструирован вокруг слияния изменений в некотором роде, тогда как reset
предназначен только для того, чтобы ваша локальная копия соответствовала конкретной фиксации.
Возможно, вы захотите рассмотреть несколько разные варианты clean
в зависимости от потребностей вашей системы.
Ответ 2
Вы можете попробовать следующее:
git reset --hard HEAD
git pull
(from Как заставить "git pull" для перезаписывания локальных файлов?)
Еще одна идея - удалить весь git и сделать новый клон.
Ответ 3
Я не уверен, как это сделать в одной команде, но вы можете сделать что-то вроде:
git reset --hard
git pull
или даже
git stash
git pull
Ответ 4
Вы можете изменить крюк, чтобы стереть все.
# Danger! Wipes local data!
# Remove all local changes to tracked files
git reset --hard HEAD
# Remove all untracked files and directories
git clean -dfx
git pull ...
Ответ 5
Чтобы вытащить копию ветки и принудительно перезаписать локальные файлы из используемого источника:
git reset --hard origin/current_branch
Вся текущая работа будет потеряна, и тогда она будет такой же, как ветвь происхождения
Ответ 6
git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch
Ответ 7
Если вы еще не зафиксировали локальные изменения со времени последнего pull/clone, вы можете использовать:
git checkout *
git pull
checkout
очистит ваши локальные изменения с помощью последнего локального коммита и
pull
преобразует его в удаленный репозиторий