Как заставить 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 в зависимости от потребностей вашей системы.

Ответ 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 преобразует его в удаленный репозиторий