git checkout -f
Есть другой способ сделать это, отделив репо от рабочего дерева.
Этот метод полезен, если вам нужно регулярно обновлять эти файлы git без git. Например, я использую его, когда мне нужно проверить исходные файлы и создать артефакт, затем скопировать артефакт в другое репо только для развертывания на сервере, а также я использую его при отправке исходного кода на сервер, когда мне нужно исходный код для проверки и встраивания в каталог www.
Мы сделаем две папки, одну для git и одну для рабочих файлов:
mkdir workingfiles
mkdir barerepo.git
инициализировать чистый репозиторий git:
cd barerepo.git
git --bare init
Затем создайте перехватчик post-receive:
touch hooks/post-receive
chmod ug+x hooks/post-receive
Отредактируйте пост-прием в своем любимом редакторе:
GIT_WORK_TREE=/path/to/workingfiles git checkout -f
# optional stuff:
cd down/to/some/directory
[do some stuff]
Добавьте это как пульт:
git remote add myserver ssh://user@host:/path/to/barerepo.git
Теперь каждый раз, когда вы нажимаете на это голое репо, он проверяет рабочее дерево /workingfiles/. Но /workingfiles/сам по себе не находится под контролем версий; работает git statusв /workingfiles/выдаст ошибку fatal: Not a git repository (or any parent up to mount point /data). Это просто файлы.
В отличие от других решений, rm -r .gitкоманда не нужна, поэтому, если /workingfiles/есть другое репозиторий git, вам не нужно беспокоиться о том, что команда, используемая для удаления других файлов git репо.