Оформить заказ Git-файлов за пределами хранилища
Можно ли "оформить заказ" в месте за пределами хранилища? Я имею в виду клон ветки без каталога ".git".
Например: используйте git для управления сайтом. Вы редактируете некоторые файлы, фиксируете и копируете файлы на веб-сервер через WebDAV. WebDAV-путь - это расположение вне хранилища, которое не должно содержать ".git".
Это может не быть проблемой для которой был собран git, но возможно ли это?
3 ответа
Да, это, конечно, возможно.
Допустим, у меня есть голое хранилище с именем /srv/production.git
на целевой системе / сервере.
В системе назначения я могу использовать команду cd /srv/production.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
Если я нахожусь в не пустом хранилище, команда немного отличается. Допустим, у меня есть не голый репозиторий на /srv/testing
, Чтобы оформить заказ, я бы использовал cd /srv/testing/.git; GIT_WORK_TREE=/srv/production-www/ git checkout -f
На самом деле в моей системе я даже автоматизирую это с помощью пост-коммита production.git
репозиторий. Поэтому, когда вы нажимаете на production.git
последняя версия автоматически проверяется в корне сети.
#!/bin/sh
#
# An example hook script that is called after a successful
# commit is made.
#
# To enable this hook, rename this file to "post-commit".
GIT_WORK_TREE=/srv/production-www/ git checkout -f
# ... misc other commands to verify permissions are set correctly.
Если ваш единственный доступ к удаленной системе - это webdav, то, безусловно, должна быть возможность написать ловушку после фиксации, которая будет извлекать данные на хосте webdav, либо напрямую, либо во временное местоположение, которое затем можно будет сценарий загрузки.
Если вы просто хотите файлы, вы можете использовать git archive
, Обычно он записывает в архив, такой как tarballs или ZIP, но вы также можете передать его:
git archive master | tar -x -C /some/path
Вот, master
очевидно, это ветка, которую вы хотите архивировать, и /some/path
будет содержать только файлы - нет .git
или же .gitignore
,
Или вы можете использовать git checkout-index
которая больше похожа на "извлечение" файлов:
git checkout-index -f -a --prefix=/some/path/
Здесь -a
вариант говорит git
проверить все файлы. Префикс будет добавлен к выводу. Кто-то также написал обертку вокруг этого, чтобы дать git export
,
Начиная с Git 1.8.5, вы можете использовать
-C <path>
вариант, чтобы работать так, как если бы git был запущен в<path>
, вместо текущего рабочего каталога.
В старых версиях Git используйте
--work-tree
вариант. Например::
repo_url=https://github.com/owner/project.git
repo_dir=$(basename $repo_url .git)
git clone $repo_url
git --work-tree=$repo_dir checkout $branch