Оформить заказ Git-файлов за пределами хранилища

21

Можно ли «оформить заказ» в месте за пределами хранилища? Я имею в виду клон ветки без каталога «.git».

Например: используйте git для управления сайтом. Вы редактируете некоторые файлы, фиксируете и копируете файлы на веб-сервер через WebDAV. WebDAV-путь - это расположение вне хранилища, которое не должно содержать «.git».

Это может не быть проблемой для которой был собран git, но возможно ли это?

user240826
источник

Ответы:

19

Да, это, конечно, возможно.

Допустим, у меня есть пустой репозиторий, названный /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, либо напрямую, либо во временное местоположение, которое затем вы можете написать в сценарии загрузки.

Zoredache
источник
искал в нескольких местах .. только рабочий раствор, тоже чистый!
Картикеян
6

Если вы просто хотите файлы, вы можете использовать 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.

slhck
источник
2
Я думаю, что вы делаете это сложнее, чем нужно. Просто запустите, GIT_WORK_TREE=/destinationpath git checkout -fкогда ваш текущий каталог находится в верхней части чистого репозитория или подкаталога .git. Вы получите заказ в / destinationpath
Zoredache
Хорошо, я, должно быть, как-то пропустил этот вариант, +1 к тебе.
Slhck
1
Я считаю этот вариант более интуитивным, если честно. И менее подвержен ошибкам.
Minix