Как заставить git pull перезаписывать все при каждом нажатии? - PullRequest
188 голосов
/ 06 марта 2012

У меня есть CENTRAL голое хранилище, в котором есть три репозитория разработчика, которые тянут и толкают к нему нормально.

У меня также есть два других репозитория, которые извлекают данные из открытого репозитория CENTRAL: один - это живой сервер, а другой - сервер тестирования / стадии - каждый из них извлекает из своей соответствующей ветви.

Сценарий таков: у меня есть репозиторий post-update в репозитории CENTRAL, который автоматически обращается к тестовым и живым репо и запускает команду pull для каждого из них. Это обновляет как тестовые, так и живые серверы, все в зависимости от того, какая ветвь имеет новые коммиты. Все это прекрасно работает.

Проблема заключается в следующем: в чрезвычайной ситуации могут возникать ситуации, когда файлы могут обновляться напрямую на сервере (через ftp или любой другой), и сценарий CENTRAL после обновления завершается сбоем, поскольку возникают конфликты слияния / перезаписи. Этого сценария избежать невозможно, и он неизбежен.

Я хотел бы, чтобы это произошло так: я хочу, чтобы выгрузка с живых и тестовых сайтов на всегда перезаписывала / объединяла при извлечении. Всегда. Эти репозитории будут доступны только для извлечения, поскольку они не предназначены для разработки.

Во всех моих исследованиях я не могу найти хорошее решение, чтобы тянуть всегда принудительно перезаписывать локальные файлы. Это вообще возможно? Если бы это было так, это послужило бы отличным сценарием развития.

Ответы [ 7 ]

467 голосов
/ 06 марта 2012

Действительно идеальный способ сделать это - вообще не использовать pull, а вместо этого fetch и reset:

git fetch origin master
git reset --hard FETCH_HEAD
git clean -df

(Изменение master на любую ветку, за которой вы хотите следовать.)

pull предназначен для объединения изменений каким-либо образом, тогда как reset разработан для того, чтобы ваша локальная копия соответствовала определенному коммиту.

Возможно, вы захотите рассмотреть несколько другие варианты clean в зависимости от потребностей вашей системы.

20 голосов
/ 06 марта 2012

Вы можете попробовать это:

git reset --hard HEAD
git pull

(из Как заставить "git pull" перезаписывать локальные файлы? )

Другой идеей было быудалите весь git и создайте новый клон.

6 голосов
/ 06 марта 2012

Я не уверен, как это сделать одной командой, но вы можете сделать что-то вроде:

git reset --hard
git pull

или даже

git stash
git pull
5 голосов
/ 23 декабря 2016
git reset --hard HEAD
git fetch --all
git reset --hard origin/your_branch
5 голосов
/ 22 марта 2016

Чтобы извлечь копию ветви и принудительно перезаписать локальные файлы из исходного использования:

git reset --hard origin/current_branch

Вся текущая работа будет потеряна, а затем будет такой же, какисходная ветвь

2 голосов
/ 22 августа 2016

Если вы еще не зафиксировали локальные изменения со времени последнего извлечения / клонирования, вы можете использовать:

git checkout *
git pull

checkout очистит ваши локальные изменения с последней локальной фиксацией и pull преобразует его в удаленный репозиторий

2 голосов
/ 06 марта 2012

Вы можете поменять крючок, чтобы вытереть все.

# 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 ...
...